Message ID | 1335804386-20502-2-git-send-email-luis.henriques@canonical.com |
---|---|
State | New |
Headers | show |
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
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); }