diff --git a/debian/patches/bugfix/all/md-protect-against-crash-upon-fsync-on-ro-array.patch b/debian/patches/bugfix/all/md-protect-against-crash-upon-fsync-on-ro-array.patch index 71de97160..9a1996281 100644 --- a/debian/patches/bugfix/all/md-protect-against-crash-upon-fsync-on-ro-array.patch +++ b/debian/patches/bugfix/all/md-protect-against-crash-upon-fsync-on-ro-array.patch @@ -1,35 +1,41 @@ From: Sebastian Riemer Date: Fri, 25 Jan 2013 12:46:59 +0100 -Subject: [PATCH] md: protect against crash upon fsync on ro array +Subject: md: protect against crash upon fsync on ro array Bug-Debian: http://bugs.debian.org/696650 -If an fsync occurrs on a read-only array, we need to send a +commit 0ecfa11f08c79be05eb00bba537e764e6672774d 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. -As return value -EROFS makes most sense. +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. +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 --- - drivers/md/md.c | 5 +++++ - 1 files changed, 5 insertions(+), 0 deletions(-) + drivers/md/md.c | 4 ++++ + 1 file changed, 4 insertions(+) diff --git a/drivers/md/md.c b/drivers/md/md.c -index 3db3d1b..475e0be 100644 +index 3db3d1b..1e634a6 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c -@@ -322,6 +322,11 @@ static void md_make_request(struct request_queue *q, struct bio *bio) - } - finish_wait(&mddev->sb_wait, &__wait); +@@ -307,6 +307,10 @@ static void md_make_request(struct request_queue *q, struct bio *bio) + bio_io_error(bio); + return; } + if (mddev->ro == 1 && unlikely(rw == WRITE)) { -+ rcu_read_unlock(); -+ bio_endio(bio, -EROFS); ++ bio_endio(bio, bio_sectors(bio) == 0 ? 0 : -EROFS); + return; + } - atomic_inc(&mddev->active_io); - rcu_read_unlock(); - --- -1.7.1 - + smp_rmb(); /* Ensure implications of 'active' are visible */ + rcu_read_lock(); + if (mddev->suspended) {