]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Assemble.c
Assemble: call remove_partitions later.
[thirdparty/mdadm.git] / Assemble.c
index 1504f1f45585ff2f19a764c48f62755ff7666a0e..ea3a6484d9ad78ac8977a0efa02e686c9662324b 100644 (file)
@@ -146,11 +146,11 @@ int Assemble(struct supertype *st, char *mddev,
                struct mdinfo i;
        } *devices;
        int *best = NULL; /* indexed by raid_disk */
-       unsigned int bestcnt = 0;
+       int bestcnt = 0;
        int devcnt = 0;
        unsigned int okcnt, sparecnt, rebuilding_cnt;
        unsigned int req_cnt;
-       unsigned int i;
+       int i;
        int most_recent = 0;
        int chosen_drive;
        int change = 0;
@@ -182,7 +182,7 @@ int Assemble(struct supertype *st, char *mddev,
 
        if (!devlist &&
            ident->uuid_set == 0 &&
-           ident->super_minor < 0 &&
+           (ident->super_minor < 0 || ident->super_minor == UnSet) &&
            ident->name[0] == 0 &&
            (ident->container == NULL || ident->member == NULL) &&
            ident->devices == NULL) {
@@ -271,6 +271,7 @@ int Assemble(struct supertype *st, char *mddev,
                                fprintf(stderr, Name ": %s has metadata type %s for which "
                                        "auto-assembly is disabled\n",
                                        devname, tst->ss->name);
+                       tst->ss->free_super(tst);
                        tmpdev->used = 2;
                } else {
                        content = &info;
@@ -617,8 +618,6 @@ int Assemble(struct supertype *st, char *mddev,
                        }
                        dfd = dev_open(devname, O_RDWR|O_EXCL);
 
-                       remove_partitions(dfd);
-
                        tst = dup_super(st);
                        if (dfd < 0 || tst->ss->load_super(tst, dfd, NULL) != 0) {
                                fprintf(stderr, Name ": cannot re-read metadata from %s - aborting\n",
@@ -668,8 +667,6 @@ int Assemble(struct supertype *st, char *mddev,
                        int dfd;
                        dfd = dev_open(devname, O_RDWR|O_EXCL);
 
-                       remove_partitions(dfd);
-
                        if (dfd < 0 || tst->ss->load_super(tst, dfd, NULL) != 0) {
                                fprintf(stderr, Name ": cannot re-read metadata from %s - aborting\n",
                                        devname);
@@ -714,9 +711,9 @@ int Assemble(struct supertype *st, char *mddev,
                }
                if (i < 10000) {
                        if (i >= bestcnt) {
-                               unsigned int newbestcnt = i+10;
+                               int newbestcnt = i+10;
                                int *newbest = malloc(sizeof(int)*newbestcnt);
-                               unsigned int c;
+                               int c;
                                for (c=0; c < newbestcnt; c++)
                                        if (c < bestcnt)
                                                newbest[c] = best[c];
@@ -783,7 +780,7 @@ int Assemble(struct supertype *st, char *mddev,
        okcnt = 0;
        sparecnt=0;
        rebuilding_cnt=0;
-       for (i=0; i< bestcnt ;i++) {
+       for (i=0; i< bestcnti++) {
                int j = best[i];
                int event_margin = 1; /* always allow a difference of '1'
                                       * like the kernel does
@@ -821,9 +818,9 @@ int Assemble(struct supertype *st, char *mddev,
                 */
                int fd;
                struct supertype *tst;
-               long long current_events;
+               unsigned long long current_events;
                chosen_drive = -1;
-               for (i=0; i<content->array.raid_disks && i < bestcnt; i++) {
+               for (i = 0; i < content->array.raid_disks && i < bestcnt; i++) {
                        int j = best[i];
                        if (j>=0 &&
                            !devices[j].uptodate &&
@@ -881,7 +878,7 @@ int Assemble(struct supertype *st, char *mddev,
                /* If there are any other drives of the same vintage,
                 * add them in as well.  We can't lose and we might gain
                 */
-               for (i=0; i<content->array.raid_disks && i < bestcnt ; i++) {
+               for (i = 0; i < content->array.raid_disks && i < bestcnt ; i++) {
                        int j = best[i];
                        if (j >= 0 &&
                            !devices[j].uptodate &&
@@ -1103,6 +1100,12 @@ int Assemble(struct supertype *st, char *mddev,
                                j = chosen_drive;
 
                        if (j >= 0 /* && devices[j].uptodate */) {
+                               int dfd = dev_open(devices[j].devname,
+                                                  O_RDWR|O_EXCL);
+                               if (dfd >= 0) {
+                                       remove_partitions(dfd);
+                                       close(dfd);
+                               }
                                rv = add_disk(mdfd, st, content, &devices[j].i);
 
                                if (rv) {
@@ -1132,7 +1135,7 @@ int Assemble(struct supertype *st, char *mddev,
                                fprintf(stderr, Name ": Container %s has been "
                                        "assembled with %d drive%s",
                                        mddev, okcnt+sparecnt, okcnt+sparecnt==1?"":"s");
-                               if (okcnt < content->array.raid_disks)
+                               if (okcnt < (unsigned)content->array.raid_disks)
                                        fprintf(stderr, " (out of %d)",
                                                content->array.raid_disks);
                                fprintf(stderr, "\n");
@@ -1166,7 +1169,7 @@ int Assemble(struct supertype *st, char *mddev,
                                if (verbose >= 0) {
                                        fprintf(stderr, Name ": %s has been started with %d drive%s",
                                                mddev, okcnt, okcnt==1?"":"s");
-                                       if (okcnt < content->array.raid_disks)
+                                       if (okcnt < (unsigned)content->array.raid_disks)
                                                fprintf(stderr, " (out of %d)", content->array.raid_disks);
                                        if (rebuilding_cnt)
                                                fprintf(stderr, "%s %d rebuilding", sparecnt?",":" and", rebuilding_cnt);
@@ -1241,7 +1244,7 @@ int Assemble(struct supertype *st, char *mddev,
                if (runstop == -1) {
                        fprintf(stderr, Name ": %s assembled from %d drive%s",
                                mddev, okcnt, okcnt==1?"":"s");
-                       if (okcnt != content->array.raid_disks)
+                       if (okcnt != (unsigned)content->array.raid_disks)
                                fprintf(stderr, " (out of %d)", content->array.raid_disks);
                        fprintf(stderr, ", but not started.\n");
                        close(mdfd);
@@ -1264,7 +1267,7 @@ int Assemble(struct supertype *st, char *mddev,
                                        "array while not clean - consider "
                                        "--force.\n");
                        else {
-                               if (req_cnt == content->array.raid_disks)
+                               if (req_cnt == (unsigned)content->array.raid_disks)
                                        fprintf(stderr, " - need all %d to start it", req_cnt);
                                else
                                        fprintf(stderr, " - need %d of %d to start", req_cnt, content->array.raid_disks);