]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Detail.c: call load_container for container subarrays
authormwilck@arcor.de <mwilck@arcor.de>
Fri, 1 Mar 2013 22:28:33 +0000 (23:28 +0100)
committerNeilBrown <neilb@suse.de>
Mon, 4 Mar 2013 05:15:51 +0000 (16:15 +1100)
Without calling load_container at this point, the
info structure may be missing some important information.
In particular, information about secondary DDF RAID levels
may be wrong if information is only read from a single disk.

If this fails, fall back to the previous code.

Signed-off-by: Martin Wilck <mwilck@arcor.de>
Signed-off-by: NeilBrown <neilb@suse.de>
Detail.c

index 250d586416646df6c3ffc53485607630b18cf325..0d48b63f14e8dacb3915cca3eed87ce8712b6a02 100644 (file)
--- a/Detail.c
+++ b/Detail.c
@@ -103,14 +103,22 @@ int Detail(char *dev, struct context *c)
                 * We want the name of the container, and the member
                 */
                int devid = devnm2devid(st->container_devnm);
+               int cfd, err;
 
                member = subarray;
                container = map_dev_preferred(major(devid), minor(devid),
                                              1, c->prefer);
+               cfd = open_dev(st->container_devnm);
+               if (cfd >= 0) {
+                       err = st->ss->load_container(st, cfd, NULL);
+                       close(cfd);
+                       if (err == 0)
+                               info = st->ss->container_content(st, subarray);
+               }
        }
 
        /* try to load a superblock */
-       if (st) for (d = 0; d < max_disks; d++) {
+       if (st && !info) for (d = 0; d < max_disks; d++) {
                mdu_disk_info_t disk;
                char *dv;
                int fd2;