[dm-devel] [PATCH 3/3] block: fail writes to read-only devices
Christoph Hellwig
hch at lst.de
Thu Jun 1 07:28:29 UTC 2023
Currently callers can happily submit writes to block devices that are
marked read-only, including to drivers that don't even support writes
and will crash when fed such bios.
While bio submitter should check for read-only devices, that's not a
very robust way of dealing with this.
Note that the last attempt to do this got reverted by Linus in commit
a32e236eb93e ("Partially revert "block: fail op_is_write() requests to
read-only partitions") because device mapper relyied on not enforcing
the read-only state when used together with older lvm-tools.
The lvm side got fixed in:
https://sourceware.org/git/?p=lvm2.git;a=commit;h=a6fdb9d9d70f51c49ad11a87ab4243344e6701a3
but if people still have older lvm2 tools in use we probably need
to find a workaround for this in device mapper rather than lacking
the core block layer checks.
Signed-off-by: Christoph Hellwig <hch at lst.de>
---
block/blk-core.c | 19 ++++++++-----------
1 file changed, 8 insertions(+), 11 deletions(-)
diff --git a/block/blk-core.c b/block/blk-core.c
index 4ba243968e41eb..ef41816bd0eade 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -492,16 +492,6 @@ static int __init fail_make_request_debugfs(void)
late_initcall(fail_make_request_debugfs);
#endif /* CONFIG_FAIL_MAKE_REQUEST */
-static inline void bio_check_ro(struct bio *bio)
-{
- if (op_is_write(bio_op(bio)) && bio_sectors(bio) &&
- bdev_read_only(bio->bi_bdev)) {
- pr_warn("Trying to write to read-only block-device %pg\n",
- bio->bi_bdev);
- /* Older lvm-tools actually trigger this */
- }
-}
-
static noinline int should_fail_bio(struct bio *bio)
{
if (should_fail_request(bdev_whole(bio->bi_bdev), bio->bi_iter.bi_size))
@@ -735,7 +725,14 @@ void submit_bio_noacct(struct bio *bio)
if (should_fail_bio(bio))
goto end_io;
- bio_check_ro(bio);
+
+ if (op_is_write(bio_op(bio)) && bio_sectors(bio) &&
+ bdev_read_only(bdev)) {
+ pr_warn("Trying to write to read-only block-device %pg\n",
+ bdev);
+ goto end_io;
+ }
+
if (!bio_flagged(bio, BIO_REMAPPED)) {
if (unlikely(bio_check_eod(bio)))
goto end_io;
--
2.39.2
More information about the dm-devel
mailing list