int r;
loff_t pos = -1;
+ if (whence == SEEK_END || whence == SEEK_DATA || whence == SEEK_HOLE) {
+ r = _getattr(in, CEPH_STAT_CAP_SIZE, f->actor_perms);
+ if (r < 0) {
+ return r;
+ }
+ }
+
switch (whence) {
case SEEK_SET:
pos = offset;
break;
case SEEK_END:
- r = _getattr(in, CEPH_STAT_CAP_SIZE, f->actor_perms);
- if (r < 0)
- return r;
pos = in->size + offset;
break;
+ case SEEK_DATA:
+ if (offset < 0 || offset >= in->size) {
+ r = -ENXIO;
+ return offset;
+ }
+ pos = offset;
+ break;
+
+ case SEEK_HOLE:
+ if (offset < 0 || offset >= in->size) {
+ r = -ENXIO;
+ pos = offset;
+ } else {
+ pos = in->size;
+ }
+ break;
+
default:
ceph_abort();
}