summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/scrub.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
index 572306036477..6702896cdb8f 100644
--- a/fs/btrfs/scrub.c
+++ b/fs/btrfs/scrub.c
@@ -1151,11 +1151,6 @@ static int scrub_handle_errored_block(struct scrub_block *sblock_to_check)
1151 return ret; 1151 return ret;
1152 } 1152 }
1153 1153
1154 if (sctx->is_dev_replace && !is_metadata && !have_csum) {
1155 sblocks_for_recheck = NULL;
1156 goto nodatasum_case;
1157 }
1158
1159 /* 1154 /*
1160 * read all mirrors one after the other. This includes to 1155 * read all mirrors one after the other. This includes to
1161 * re-read the extent or metadata block that failed (that was 1156 * re-read the extent or metadata block that failed (that was
@@ -1268,13 +1263,19 @@ static int scrub_handle_errored_block(struct scrub_block *sblock_to_check)
1268 goto out; 1263 goto out;
1269 } 1264 }
1270 1265
1271 if (!is_metadata && !have_csum) { 1266 /*
1267 * NOTE: Even for nodatasum case, it's still possible that it's a
1268 * compressed data extent, thus scrub_fixup_nodatasum(), which write
1269 * inode page cache onto disk, could cause serious data corruption.
1270 *
1271 * So here we could only read from disk, and hope our recovery could
1272 * reach disk before the newer write.
1273 */
1274 if (0 && !is_metadata && !have_csum) {
1272 struct scrub_fixup_nodatasum *fixup_nodatasum; 1275 struct scrub_fixup_nodatasum *fixup_nodatasum;
1273 1276
1274 WARN_ON(sctx->is_dev_replace); 1277 WARN_ON(sctx->is_dev_replace);
1275 1278
1276nodatasum_case:
1277
1278 /* 1279 /*
1279 * !is_metadata and !have_csum, this means that the data 1280 * !is_metadata and !have_csum, this means that the data
1280 * might not be COWed, that it might be modified 1281 * might not be COWed, that it might be modified