| From a32e236eb93e62a0f692e79b7c3c9636689559b9 Mon Sep 17 00:00:00 2001 |
| 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" |
| |
| From: Linus Torvalds <torvalds@linux-foundation.org> |
| |
| commit a32e236eb93e62a0f692e79b7c3c9636689559b9 upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| block/blk-core.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| --- a/block/blk-core.c |
| +++ b/block/blk-core.c |
| @@ -2174,11 +2174,12 @@ static inline bool bio_check_ro(struct b |
| 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; |