diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index f0646fb24371..8676b3bc463b 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1692,11 +1692,34 @@ static bool raid1_make_request(struct mddev *mddev, struct bio *bio) if (bio_data_dir(bio) == READ) raid1_read_request(mddev, bio, sectors, NULL); else { + int err; + md_write_start(mddev, bio); - if (!raid1_write_request(mddev, bio, sectors)) + err = mddev_lock(mddev); + + if (err < 0) { + md_write_end(mddev); + goto done; + } + + if (!mddev->private) { + mddev_unlock(mddev); + md_write_end(mddev); + goto done; + } + + err = raid1_write_request(mddev, bio, sectors); + mddev_unlock(mddev); + + if (!err) md_write_end(mddev); } +out: return true; +done: + bio->bi_status = BLK_STS_OFFLINE; + bio_endio(bio); + goto out; } static void raid1_status(struct seq_file *seq, struct mddev *mddev)