>From 82b7dd41eb447e9fdd3d7c5d5e3a002a9f284d82 Mon Sep 17 00:00:00 2001 From: Ye Bin Date: Wed, 9 Aug 2023 16:11:39 +0800 Subject: [PATCH] block: only print warning once when write to readonly bdev After commit 57e95e4670d1 there will print warning unconditionally.As a result, alarm logs are flooded. To solve above issue, introduce GD_ROWR_WARNED state for every partition to record if warning has been printed. Fixes: 57e95e4670d1 ("block: fix and cleanup bio_check_ro") Signed-off-by: Ye Bin --- block/blk-core.c | 3 +++ block/genhd.c | 1 + block/ioctl.c | 6 +++++- include/linux/blkdev.h | 1 + 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/block/blk-core.c b/block/blk-core.c index 9d51e9894ece..69d9757a013a 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -501,6 +501,9 @@ static inline void bio_check_ro(struct bio *bio) if (op_is_write(bio_op(bio)) && bdev_read_only(bio->bi_bdev)) { if (op_is_flush(bio->bi_opf) && !bio_sectors(bio)) return; + if (test_and_set_bit(GD_ROWR_WARNED, + &bio->bi_bdev->bd_disk->state)) + return; pr_warn("Trying to write to read-only block-device %pg\n", bio->bi_bdev); /* Older lvm-tools actually trigger this */ diff --git a/block/genhd.c b/block/genhd.c index c9d06f72c587..c05d2cd4a87b 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -1455,6 +1455,7 @@ void set_disk_ro(struct gendisk *disk, bool read_only) if (!test_and_clear_bit(GD_READ_ONLY, &disk->state)) return; } + clear_bit(GD_ROWR_WARNED, &disk->state); set_disk_ro_uevent(disk, read_only); } EXPORT_SYMBOL(set_disk_ro); diff --git a/block/ioctl.c b/block/ioctl.c index 4160f4e6bd5b..a2158c5e8e3e 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -394,7 +394,11 @@ static int blkdev_roset(struct block_device *bdev, unsigned cmd, if (ret) return ret; } - bdev->bd_read_only = n; + if (!bdev->bd_read_only != !n) { + bdev->bd_read_only = n; + clear_bit(GD_ROWR_WARNED, &bdev->bd_disk->state); + } + return 0; } diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 51fa7ffdee83..832f7f81e46c 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -157,6 +157,7 @@ struct gendisk { #define GD_ADDED 4 #define GD_SUPPRESS_PART_SCAN 5 #define GD_OWNS_QUEUE 6 +#define GD_ROWR_WARNED 7 struct mutex open_mutex; /* open/close mutex */ unsigned open_partitions; /* number of open partitions */ -- 2.31.1