Skip to content

Commit 0c9d5b1

Browse files
NeilBrownshligit
authored andcommitted
md/raid1: avoid reusing a resync bio after error handling.
fix_sync_read_error() modifies a bio on a newly faulty device by setting bi_end_io to end_sync_write. This ensure that put_buf() will still call rdev_dec_pending() as required, but makes sure that subsequent code in fix_sync_read_error() doesn't try to read from the device. Unfortunately this interacts badly with sync_request_write() which assumes that any bio with bi_end_io set to non-NULL other than end_sync_read is safe to write to. As the device is now faulty it doesn't make sense to write. As the bio was recently used for a read, it is "dirty" and not suitable for immediate submission. In particular, ->bi_next might be non-NULL, which will cause generic_make_request() to complain. Break this interaction by refusing to write to devices which are marked as Faulty. Reported-and-tested-by: Michael Wang <yun.wang@profitbricks.com> Fixes: 2e52d44 ("md/raid1: add failfast handling for reads.") Cc: stable@vger.kernel.org (v4.10+) Signed-off-by: NeilBrown <neilb@suse.com> Signed-off-by: Shaohua Li <shli@fb.com>
1 parent b670883 commit 0c9d5b1

File tree

1 file changed

+2
-0
lines changed

1 file changed

+2
-0
lines changed

drivers/md/raid1.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2218,6 +2218,8 @@ static void sync_request_write(struct mddev *mddev, struct r1bio *r1_bio)
22182218
(i == r1_bio->read_disk ||
22192219
!test_bit(MD_RECOVERY_SYNC, &mddev->recovery))))
22202220
continue;
2221+
if (test_bit(Faulty, &conf->mirrors[i].rdev->flags))
2222+
continue;
22212223

22222224
bio_set_op_attrs(wbio, REQ_OP_WRITE, 0);
22232225
if (test_bit(FailFast, &conf->mirrors[i].rdev->flags))

0 commit comments

Comments
 (0)