]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
mdmon: allow manage_member to cope with ->container becoming NULL.
authorNeilBrown <neilb@suse.de>
Tue, 22 Mar 2011 03:52:37 +0000 (14:52 +1100)
committerNeilBrown <neilb@suse.de>
Tue, 22 Mar 2011 03:52:37 +0000 (14:52 +1100)
As monitor() can set ->container to NULL, we need to be careful
about dereferencing it.
So take a copy in manage_member, return if it is NULL, and only
use the copy.

Signed-off-by: NeilBrown <neilb@suse.de>
managemon.c

index d6c57f78bd28a038d92dcad390272a79fbd82429..a2816cebd3062468243d0209efecaf88ad1ac682 100644 (file)
@@ -436,6 +436,11 @@ static void manage_member(struct mdstat_ent *mdstat,
         */
        char buf[64];
        int frozen;
+       struct supertype *container = a->container;
+
+       if (container == NULL)
+               /* Raced with something */
+               return;
 
        // FIXME
        a->info.array.raid_disks = mdstat->raid_disks;
@@ -459,7 +464,7 @@ static void manage_member(struct mdstat_ent *mdstat,
                        struct active_array *newa = duplicate_aa(a);
                        if (newa) {
                                newa->info.array.level = level;
-                               replace_array(a->container, a, newa);
+                               replace_array(container, a, newa);
                                a = newa;
                        }
                }
@@ -481,7 +486,7 @@ static void manage_member(struct mdstat_ent *mdstat,
                /* The array may not be degraded, this is just a good time
                 * to check.
                 */
-               newdev = a->container->ss->activate_spare(a, &updates);
+               newdev = container->ss->activate_spare(a, &updates);
                if (!newdev)
                        return;
 
@@ -506,7 +511,7 @@ static void manage_member(struct mdstat_ent *mdstat,
                }
                queue_metadata_update(updates);
                updates = NULL;
-               replace_array(a->container, a, newa);
+               replace_array(container, a, newa);
                sysfs_set_str(&a->info, NULL, "sync_action", "recover");
  out:
                while (newdev) {
@@ -560,7 +565,7 @@ static void manage_member(struct mdstat_ent *mdstat,
        out2:
                sysfs_free(info);
                if (newa)
-                       replace_array(a->container, a, newa);
+                       replace_array(container, a, newa);
        }
 }