Patchwork [3.5.y.z,extended,stable] Patch "md: protect against crash upon fsync on ro array" has been added to staging queue

mail settings
Submitter Luis Henriques
Date March 6, 2013, 3:14 p.m.
Message ID <>
Download mbox | patch
Permalink /patch/225524/
State New
Headers show


Luis Henriques - March 6, 2013, 3:14 p.m.
This is a note to let you know that I have just added a patch titled

    md: protect against crash upon fsync on ro array

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see



From 7575be628a869e4bf9afd0b1e26cba0610edc3e8 Mon Sep 17 00:00:00 2001
From: Sebastian Riemer <>
Date: Thu, 21 Feb 2013 13:28:09 +1100
Subject: [PATCH] md: protect against crash upon fsync on ro array

commit bbfa57c0f2243a7c31fd248d22e9861a2802cad5 upstream.

If an fsync occurs on a read-only array, we need to send a
completion for the IO and may not increment the active IO count.
Otherwise, we hit a bug trace and can't stop the MD array anymore.

By advice of Christoph Hellwig we return success upon a flush
request but we return -EROFS for other writes.
We detect flush requests by checking if the bio has zero sectors.

This patch is suitable to any -stable kernel to which it applies.

Cc: Christoph Hellwig <>
Cc: Ben Hutchings <>
Cc: NeilBrown <>
Signed-off-by: Sebastian Riemer <>
Reported-by: Ben Hutchings <>
Acked-by: Paul Menzel <>
Signed-off-by: NeilBrown <>
Signed-off-by: Luis Henriques <>
 drivers/md/md.c | 4 ++++
 1 file changed, 4 insertions(+)



diff --git a/drivers/md/md.c b/drivers/md/md.c
index 97edf9e..b7a551d 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -344,6 +344,10 @@  static void md_make_request(struct request_queue *q, struct bio *bio)
+	if (mddev->ro == 1 && unlikely(rw == WRITE)) {
+		bio_endio(bio, bio_sectors(bio) == 0 ? 0 : -EROFS);
+		return;
+	}
 	smp_rmb(); /* Ensure implications of  'active' are visible */
 	if (mddev->suspended) {