89 lines
3.2 KiB
Diff
89 lines
3.2 KiB
Diff
From: Linus Torvalds <torvalds@linux-foundation.org>
|
|
Date: Fri, 3 Aug 2018 12:22:09 -0700
|
|
Subject: Partially revert "block: fail op_is_write() requests to read-only
|
|
partitions"
|
|
Origin: https://git.kernel.org/linus/a32e236eb93e62a0f692e79b7c3c9636689559b9
|
|
Bug-Debian: https://bugs.debian.org/900442
|
|
Bug: https://bugzilla.kernel.org/show_bug.cgi?id=200439
|
|
|
|
It turns out that commit 721c7fc701c7 ("block: fail op_is_write()
|
|
requests to read-only partitions"), while obviously correct, causes
|
|
problems for some older lvm2 installations.
|
|
|
|
The reason is that the lvm snapshotting will continue to write to the
|
|
snapshow COW volume, even after the volume has been marked read-only.
|
|
End result: snapshot failure.
|
|
|
|
This has actually been fixed in newer version of the lvm2 tool, but the
|
|
old tools still exist, and the breakage was reported both in the kernel
|
|
bugzilla and in the Debian bugzilla:
|
|
|
|
https://bugzilla.kernel.org/show_bug.cgi?id=200439
|
|
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=900442
|
|
|
|
The lvm2 fix is here
|
|
|
|
https://sourceware.org/git/?p=lvm2.git;a=commit;h=a6fdb9d9d70f51c49ad11a87ab4243344e6701a3
|
|
|
|
but until everybody has updated to recent versions, we'll have to weaken
|
|
the "never write to read-only partitions" check. It now allows the
|
|
write to happen, but causes a warning, something like this:
|
|
|
|
generic_make_request: Trying to write to read-only block-device dm-3 (partno X)
|
|
Modules linked in: nf_tables xt_cgroup xt_owner kvm_intel iwlmvm kvm irqbypass iwlwifi
|
|
CPU: 1 PID: 77 Comm: kworker/1:1 Not tainted 4.17.9-gentoo #3
|
|
Hardware name: LENOVO 20B6A019RT/20B6A019RT, BIOS GJET91WW (2.41 ) 09/21/2016
|
|
Workqueue: ksnaphd do_metadata
|
|
RIP: 0010:generic_make_request_checks+0x4ac/0x600
|
|
...
|
|
Call Trace:
|
|
generic_make_request+0x64/0x400
|
|
submit_bio+0x6c/0x140
|
|
dispatch_io+0x287/0x430
|
|
sync_io+0xc3/0x120
|
|
dm_io+0x1f8/0x220
|
|
do_metadata+0x1d/0x30
|
|
process_one_work+0x1b9/0x3e0
|
|
worker_thread+0x2b/0x3c0
|
|
kthread+0x113/0x130
|
|
ret_from_fork+0x35/0x40
|
|
|
|
Note that this is a "revert" in behavior only. I'm leaving alone the
|
|
actual code cleanups in commit 721c7fc701c7, but letting the previously
|
|
uncaught request go through with a warning instead of stopping it.
|
|
|
|
Fixes: 721c7fc701c7 ("block: fail op_is_write() requests to read-only partitions")
|
|
Reported-and-tested-by: WGH <wgh@torlan.ru>
|
|
Acked-by: Mike Snitzer <snitzer@redhat.com>
|
|
Cc: Sagi Grimberg <sagi@grimberg.me>
|
|
Cc: Ilya Dryomov <idryomov@gmail.com>
|
|
Cc: Jens Axboe <axboe@kernel.dk>
|
|
Cc: Zdenek Kabelac <zkabelac@redhat.com>
|
|
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
|
---
|
|
block/blk-core.c | 5 +++--
|
|
1 file changed, 3 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/block/blk-core.c b/block/blk-core.c
|
|
index f84a9b7b6f5a..ee33590f54eb 100644
|
|
--- a/block/blk-core.c
|
|
+++ b/block/blk-core.c
|
|
@@ -2155,11 +2155,12 @@ static inline bool bio_check_ro(struct bio *bio, struct hd_struct *part)
|
|
if (part->policy && op_is_write(bio_op(bio))) {
|
|
char b[BDEVNAME_SIZE];
|
|
|
|
- printk(KERN_ERR
|
|
+ WARN_ONCE(1,
|
|
"generic_make_request: Trying to write "
|
|
"to read-only block-device %s (partno %d)\n",
|
|
bio_devname(bio, b), part->partno);
|
|
- return true;
|
|
+ /* Older lvm-tools actually trigger this */
|
|
+ return false;
|
|
}
|
|
|
|
return false;
|
|
--
|
|
2.18.0
|
|
|