btrfs: do not double complete bio on errors during compressed reads
authorJosef Bacik <josef@toxicpanda.com>
Fri, 18 Feb 2022 15:03:27 +0000 (10:03 -0500)
committerDavid Sterba <dsterba@suse.com>
Mon, 28 Feb 2022 15:20:03 +0000 (16:20 +0100)
commit4a39c8c0ec7790f3e52ce4af869bef931443687c
tree12f120f16661b74e098ac1c7cfe37147b5b76fa0
parentefaa3b219b963932bc6d40570c7973e3606486ec
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>
fs/btrfs/compression.c
fs/btrfs/inode.c