You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
5.3 KiB
176 lines
5.3 KiB
From b771faef931c798a4553db0a8c1366aff90079c6 Mon Sep 17 00:00:00 2001 |
|
From: Blazej Kucman <blazej.kucman@intel.com> |
|
Date: Fri, 29 Nov 2019 15:21:08 +0100 |
|
Subject: [RHEL7.8 PATCH 49/49] imsm: return correct uuid for volume in detail |
|
|
|
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 | 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 3e61e37..24fa462 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 c88ceab..91f1338 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 c095e8a..7802063 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 a7fbed4..86dcb69 100644 |
|
--- a/super-intel.c |
|
+++ b/super-intel.c |
|
@@ -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); |
|
diff --git a/super0.c b/super0.c |
|
index 42989b9..6b7c0e3 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 b85dc20..929466d 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.7.5 |
|
|
|
|