Blame SOURCES/0049-imsm-return-correct-uuid-for-volume-in-detail.patch

f9a9f5
From b771faef931c798a4553db0a8c1366aff90079c6 Mon Sep 17 00:00:00 2001
f9a9f5
From: Blazej Kucman <blazej.kucman@intel.com>
f9a9f5
Date: Fri, 29 Nov 2019 15:21:08 +0100
f9a9f5
Subject: [RHEL7.8 PATCH 49/49] imsm: return correct uuid for volume in detail
f9a9f5
f9a9f5
Fixes the side effect of the patch b6180160f ("imsm: save current_vol number")
f9a9f5
- wrong UUID is printed in detail for each volume.
f9a9f5
New parameter "subarray" is added to determine what info should be extracted
f9a9f5
from metadata (subarray or container).
f9a9f5
The parameter affects only IMSM metadata.
f9a9f5
f9a9f5
Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
f9a9f5
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
f9a9f5
---
f9a9f5
 Detail.c      |  4 ++--
f9a9f5
 mdadm.h       |  5 +++--
f9a9f5
 super-ddf.c   |  5 +++--
f9a9f5
 super-intel.c | 20 ++++++++++++++++++--
f9a9f5
 super0.c      |  4 ++--
f9a9f5
 super1.c      |  4 ++--
f9a9f5
 6 files changed, 30 insertions(+), 12 deletions(-)
f9a9f5
f9a9f5
diff --git a/Detail.c b/Detail.c
f9a9f5
index 3e61e37..24fa462 100644
f9a9f5
--- a/Detail.c
f9a9f5
+++ b/Detail.c
f9a9f5
@@ -623,7 +623,7 @@ This is pretty boring
f9a9f5
 		free_mdstat(ms);
f9a9f5
 
f9a9f5
 		if (st && st->sb)
f9a9f5
-			st->ss->detail_super(st, c->homehost);
f9a9f5
+			st->ss->detail_super(st, c->homehost, subarray);
f9a9f5
 
f9a9f5
 		if (array.raid_disks == 0 && sra &&
f9a9f5
 		    sra->array.major_version == -1 &&
f9a9f5
@@ -767,7 +767,7 @@ skip_devices_state:
f9a9f5
 	if (spares && c->brief && array.raid_disks)
f9a9f5
 		printf(" spares=%d", spares);
f9a9f5
 	if (c->brief && st && st->sb)
f9a9f5
-		st->ss->brief_detail_super(st);
f9a9f5
+		st->ss->brief_detail_super(st, subarray);
f9a9f5
 	if (st)
f9a9f5
 		st->ss->free_super(st);
f9a9f5
 
f9a9f5
diff --git a/mdadm.h b/mdadm.h
f9a9f5
index c88ceab..91f1338 100644
f9a9f5
--- a/mdadm.h
f9a9f5
+++ b/mdadm.h
f9a9f5
@@ -847,8 +847,9 @@ extern struct superswitch {
f9a9f5
 	/* Used to report details of an active array.
f9a9f5
 	 * ->load_super was possibly given a 'component' string.
f9a9f5
 	 */
f9a9f5
-	void (*detail_super)(struct supertype *st, char *homehost);
f9a9f5
-	void (*brief_detail_super)(struct supertype *st);
f9a9f5
+	void (*detail_super)(struct supertype *st, char *homehost,
f9a9f5
+			     char *subarray);
f9a9f5
+	void (*brief_detail_super)(struct supertype *st, char *subarray);
f9a9f5
 	void (*export_detail_super)(struct supertype *st);
f9a9f5
 
f9a9f5
 	/* Optional: platform hardware / firmware details */
f9a9f5
diff --git a/super-ddf.c b/super-ddf.c
f9a9f5
index c095e8a..7802063 100644
f9a9f5
--- a/super-ddf.c
f9a9f5
+++ b/super-ddf.c
f9a9f5
@@ -1730,7 +1730,8 @@ err:
f9a9f5
 	return 1;
f9a9f5
 }
f9a9f5
 
f9a9f5
-static void detail_super_ddf(struct supertype *st, char *homehost)
f9a9f5
+static void detail_super_ddf(struct supertype *st, char *homehost,
f9a9f5
+			     char *subarray)
f9a9f5
 {
f9a9f5
 	struct ddf_super *sb = st->sb;
f9a9f5
 	int cnt = be16_to_cpu(sb->virt->populated_vdes);
f9a9f5
@@ -1787,7 +1788,7 @@ static void uuid_of_ddf_subarray(const struct ddf_super *ddf,
f9a9f5
 	memcpy(uuid, sha, 4*4);
f9a9f5
 }
f9a9f5
 
f9a9f5
-static void brief_detail_super_ddf(struct supertype *st)
f9a9f5
+static void brief_detail_super_ddf(struct supertype *st, char *subarray)
f9a9f5
 {
f9a9f5
 	struct mdinfo info;
f9a9f5
 	char nbuf[64];
f9a9f5
diff --git a/super-intel.c b/super-intel.c
f9a9f5
index a7fbed4..86dcb69 100644
f9a9f5
--- a/super-intel.c
f9a9f5
+++ b/super-intel.c
f9a9f5
@@ -2183,23 +2183,39 @@ err:
f9a9f5
 	return 1;
f9a9f5
 }
f9a9f5
 
f9a9f5
-static void detail_super_imsm(struct supertype *st, char *homehost)
f9a9f5
+static void detail_super_imsm(struct supertype *st, char *homehost,
f9a9f5
+			      char *subarray)
f9a9f5
 {
f9a9f5
 	struct mdinfo info;
f9a9f5
 	char nbuf[64];
f9a9f5
+	struct intel_super *super = st->sb;
f9a9f5
+	int temp_vol = super->current_vol;
f9a9f5
+
f9a9f5
+	if (subarray)
f9a9f5
+		super->current_vol = strtoul(subarray, NULL, 10);
f9a9f5
 
f9a9f5
 	getinfo_super_imsm(st, &info, NULL);
f9a9f5
 	fname_from_uuid(st, &info, nbuf, ':');
f9a9f5
 	printf("\n              UUID : %s\n", nbuf + 5);
f9a9f5
+
f9a9f5
+	super->current_vol = temp_vol;
f9a9f5
 }
f9a9f5
 
f9a9f5
-static void brief_detail_super_imsm(struct supertype *st)
f9a9f5
+static void brief_detail_super_imsm(struct supertype *st, char *subarray)
f9a9f5
 {
f9a9f5
 	struct mdinfo info;
f9a9f5
 	char nbuf[64];
f9a9f5
+	struct intel_super *super = st->sb;
f9a9f5
+	int temp_vol = super->current_vol;
f9a9f5
+
f9a9f5
+	if (subarray)
f9a9f5
+		super->current_vol = strtoul(subarray, NULL, 10);
f9a9f5
+
f9a9f5
 	getinfo_super_imsm(st, &info, NULL);
f9a9f5
 	fname_from_uuid(st, &info, nbuf, ':');
f9a9f5
 	printf(" UUID=%s", nbuf + 5);
f9a9f5
+
f9a9f5
+	super->current_vol = temp_vol;
f9a9f5
 }
f9a9f5
 
f9a9f5
 static int imsm_read_serial(int fd, char *devname, __u8 *serial);
f9a9f5
diff --git a/super0.c b/super0.c
f9a9f5
index 42989b9..6b7c0e3 100644
f9a9f5
--- a/super0.c
f9a9f5
+++ b/super0.c
f9a9f5
@@ -348,7 +348,7 @@ err:
f9a9f5
 	return 1;
f9a9f5
 }
f9a9f5
 
f9a9f5
-static void detail_super0(struct supertype *st, char *homehost)
f9a9f5
+static void detail_super0(struct supertype *st, char *homehost, char *subarray)
f9a9f5
 {
f9a9f5
 	mdp_super_t *sb = st->sb;
f9a9f5
 	printf("              UUID : ");
f9a9f5
@@ -368,7 +368,7 @@ static void detail_super0(struct supertype *st, char *homehost)
f9a9f5
 	printf("\n            Events : %d.%d\n\n", sb->events_hi, sb->events_lo);
f9a9f5
 }
f9a9f5
 
f9a9f5
-static void brief_detail_super0(struct supertype *st)
f9a9f5
+static void brief_detail_super0(struct supertype *st, char *subarray)
f9a9f5
 {
f9a9f5
 	mdp_super_t *sb = st->sb;
f9a9f5
 	printf(" UUID=");
f9a9f5
diff --git a/super1.c b/super1.c
f9a9f5
index b85dc20..929466d 100644
f9a9f5
--- a/super1.c
f9a9f5
+++ b/super1.c
f9a9f5
@@ -833,7 +833,7 @@ err:
f9a9f5
 	return 1;
f9a9f5
 }
f9a9f5
 
f9a9f5
-static void detail_super1(struct supertype *st, char *homehost)
f9a9f5
+static void detail_super1(struct supertype *st, char *homehost, char *subarray)
f9a9f5
 {
f9a9f5
 	struct mdp_superblock_1 *sb = st->sb;
f9a9f5
 	bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + MAX_SB_SIZE);
f9a9f5
@@ -857,7 +857,7 @@ static void detail_super1(struct supertype *st, char *homehost)
f9a9f5
 	       (unsigned long long)__le64_to_cpu(sb->events));
f9a9f5
 }
f9a9f5
 
f9a9f5
-static void brief_detail_super1(struct supertype *st)
f9a9f5
+static void brief_detail_super1(struct supertype *st, char *subarray)
f9a9f5
 {
f9a9f5
 	struct mdp_superblock_1 *sb = st->sb;
f9a9f5
 	int i;
f9a9f5
-- 
f9a9f5
2.7.5
f9a9f5