md: call md_update_sb even for 'external' metadata arrays.
authorNeilBrown <neilb@suse.de>
Tue, 7 Sep 2010 07:02:47 +0000 (17:02 +1000)
committerNeilBrown <neilb@suse.de>
Fri, 17 Sep 2010 03:53:13 +0000 (13:53 +1000)
Now that we depend on md_update_sb to clear variable bits in
mddev->flags (rather than trying not to set them) it is important to
always call md_update_sb when appropriate.

md_check_recovery has this job but explicitly avoids it for ->external
metadata arrays.  This is not longer appropraite, or needed.

However we do want to avoid taking the mddev lock if only
MD_CHANGE_PENDING is set as that is not cleared by md_update_sb for
external-metadata arrays.

Reported-by: "Kwolek, Adam" <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/md.c

index 43cf9cc9c1df3650c228ce01920645fb474f105a..bdd9bba577b076addf1c1c9e880fd8c4498aac1b 100644 (file)
@@ -7069,7 +7069,7 @@ void md_check_recovery(mddev_t *mddev)
        if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))
                return;
        if ( ! (
-               (mddev->flags && !mddev->external) ||
+               (mddev->flags & ~ (1<<MD_CHANGE_PENDING)) ||
                test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) ||
                test_bit(MD_RECOVERY_DONE, &mddev->recovery) ||
                (mddev->external == 0 && mddev->safemode == 1) ||