From 1b7b28f76db491bd55243846649d309fd98b7119 Mon Sep 17 00:00:00 2001 From: Dave Chinner Date: Thu, 2 Feb 2012 17:21:14 +1100 Subject: [PATCH] xfs_io: fix fiemap loop continuation When the fiemap command needs to retrieve more extents from the kernel via a subsequent IO, it calculates the next logical block to retrieve in file system block units. the fiemap needs the start offset in bytes, not filesystem blocks. Hence if the fiemap command can loop forever retrieving the same blocks if the logical offset offset of the next block in filesystem block units is smaller than the number of bytes in a filessytem block. i.e. it will just loop retreiving the first 32 extents from offset block zero. Signed-off-by: Dave Chinner Signed-off-by: Christoph Hellwig --- io/fiemap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/io/fiemap.c b/io/fiemap.c index 066e693f1..99296ddba 100644 --- a/io/fiemap.c +++ b/io/fiemap.c @@ -108,7 +108,7 @@ print_verbose( boff_w, bbuf, tot_w, len, flg_w, flgbuf); (*cur_extent)++; - *last_logical = lstart + len; + *last_logical = extent->fe_logical + extent->fe_length; } static void @@ -151,7 +151,7 @@ print_plain( else printf("\n"); (*cur_extent)++; - *last_logical = lstart + len; + *last_logical = extent->fe_logical + extent->fe_length; } int @@ -252,7 +252,7 @@ fiemap_f( memset(fiemap, 0, map_size); fiemap->fm_flags = fiemap_flags; fiemap->fm_start = last_logical; - fiemap->fm_length = -1; + fiemap->fm_length = -1LL; fiemap->fm_extent_count = num_extents; ret = ioctl(file->fd, FS_IOC_FIEMAP, (unsigned long)fiemap); -- 2.47.2