]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Assemble.c
mdadm-1.1.0
[thirdparty/mdadm.git] / Assemble.c
index a2ff502390089664ca4a242ddf1b4676879652a1..4a747ca3f722b0db1546523ec698a515dcf290c3 100644 (file)
@@ -103,6 +103,7 @@ int Assemble(char *mddev, int mdfd,
                long long events;
                time_t utime;
                int uptodate;
+               int state;
                int raid_disk;
        } *devices;
        int *best; /* indexed by raid_disk */
@@ -310,6 +311,7 @@ int Assemble(char *mddev, int mdfd,
                devices[devcnt].utime = super.utime;
                devices[devcnt].raid_disk = super.this_disk.raid_disk;
                devices[devcnt].uptodate = 0;
+               devices[devcnt].state = super.this_disk.state;
                if (most_recent < devcnt) {
                        if (devices[devcnt].events
                            > devices[most_recent].events)
@@ -342,6 +344,12 @@ int Assemble(char *mddev, int mdfd,
                int j = best[i];
                int event_margin = !force;
                if (j < 0) continue;
+               /* note: we ignore error flags in multipath arrays
+                * as they don't make sense
+                */
+               if (first_super.level != -4)
+                       if (!(devices[j].state & (1<<MD_DISK_SYNC)))
+                               continue;
                if (devices[j].events+event_margin >=
                    devices[most_recent].events) {
                        devices[j].uptodate = 1;
@@ -391,7 +399,7 @@ int Assemble(char *mddev, int mdfd,
                super.events_lo = (devices[most_recent].events)&0xFFFFFFFF;
                if (super.level == 5 || super.level == 4) {
                        /* need to force clean */
-                       super.state = 0;
+                       super.state = (1<<MD_SB_CLEAN);
                }
                super.sb_csum = calc_sb_csum(&super);
 /*DRYRUN*/     if (store_super(fd, &super)) {
@@ -484,6 +492,11 @@ This doesnt work yet
                                i, mddev);
                }
        }
+       if (force && (super.level == 4 || super.level == 5) && 
+           okcnt == super.raid_disks-1) {
+               super.state = (1<< MD_SB_CLEAN);
+               change |= 2;
+       }
 
        if ((force && (change & 2))
            || (old_linux && (change & 1))) {