From: Ning Yao Date: Thu, 13 Oct 2016 08:53:18 +0000 (+0800) Subject: FileStore:: fix fiemap issue in xfs when #extents > 1364 X-Git-Tag: v11.1.0~426^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1a1c126d80b427d5230347fbc71a4edea5c0b6c8;p=ceph.git FileStore:: fix fiemap issue in xfs when #extents > 1364 Signed-off-by: Ning Yao --- diff --git a/src/os/filestore/FileStore.cc b/src/os/filestore/FileStore.cc index 279caa41d524..4fe1a85ae2b3 100644 --- a/src/os/filestore/FileStore.cc +++ b/src/os/filestore/FileStore.cc @@ -3155,11 +3155,13 @@ int FileStore::read( int FileStore::_do_fiemap(int fd, uint64_t offset, size_t len, map *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; }