From: Boris Burkov Date: Mon, 6 Apr 2026 16:15:15 +0000 (-0700) Subject: btrfs: btrfs_log_dev_io_error() on all bio errors X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fc3d53288158d68444eed059adb734709b855bbf;p=thirdparty%2Flinux.git btrfs: btrfs_log_dev_io_error() on all bio errors As far as I can tell, we never intentionally constrained ourselves to these status codes, and it is misleading and surprising to lack the bdev error logging when we get a different error code from the block layer. This can lead to jumping to a wrong conclusion like "this system didn't see any bio failures but aborted with EIO". For example on nvme devices, I observe many failures coming back as BLK_STS_MEDIUM. It is apparent that the nvme driver returns a variety of BLK_STS_* status values in nvme_error_status(). So handle the known expected errors and make some noise on the rest which we expect won't really happen. Reviewed-by: Christoph Hellwig Reviewed-by: Anand Jain Signed-off-by: Boris Burkov Signed-off-by: David Sterba --- diff --git a/fs/btrfs/bio.c b/fs/btrfs/bio.c index 2a2a21aec817..cc0bd03048ba 100644 --- a/fs/btrfs/bio.c +++ b/fs/btrfs/bio.c @@ -4,6 +4,7 @@ * Copyright (C) 2022 Christoph Hellwig. */ +#include #include #include "bio.h" #include "ctree.h" @@ -350,11 +351,18 @@ static void btrfs_check_read_bio(struct btrfs_bio *bbio, struct btrfs_device *de static void btrfs_log_dev_io_error(const struct bio *bio, struct btrfs_device *dev) { + blk_status_t sts = bio->bi_status; + if (!dev || !dev->bdev) return; - if (bio->bi_status != BLK_STS_IOERR && bio->bi_status != BLK_STS_TARGET) + if (unlikely(sts == BLK_STS_OK)) return; - + if (unlikely(sts != BLK_STS_IOERR && sts != BLK_STS_TARGET && + sts != BLK_STS_MEDIUM && sts != BLK_STS_PROTECTION)) { + btrfs_warn_rl(dev->fs_info, "bdev %s unexpected block io error: %d", + btrfs_dev_name(dev), sts); + return; + } if (btrfs_op(bio) == BTRFS_MAP_WRITE) btrfs_dev_stat_inc_and_print(dev, BTRFS_DEV_STAT_WRITE_ERRS); else if (!(bio->bi_opf & REQ_RAHEAD))