]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
imsm: return correct uuid for volume in detail
authorBlazej Kucman <blazej.kucman@intel.com>
Fri, 29 Nov 2019 14:21:08 +0000 (15:21 +0100)
committerJes Sorensen <jsorensen@fb.com>
Mon, 2 Dec 2019 21:01:16 +0000 (16:01 -0500)
Fixes the side effect of the patch b6180160f ("imsm: save current_vol number")
- wrong UUID is printed in detail for each volume.
New parameter "subarray" is added to determine what info should be extracted
from metadata (subarray or container).
The parameter affects only IMSM metadata.

Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
Detail.c
mdadm.h
super-ddf.c
super-intel.c
super0.c
super1.c

index 3e61e372fe9f16b6c1897afb693dd016ec3f516a..24fa462e76c0124032e13a5709a7e41da9043227 100644 (file)
--- a/Detail.c
+++ b/Detail.c
@@ -623,7 +623,7 @@ This is pretty boring
                free_mdstat(ms);
 
                if (st && st->sb)
-                       st->ss->detail_super(st, c->homehost);
+                       st->ss->detail_super(st, c->homehost, subarray);
 
                if (array.raid_disks == 0 && sra &&
                    sra->array.major_version == -1 &&
@@ -767,7 +767,7 @@ skip_devices_state:
        if (spares && c->brief && array.raid_disks)
                printf(" spares=%d", spares);
        if (c->brief && st && st->sb)
-               st->ss->brief_detail_super(st);
+               st->ss->brief_detail_super(st, subarray);
        if (st)
                st->ss->free_super(st);
 
diff --git a/mdadm.h b/mdadm.h
index c88ceab01875efef7da1c5ad99b030412d2cd7e6..91f133862feb31872688ff1340192a5688188cef 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -847,8 +847,9 @@ extern struct superswitch {
        /* Used to report details of an active array.
         * ->load_super was possibly given a 'component' string.
         */
-       void (*detail_super)(struct supertype *st, char *homehost);
-       void (*brief_detail_super)(struct supertype *st);
+       void (*detail_super)(struct supertype *st, char *homehost,
+                            char *subarray);
+       void (*brief_detail_super)(struct supertype *st, char *subarray);
        void (*export_detail_super)(struct supertype *st);
 
        /* Optional: platform hardware / firmware details */
index c095e8a2f8c3b784c0e4707b9ed41f65a0240872..780206341406995cfa1b1f08c03d3f7835017901 100644 (file)
@@ -1730,7 +1730,8 @@ err:
        return 1;
 }
 
-static void detail_super_ddf(struct supertype *st, char *homehost)
+static void detail_super_ddf(struct supertype *st, char *homehost,
+                            char *subarray)
 {
        struct ddf_super *sb = st->sb;
        int cnt = be16_to_cpu(sb->virt->populated_vdes);
@@ -1787,7 +1788,7 @@ static void uuid_of_ddf_subarray(const struct ddf_super *ddf,
        memcpy(uuid, sha, 4*4);
 }
 
-static void brief_detail_super_ddf(struct supertype *st)
+static void brief_detail_super_ddf(struct supertype *st, char *subarray)
 {
        struct mdinfo info;
        char nbuf[64];
index a7fbed4db7ef5ff362a385382c488e697e29d9e1..86dcb69c117b6cf5b3b4fed5eee86dd32b46cc52 100644 (file)
@@ -2183,23 +2183,39 @@ err:
        return 1;
 }
 
-static void detail_super_imsm(struct supertype *st, char *homehost)
+static void detail_super_imsm(struct supertype *st, char *homehost,
+                             char *subarray)
 {
        struct mdinfo info;
        char nbuf[64];
+       struct intel_super *super = st->sb;
+       int temp_vol = super->current_vol;
+
+       if (subarray)
+               super->current_vol = strtoul(subarray, NULL, 10);
 
        getinfo_super_imsm(st, &info, NULL);
        fname_from_uuid(st, &info, nbuf, ':');
        printf("\n              UUID : %s\n", nbuf + 5);
+
+       super->current_vol = temp_vol;
 }
 
-static void brief_detail_super_imsm(struct supertype *st)
+static void brief_detail_super_imsm(struct supertype *st, char *subarray)
 {
        struct mdinfo info;
        char nbuf[64];
+       struct intel_super *super = st->sb;
+       int temp_vol = super->current_vol;
+
+       if (subarray)
+               super->current_vol = strtoul(subarray, NULL, 10);
+
        getinfo_super_imsm(st, &info, NULL);
        fname_from_uuid(st, &info, nbuf, ':');
        printf(" UUID=%s", nbuf + 5);
+
+       super->current_vol = temp_vol;
 }
 
 static int imsm_read_serial(int fd, char *devname, __u8 *serial);
index 42989b9f66eb62ea4a25b25a5fbfd9c89c0a3568..6b7c0e3de7ba79b307bf831841efaf6d490169c5 100644 (file)
--- a/super0.c
+++ b/super0.c
@@ -348,7 +348,7 @@ err:
        return 1;
 }
 
-static void detail_super0(struct supertype *st, char *homehost)
+static void detail_super0(struct supertype *st, char *homehost, char *subarray)
 {
        mdp_super_t *sb = st->sb;
        printf("              UUID : ");
@@ -368,7 +368,7 @@ static void detail_super0(struct supertype *st, char *homehost)
        printf("\n            Events : %d.%d\n\n", sb->events_hi, sb->events_lo);
 }
 
-static void brief_detail_super0(struct supertype *st)
+static void brief_detail_super0(struct supertype *st, char *subarray)
 {
        mdp_super_t *sb = st->sb;
        printf(" UUID=");
index b85dc20ca605bc27e93afc8f8758f35062e50fd3..929466d6013469a4ada4350cbb7f1a547f1e9153 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -833,7 +833,7 @@ err:
        return 1;
 }
 
-static void detail_super1(struct supertype *st, char *homehost)
+static void detail_super1(struct supertype *st, char *homehost, char *subarray)
 {
        struct mdp_superblock_1 *sb = st->sb;
        bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + MAX_SB_SIZE);
@@ -857,7 +857,7 @@ static void detail_super1(struct supertype *st, char *homehost)
               (unsigned long long)__le64_to_cpu(sb->events));
 }
 
-static void brief_detail_super1(struct supertype *st)
+static void brief_detail_super1(struct supertype *st, char *subarray)
 {
        struct mdp_superblock_1 *sb = st->sb;
        int i;