[PATCH] imsm: return correct uuid for volume in detail

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxx>
---
 Detail.c      |  4 ++--
 mdadm.h       |  5 +++--
 super-ddf.c   |  5 +++--
 super-intel.c | 20 ++++++++++++++++++--
 super0.c      |  4 ++--
 super1.c      |  4 ++--
 6 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/Detail.c b/Detail.c
index 3e61e372..24fa462e 100644
--- 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 c88ceab0..91f13386 100644
--- 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 */
diff --git a/super-ddf.c b/super-ddf.c
index c095e8a2..78020634 100644
--- a/super-ddf.c
+++ b/super-ddf.c
@@ -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];
diff --git a/super-intel.c b/super-intel.c
index e02bbd7a..0e959339 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -2163,23 +2163,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);
diff --git a/super0.c b/super0.c
index 42989b9f..6b7c0e3d 100644
--- 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=");
diff --git a/super1.c b/super1.c
index b85dc20c..929466d6 100644
--- 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;
-- 
2.16.4




[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux