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 |
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.
LGTM.
Reviewed-by: Anand Jain <anand.jain@oracle.com>
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 --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);
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(-)