]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Avoid misdetection of overlapping partitions...
authorNeil Brown <neilb@suse.de>
Fri, 2 Jun 2006 06:58:39 +0000 (06:58 +0000)
committerNeil Brown <neilb@suse.de>
Fri, 2 Jun 2006 06:58:39 +0000 (06:58 +0000)
As version-0.90 superblock don't record the superblock
offset, it is possible for overlapping partitions,
or a partition that starts on a 64K boundary in the whole device
to result in mis-detection - one partition or device might
be detected where the other was intended.

To avoid this awkward possibility, we reject assembly attempts
which seem to have two devices that are different but have the
same version-0.90 superblock.

To avoid this problem altogether, switch to version-1 metadata.

Signed-off-by: Neil Brown <neilb@suse.de>
Assemble.c

index cb97f8cd59a491684d6531318aaae0aecad6ab5e..aa7eeb2b5010c17a70fe33383e06c15ed397b3c4 100644 (file)
@@ -514,6 +514,25 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
                                best = newbest;
                                bestcnt = newbestcnt;
                        }
+                       if (best[i] >=0 &&
+                           devices[best[i]].events == devices[devcnt].events &&
+                           devices[best[i]].minor != devices[devcnt].minor &&
+                           st->ss->major == 0 &&
+                           info.array.level != -4) {
+                               /* two different devices with identical superblock.
+                                * Could be a mis-detection caused by overlapping
+                                * partitions.  fail-safe.
+                                */
+                               fprintf(stderr, Name ": WARNING %s and %s appear"
+                                       " to have very similar superblocks.\n"
+                                       "      If they are really different, "
+                                       "please --zero the superblock on one\n"
+                                       "      If they are the same, please remove "
+                                       "one from the list.\n",
+                                       devices[best[i]].devname, devname);
+                               if (must_close) close(mdfd);
+                               return 1;
+                       }
                        if (best[i] == -1
                            || devices[best[i]].events < devices[devcnt].events)
                                best[i] = devcnt;