]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
FileStore:: fix fiemap issue in xfs when #extents > 1364
authorNing Yao <yaoning@unitedstack.com>
Thu, 13 Oct 2016 08:53:18 +0000 (16:53 +0800)
committeryaoning <yaoning@unitedstack.com>
Thu, 3 Nov 2016 18:15:58 +0000 (02:15 +0800)
Signed-off-by: Ning Yao <yaoning@unitedstack.com>
src/os/filestore/FileStore.cc

index 279caa41d5247212a36ed0a6f8387b09849fa91f..4fe1a85ae2b3c2f1f9b95be54d18a92f01dd8d00 100644 (file)
@@ -3155,11 +3155,13 @@ int FileStore::read(
 int FileStore::_do_fiemap(int fd, uint64_t offset, size_t len,
                           map<uint64_t, uint64_t> *m)
 {
-  struct fiemap *fiemap = NULL;
   uint64_t i;
   struct fiemap_extent *extent = NULL;
+  struct fiemap_extent *last = NULL;
+  struct fiemap *fiemap = NULL;
   int r = 0;
 
+more:
   r = backend->do_fiemap(fd, offset, len, &fiemap);
   if (r < 0)
     return r;
@@ -3199,9 +3201,15 @@ int FileStore::_do_fiemap(int fd, uint64_t offset, size_t len,
       extent->fe_length = offset + len - extent->fe_logical;
     (*m)[extent->fe_logical] = extent->fe_length;
     i++;
-    extent++;
+    last = extent++;
   }
   free(fiemap);
+  if (!(last->fe_flags & FIEMAP_EXTENT_LAST)) {
+    uint64_t xoffset = last->fe_logical + last->fe_length - offset;
+    offset = last->fe_logical + last->fe_length;
+    len -= xoffset;
+    goto more;
+  }
 
   return r;
 }