]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
imsm: set map state depending on sync state
authorDan Williams <dan.j.williams@intel.com>
Mon, 16 Jun 2008 22:36:41 +0000 (15:36 -0700)
committerDan Williams <dan.j.williams@intel.com>
Mon, 16 Jun 2008 22:36:41 +0000 (15:36 -0700)
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
super-intel.c

index 3a85e2c3037b392e3ae83a62076b7f96645854b4..0efc49c238c7c64e3d4e54b575e53d224fc4de4a 100644 (file)
@@ -1649,22 +1649,6 @@ static int imsm_open_new(struct supertype *c, struct active_array *a,
        return 0;
 }
 
-static void imsm_set_array_state(struct active_array *a, int consistent)
-{
-       int inst = a->info.container_member;
-       struct intel_super *super = a->container->sb;
-       struct imsm_dev *dev = get_imsm_dev(super->mpb, inst);
-       int dirty = !consistent || (a->resync_start != ~0ULL);
-
-       if (dev->vol.dirty != dirty) {
-               fprintf(stderr, "imsm: mark '%s' (%llu)\n",
-                       dirty?"dirty":"clean", a->resync_start);
-
-               dev->vol.dirty = dirty;
-               super->updates_pending++;
-       }
-}
-
 static __u8 imsm_check_degraded(struct imsm_super *mpb, int n, int failed)
 {
        struct imsm_dev *dev = get_imsm_dev(mpb, n);
@@ -1742,6 +1726,38 @@ static int imsm_count_failed(struct imsm_super *mpb, struct imsm_map *map)
        return failed;
 }
 
+static void imsm_set_array_state(struct active_array *a, int consistent)
+{
+       int inst = a->info.container_member;
+       struct intel_super *super = a->container->sb;
+       struct imsm_dev *dev = get_imsm_dev(super->mpb, inst);
+       struct imsm_map *map = &dev->vol.map[0];
+       int dirty = !consistent;
+       int failed;
+       __u8 map_state;
+
+       if (a->resync_start == ~0ULL) {
+               failed = imsm_count_failed(super->mpb, map);
+               map_state = imsm_check_degraded(super->mpb, inst, failed);
+               if (!failed)
+                       map_state = IMSM_T_STATE_NORMAL;
+               if (map->map_state != map_state) {
+                       fprintf(stderr, "imsm: map_state %d: %d\n",
+                               inst, map_state);
+                       map->map_state = map_state;
+                       super->updates_pending++;
+               }
+       }
+
+       if (dev->vol.dirty != dirty) {
+               fprintf(stderr, "imsm: mark '%s' (%llu)\n",
+                       dirty?"dirty":"clean", a->resync_start);
+
+               dev->vol.dirty = dirty;
+               super->updates_pending++;
+       }
+}
+
 static void imsm_set_disk(struct active_array *a, int n, int state)
 {
        int inst = a->info.container_member;