diff mbox series

btrfs: don't BUG_ON on allocation failure in btrfs_csum_one_bio

Message ID 20230504115813.15424-1-johannes.thumshirn@wdc.com (mailing list archive)
State New, archived
Headers show
Series btrfs: don't BUG_ON on allocation failure in btrfs_csum_one_bio | expand

Commit Message

Johannes Thumshirn May 4, 2023, 11:58 a.m. UTC
Since f8a53bb58ec7 ("btrfs: handle checksum generation in the storage
layer") the failures of btrfs_csum_one_bio() are handled via
bio_end_io().

This means, we can return BLK_STS_RESOURCE from btrfs_csum_one_bio() in
case the allocation of the ordered sums fails.

This also fixes a syzkaller report, where injecting a failure into the
kvzalloc() call results in a BUG_ON().

Reported-by: syzbot+d8941552e21eac774778@syzkaller.appspotmail.com
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
 fs/btrfs/file-item.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Christoph Hellwig May 4, 2023, 2:03 p.m. UTC | #1
On Thu, May 04, 2023 at 01:58:13PM +0200, Johannes Thumshirn wrote:
> Since f8a53bb58ec7 ("btrfs: handle checksum generation in the storage
> layer") the failures of btrfs_csum_one_bio() are handled via
> bio_end_io().
> 
> This means, we can return BLK_STS_RESOURCE from btrfs_csum_one_bio() in
> case the allocation of the ordered sums fails.
> 
> This also fixes a syzkaller report, where injecting a failure into the
> kvzalloc() call results in a BUG_ON().

Not BUG()ing here is an obvious improvement, so:

Reviewed-by: Christoph Hellwig <hch@lst.de>

But if this allocation can actually fail, this just means this failure
now means writeback under memory pressure can't make progress and the
inode is now toast.  So we really need to look into something like a
mempool here in the longer run.
Anand Jain May 5, 2023, 6:26 a.m. UTC | #2
LGTM.
Reviewed-by: Anand Jain <anand.jain@oracle.com>
David Sterba May 10, 2023, 1:05 p.m. UTC | #3
On Thu, May 04, 2023 at 01:58:13PM +0200, Johannes Thumshirn wrote:
> Since f8a53bb58ec7 ("btrfs: handle checksum generation in the storage
> layer") the failures of btrfs_csum_one_bio() are handled via
> bio_end_io().
> 
> This means, we can return BLK_STS_RESOURCE from btrfs_csum_one_bio() in
> case the allocation of the ordered sums fails.
> 
> This also fixes a syzkaller report, where injecting a failure into the
> kvzalloc() call results in a BUG_ON().
> 
> Reported-by: syzbot+d8941552e21eac774778@syzkaller.appspotmail.com
> Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>

Added to misc-next, thanks.
diff mbox series

Patch

diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c
index bda1a4109160..e74b9804bcde 100644
--- a/fs/btrfs/file-item.c
+++ b/fs/btrfs/file-item.c
@@ -792,7 +792,9 @@  blk_status_t btrfs_csum_one_bio(struct btrfs_bio *bbio)
 				sums = kvzalloc(btrfs_ordered_sum_size(fs_info,
 						      bytes_left), GFP_KERNEL);
 				memalloc_nofs_restore(nofs_flag);
-				BUG_ON(!sums); /* -ENOMEM */
+				if (!sums)
+					return BLK_STS_RESOURCE;
+
 				sums->len = bytes_left;
 				ordered = btrfs_lookup_ordered_extent(inode,
 								offset);