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

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