btrfs: do not double complete bio on errors during compressed reads
I hit some weird panics while fixing up the error handling from btrfs_lookup_bio_sums(). Turns out the compression path will complete the bio we use if we set up any of the compression bios and then return an error, and then btrfs_submit_data_bio() will also call bio_endio() on the bio. Fix this by making btrfs_submit_compressed_read() responsible for calling bio_endio() on the bio if there are any errors. Currently it was only doing it if we created the compression bios, otherwise it was depending on btrfs_submit_data_bio() to do the right thing. This creates the above problem, so fix up btrfs_submit_compressed_read() to always call bio_endio() in case of an error, and then simply return from btrfs_submit_data_bio() if we had to call btrfs_submit_compressed_read(). Signed-off-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
committed by
David Sterba
parent
606f82e797
commit
f9f15de85d
@@ -2543,10 +2543,15 @@ blk_status_t btrfs_submit_data_bio(struct inode *inode, struct bio *bio,
|
||||
goto out;
|
||||
|
||||
if (bio_flags & EXTENT_BIO_COMPRESSED) {
|
||||
/*
|
||||
* btrfs_submit_compressed_read will handle completing
|
||||
* the bio if there were any errors, so just return
|
||||
* here.
|
||||
*/
|
||||
ret = btrfs_submit_compressed_read(inode, bio,
|
||||
mirror_num,
|
||||
bio_flags);
|
||||
goto out;
|
||||
goto out_no_endio;
|
||||
} else {
|
||||
/*
|
||||
* Lookup bio sums does extra checks around whether we
|
||||
@@ -2580,6 +2585,7 @@ out:
|
||||
bio->bi_status = ret;
|
||||
bio_endio(bio);
|
||||
}
|
||||
out_no_endio:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user