Patchwork [1/1] UBUNTU: SAUCE: md: fix possible corruption of array metadata on shutdown.

login
register
mail settings
Submitter Luis Henriques
Date April 30, 2012, 4:46 p.m.
Message ID <1335804386-20502-2-git-send-email-luis.henriques@canonical.com>
Download mbox | patch
Permalink /patch/155922/
State New
Headers show

Comments

Luis Henriques - April 30, 2012, 4:46 p.m.
From: NeilBrown <neilb@suse.de>

BugLink: http://bugs.launchpad.net/bugs/992038

commit c744a65c1e2d59acc54333ce8
  md: don't set md arrays to readonly on shutdown.

removed the possibility of a 'BUG' when data is written to an array
that has just been switched to read-only, but also introduced the
possibility that the array metadata could be corrupted.

If, when md_notify_reboot gets the mddev lock, the array is
in a state where it is assembled but hasn't been started (as can
happen if the personality module is not available, or in other unusual
situations), then incorrect metadata will be written out making it
impossible to re-assemble the array.

So only call __md_stop_writes() if the array has actually been
activated.

This patch is needed for any stable kernel which has had the above
commit applied.

Cc: stable@vger.kernel.org
Reported-by: Christoph Nelles <evilazrael@evilazrael.de>
Signed-off-by: NeilBrown <neilb@suse.de>
(cherry picked from commit 30b8aa9172dfeaac6d77897c67ee9f9fc574cdbb)

Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
---
 drivers/md/md.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
Seth Forshee - April 30, 2012, 5:01 p.m.
On Mon, Apr 30, 2012 at 05:46:26PM +0100, Luis Henriques wrote:
> From: NeilBrown <neilb@suse.de>
> 
> BugLink: http://bugs.launchpad.net/bugs/992038
> 
> commit c744a65c1e2d59acc54333ce8
>   md: don't set md arrays to readonly on shutdown.
> 
> removed the possibility of a 'BUG' when data is written to an array
> that has just been switched to read-only, but also introduced the
> possibility that the array metadata could be corrupted.
> 
> If, when md_notify_reboot gets the mddev lock, the array is
> in a state where it is assembled but hasn't been started (as can
> happen if the personality module is not available, or in other unusual
> situations), then incorrect metadata will be written out making it
> impossible to re-assemble the array.
> 
> So only call __md_stop_writes() if the array has actually been
> activated.
> 
> This patch is needed for any stable kernel which has had the above
> commit applied.
> 
> Cc: stable@vger.kernel.org
> Reported-by: Christoph Nelles <evilazrael@evilazrael.de>
> Signed-off-by: NeilBrown <neilb@suse.de>
> (cherry picked from commit 30b8aa9172dfeaac6d77897c67ee9f9fc574cdbb)
> 
> Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
> ---
>  drivers/md/md.c |    3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index 6f37aa4..065ab4f 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -8100,7 +8100,8 @@ static int md_notify_reboot(struct notifier_block *this,
>  
>  	for_each_mddev(mddev, tmp) {
>  		if (mddev_trylock(mddev)) {
> -			__md_stop_writes(mddev);
> +			if (mddev->pers)
> +				__md_stop_writes(mddev);
>  			mddev->safemode = 2;
>  			mddev_unlock(mddev);
>  		}
> -- 
> 1.7.9.5
> 
> 
> -- 
> kernel-team mailing list
> kernel-team@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team

Patch

diff --git a/drivers/md/md.c b/drivers/md/md.c
index 6f37aa4..065ab4f 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -8100,7 +8100,8 @@  static int md_notify_reboot(struct notifier_block *this,
 
 	for_each_mddev(mddev, tmp) {
 		if (mddev_trylock(mddev)) {
-			__md_stop_writes(mddev);
+			if (mddev->pers)
+				__md_stop_writes(mddev);
 			mddev->safemode = 2;
 			mddev_unlock(mddev);
 		}