Re: [syzbot] general protection fault in _wait_barrier
From: Edward Adam Davis
Date: Fri Aug 28 2026 - 05:39:07 EST
From: Edward Aadm Davis <eadavis@xxxxxxxx>
#syz test: upstream 818bebeb63dd
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)