btrfs: don't do repair validation for checksum errors
authorOmar Sandoval <osandov@fb.com>
Thu, 16 Apr 2020 21:46:15 +0000 (14:46 -0700)
committerDavid Sterba <dsterba@suse.com>
Mon, 25 May 2020 09:25:25 +0000 (11:25 +0200)
The purpose of the validation step is to distinguish between good and
bad sectors in a failed multi-sector read. If a multi-sector read
succeeded but some of those sectors had checksum errors, we don't need
to validate anything; we know the sectors with bad checksums need to be
repaired.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent_io.c

index fcf2ff9..cf24b28 100644 (file)
@@ -2641,6 +2641,14 @@ static bool btrfs_io_needs_validation(struct inode *inode, struct bio *bio)
        int i;
 
        /*
+        * If bi_status is BLK_STS_OK, then this was a checksum error, not an
+        * I/O error. In this case, we already know exactly which sector was
+        * bad, so we don't need to validate.
+        */
+       if (bio->bi_status == BLK_STS_OK)
+               return false;
+
+       /*
         * We need to validate each sector individually if the failed I/O was
         * for multiple sectors.
         */