]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: add procession of SEEK_HOLE and SEEK_DATA in lseek. 30918/head
authorshenhang <shenhang@kuaishou.com>
Tue, 17 Sep 2019 02:55:21 +0000 (10:55 +0800)
committerNathan Cutler <ncutler@suse.com>
Mon, 14 Oct 2019 21:19:01 +0000 (23:19 +0200)
Fixes: https://tracker.ceph.com/issues/42107
Signed-off-by: Shen Hang <harryshen18@gmail.com>
(cherry picked from commit 394720ca6b731e4698f1dbc7896d294363ecb466)

src/client/Client.cc

index 35642d2f878758f266919d32b8e310ec2a7cbd30..02ae65ebf14f26641dfcf58c07c685175c8cf5ec 100644 (file)
@@ -8671,6 +8671,13 @@ loff_t Client::_lseek(Fh *f, loff_t offset, int whence)
   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;
@@ -8681,12 +8688,26 @@ loff_t Client::_lseek(Fh *f, loff_t offset, int whence)
     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();
   }