summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Czerner <lczerner@redhat.com>2012-03-11 15:36:45 -0400
committerTheodore Ts'o <tytso@mit.edu>2012-03-11 15:38:40 -0400
commitc15386cdeed2464736f46bf1b19ec80ba8812dbf (patch)
tree0e08b1069f800d587c0b966d7045a36ef943b60c
parentf0fe5daecdb0c88afb76c23c77494bbe86e1cd2b (diff)
downloade2fsprogs-c15386cdeed2464736f46bf1b19ec80ba8812dbf.tar.gz
e2fsck: do not discard itable if discard doen't zero data
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>
-rw-r--r--e2fsck/pass5.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/e2fsck/pass5.c b/e2fsck/pass5.c
index 6fd9ecc6..148473ce 100644
--- a/e2fsck/pass5.c
+++ b/e2fsck/pass5.c
@@ -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;
/*