Re: [PATCH v2] btrfs: replace BUG_ON() in btrfs_csum_one_bio() with proper error handling
From: Nikolay Borisov <hidden>
Date: 2021-08-17 08:03:58
On 17.08.21 г. 10:55, Nikolay Borisov wrote:
On 17.08.21 г. 2:55, Qu Wenruo wrote:quoted
There is a BUG_ON() in btrfs_csum_one_bio() to catch code logic error. It has indeed caught several bugs during subpage development. But the BUG_ON() itself will bring down the whole system which is sometimes overkilled. Replace it with a WARN() and exit gracefully, so that it won't crash the whole system while we can still catch the code logic error. Signed-off-by: Qu Wenruo <redacted> --- Changelog: v2: - Re-send as an independent patch - Add WARN() to catch the code logic error --- fs/btrfs/file-item.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index 2673c6ba7a4e..7f58d80a480f 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c@@ -665,7 +665,18 @@ blk_status_t btrfs_csum_one_bio(struct btrfs_inode *inode, struct bio *bio, if (!ordered) { ordered = btrfs_lookup_ordered_extent(inode, offset); - BUG_ON(!ordered); /* Logic error */ + /* + * The bio range is not covered by any ordered extent, + * must be a code logic error. + */ + if (unlikely(!ordered)) { + WARN(1, KERN_WARNING + "no ordered extent for root %llu ino %llu offset %llu\n", + inode->root->root_key.objectid, + btrfs_ino(inode), offset); + kvfree(sums); + return BLK_STS_IOERR; + }nit: How about : if (WARN_ON(!ordered) { btrfs_err(foo) } That way you get the unlikely(!ordered) 'for free' and the code is somewhat cleaner IMO. While at it I also have to say the structure of the inner loop is rather iffy, because it's really if/else with an implicit 'else'. How about converting it to https://paste.ubuntu.com/p/kyWsRrkzWq/
This actually won't work since we need the in_range code to be executed after we've done the adjustments to variables in the 'else' part...
quoted
} nr_sectors = BTRFS_BYTES_TO_BLKS(fs_info,