md: Don't test all of mddev->flags at once.
authorNeilBrown <neilb@suse.de>
Tue, 27 Aug 2013 06:28:23 +0000 (16:28 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 27 Aug 2013 06:28:23 +0000 (16:28 +1000)
mddev->flags is mostly used to record if an update of the
metadata is needed.  Sometimes the whole field is tested
instead of just the important bits.  This makes it difficult
to introduce more state bits.

So replace all bare tests of mddev->flags with tests for the bits
that actually need testing.

Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/md.c
drivers/md/md.h

index a2678d882151aa751123eb3203b7098e93fc431c..084a6540a4bdd2d88ef707d71063058cb570079f 100644 (file)
@@ -5144,7 +5144,7 @@ int md_run(struct mddev *mddev)
        
        set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
        
-       if (mddev->flags)
+       if (mddev->flags & MD_UPDATE_SB_FLAGS)
                md_update_sb(mddev, 0);
 
        md_new_event(mddev);
@@ -5289,7 +5289,7 @@ static void __md_stop_writes(struct mddev *mddev)
        md_super_wait(mddev);
 
        if (mddev->ro == 0 &&
-           (!mddev->in_sync || mddev->flags)) {
+           (!mddev->in_sync || (mddev->flags & MD_UPDATE_SB_FLAGS))) {
                /* mark array as shutdown cleanly */
                mddev->in_sync = 1;
                md_update_sb(mddev, 1);
@@ -7814,7 +7814,7 @@ void md_check_recovery(struct mddev *mddev)
                                sysfs_notify_dirent_safe(mddev->sysfs_state);
                }
 
-               if (mddev->flags)
+               if (mddev->flags & MD_UPDATE_SB_FLAGS)
                        md_update_sb(mddev, 0);
 
                if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) &&
index 20f02c0b5f2d6d99ac69a36067135f0b8196d9a7..53283beda21be6287d1146011b36d972ab85ed8d 100644 (file)
@@ -204,11 +204,12 @@ struct mddev {
        struct md_personality           *pers;
        dev_t                           unit;
        int                             md_minor;
-       struct list_head                disks;
+       struct list_head                disks;
        unsigned long                   flags;
 #define MD_CHANGE_DEVS 0       /* Some device status has changed */
 #define MD_CHANGE_CLEAN 1      /* transition to or from 'clean' */
 #define MD_CHANGE_PENDING 2    /* switch from 'clean' to 'active' in progress */
+#define MD_UPDATE_SB_FLAGS (1 | 2 | 4) /* If these are set, md_update_sb needed */
 #define MD_ARRAY_FIRST_USE 3    /* First use of array, needs initialization */
 
        int                             suspended;
@@ -218,7 +219,7 @@ struct mddev {
                                                       * are happening, so run/
                                                       * takeover/stop are not safe
                                                       */
-       int                             ready; /* See when safe to pass 
+       int                             ready; /* See when safe to pass
                                                * IO requests down */
        struct gendisk                  *gendisk;