Whamcloud - gitweb
e2fsck: do not discard itable if discard doen't zero data
authorLukas Czerner <lczerner@redhat.com>
Sun, 11 Mar 2012 19:36:45 +0000 (15:36 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 11 Mar 2012 19:38:40 +0000 (15:38 -0400)
We do not want to discard inode table if the underlying device does not
return zeros when reading non-provisioned blocks. The reason is that if
the inode table is not zeroed yet, then discard would not help us since
we would have to zero it anyway. In the case that inode table was
already zeroed, then the discard would cause subsequent reads to contain
non-deterministic data so we would not be able to assume that the inode
table was zeroed and we would need to zero it again, which does not
really make sense.

This commit adds check to prevent inode table from being discarded if
the discard does not zero data.

Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
e2fsck/pass5.c

index 6fd9ecc..148473c 100644 (file)
@@ -116,7 +116,18 @@ static void e2fsck_discard_inodes(e2fsck_t ctx, int group,
                ctx->options &= ~E2F_OPT_DISCARD;
        }
 
-       if (!(ctx->options & E2F_OPT_DISCARD))
+       /*
+        * Do not attempt to discard if E2F_OPT_DISCARD is not set. And also
+        * skip the discard on this group if discard does not zero data.
+        * The reason is that if the inode table is not zeroed discard would
+        * no help us since we need to zero it anyway, or if the inode table
+        * is zeroed then the read after discard would not be deterministic
+        * anyway and we would not be able to assume that this inode table
+        * was zeroed anymore so we would have to zero it again, which does
+        * not really make sense.
+        */
+       if (!(ctx->options & E2F_OPT_DISCARD) ||
+           !io_channel_discard_zeroes_data(fs->io))
                return;
 
        /*