btrfs: do not try to repair bio that has no mirror set
If we fail to submit a bio for whatever reason, we may not have setup a mirror_num for that bio. This means we shouldn't try to do the repair workflow, if we do we'll hit an BUG_ON(!failrec->this_mirror) in clean_io_failure. Instead simply skip the repair workflow if we have no mirror set, and add an assert to btrfs_check_repairable() to make it easier to catch what is happening in the future. Reviewed-by: Boris Burkov <boris@bur.io> Signed-off-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
f9f15de85d
commit
510671d2d8
|
@ -2610,6 +2610,7 @@ static bool btrfs_check_repairable(struct inode *inode,
|
|||
* a good copy of the failed sector and if we succeed, we have setup
|
||||
* everything for repair_io_failure to do the rest for us.
|
||||
*/
|
||||
ASSERT(failed_mirror);
|
||||
failrec->failed_mirror = failed_mirror;
|
||||
failrec->this_mirror++;
|
||||
if (failrec->this_mirror == failed_mirror)
|
||||
|
@ -3067,6 +3068,14 @@ static void end_bio_extent_readpage(struct bio *bio)
|
|||
goto readpage_ok;
|
||||
|
||||
if (is_data_inode(inode)) {
|
||||
/*
|
||||
* If we failed to submit the IO at all we'll have a
|
||||
* mirror_num == 0, in which case we need to just mark
|
||||
* the page with an error and unlock it and carry on.
|
||||
*/
|
||||
if (mirror == 0)
|
||||
goto readpage_ok;
|
||||
|
||||
/*
|
||||
* btrfs_submit_read_repair() will handle all the good
|
||||
* and bad sectors, we just continue to the next bvec.
|
||||
|
|
Loading…
Reference in New Issue