Whamcloud - gitweb
filefrag: count 0 extents properly when verbose
authorEric Sandeen <sandeen@redhat.com>
Thu, 5 May 2011 18:21:08 +0000 (13:21 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 7 May 2011 22:34:40 +0000 (18:34 -0400)
/boot/a: 0 extents found

works properly, but

Filesystem type is: ef53
Filesystem cylinder groups is approximately 61
File size of a is 0 (0 blocks, blocksize 1024)
 ext logical physical expected length flags
a: 1 extent found

yields 1 extent when it should be 0.

Fix this up by special-casing no extents returned in verbose
mode; skip printing the header for the columns too, since there
are no columns to print.

Also, in nonverbose mode we can set fm_extent_count to 0
so that FIEMAP will just query the extent count without gathering
details; clarify this with a comment.

Addresses-RedHat-Bugzilla: 653234
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
misc/filefrag.c

index 1770541..27f48ea 100644 (file)
@@ -181,6 +181,10 @@ static int filefrag_fiemap(int fd, int blk_shift, int *num_extents)
 
        memset(fiemap, 0, sizeof(struct fiemap));
 
+       /*
+        * If count (and therefore fm_extent_count) == 0, FIEMAP
+        * returns count of extents found without filling in details.
+        */
        if (!verbose)
                count = 0;
 
@@ -205,6 +209,14 @@ static int filefrag_fiemap(int fd, int blk_shift, int *num_extents)
                }
 
                if (verbose && !fiemap_header_printed) {
+                       /*
+                        * No extents on first call?
+                        * Skip header and show 0 extents.
+                        */
+                       if (fiemap->fm_mapped_extents == 0) {
+                               *num_extents = 0;
+                               goto out;
+                       }
                        printf(" ext %*s %*s %*s length flags\n", logical_width,
                               "logical", physical_width, "physical",
                               physical_width, "expected");