From 0d726f17e191094665a5f2af8c2564dedb990502 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Tue, 6 May 2008 10:02:38 +1000 Subject: [PATCH] add --export option to --examine From: Kay Sievers Cc: David Zeuthen Signed-off-by: Kay Sievers --- Detail.c | 2 +- Examine.c | 5 ++++- mdadm.8 | 4 +++- mdadm.c | 4 +++- mdadm.h | 7 ++++--- super0.c | 24 ++++++++++++++++++++++-- super1.c | 39 +++++++++++++++++++++++++++++++++++++-- 7 files changed, 74 insertions(+), 11 deletions(-) diff --git a/Detail.c b/Detail.c index 6199d26f..2fb59a32 100644 --- a/Detail.c +++ b/Detail.c @@ -142,7 +142,7 @@ int Detail(char *dev, int brief, int export, int test, char *homehost) array.major_version, array.minor_version); if (st && st->sb) - st->ss->export_super(st); + st->ss->export_detail_super(st); goto out; } diff --git a/Examine.c b/Examine.c index 276e0fa9..5de92028 100644 --- a/Examine.c +++ b/Examine.c @@ -35,7 +35,7 @@ #endif #include "md_u.h" #include "md_p.h" -int Examine(mddev_dev_t devlist, int brief, int scan, +int Examine(mddev_dev_t devlist, int brief, int export, int scan, int SparcAdjust, struct supertype *forcest, char *homehost) { @@ -102,6 +102,7 @@ int Examine(mddev_dev_t devlist, int brief, int scan, st->ss->update_super(st, NULL, "sparc2.2", devlist->devname, 0, 0, NULL); /* Ok, its good enough to try, though the checksum could be wrong */ + if (brief) { struct array *ap; char *d; @@ -126,6 +127,8 @@ int Examine(mddev_dev_t devlist, int brief, int scan, ap->spares++; d = dl_strdup(devlist->devname); dl_add(ap->devs, d); + } else if (export) { + st->ss->export_examine_super(st); } else { printf("%s:\n",devlist->devname); st->ss->examine_super(st, homehost); diff --git a/mdadm.8 b/mdadm.8 index 01ec9813..d3cecb8b 100644 --- a/mdadm.8 +++ b/mdadm.8 @@ -946,7 +946,9 @@ Print detail of one or more md devices. .TP .BR \-Y ", " \-\-export When used with -.BR \-\-detail , +.B \-\-detail +or +.BR \-\-examine , output will be formatted as .B key=value pairs for easy import into the environment. diff --git a/mdadm.c b/mdadm.c index f2a7bcd5..ccd09333 100644 --- a/mdadm.c +++ b/mdadm.c @@ -1202,7 +1202,9 @@ int main(int argc, char *argv[]) } if (brief && verbose) brief = 2; - rv = Examine(devlist, scan?(verbose>1?0:verbose+1):brief, scan, SparcAdjust, ss, homehost); + rv = Examine(devlist, scan?(verbose>1?0:verbose+1):brief, + export, scan, + SparcAdjust, ss, homehost); } else { if (devlist == NULL) { if (devmode=='D' && scan) { diff --git a/mdadm.h b/mdadm.h index 0d73c172..5c18d15e 100644 --- a/mdadm.h +++ b/mdadm.h @@ -330,9 +330,10 @@ extern char *map_dev(int major, int minor, int create); extern struct superswitch { void (*examine_super)(struct supertype *st, char *homehost); void (*brief_examine_super)(struct supertype *st); + void (*export_examine_super)(struct supertype *st); void (*detail_super)(struct supertype *st, char *homehost); - void (*export_super)(struct supertype *st); void (*brief_detail_super)(struct supertype *st); + void (*export_detail_super)(struct supertype *st); void (*uuid_from_super)(struct supertype *st, int uuid[4]); void (*getinfo_super)(struct supertype *st, struct mdinfo *info); int (*match_home)(struct supertype *st, char *homehost); @@ -451,8 +452,8 @@ extern int Create(struct supertype *st, char *mddev, int mdfd, extern int Detail(char *dev, int brief, int export, int test, char *homehost); extern int Query(char *dev); -extern int Examine(mddev_dev_t devlist, int brief, int scan, int SparcAdjust, - struct supertype *forcest, char *homehost); +extern int Examine(mddev_dev_t devlist, int brief, int export, int scan, + int SparcAdjust, struct supertype *forcest, char *homehost); extern int Monitor(mddev_dev_t devlist, char *mailaddr, char *alert_cmd, int period, int daemonise, int scan, int oneshot, diff --git a/super0.c b/super0.c index b1ad47af..2476d771 100644 --- a/super0.c +++ b/super0.c @@ -252,6 +252,25 @@ static void brief_examine_super0(struct supertype *st) printf("\n"); } +static void export_examine_super0(struct supertype *st) +{ + mdp_super_t *sb = st->sb; + + printf("MD_LEVEL=%s\n", map_num(pers, sb->level)); + printf("MD_DEVICES=%d\n", sb->raid_disks); + if (sb->minor_version >= 90) + printf("MD_UUID=%08x:%08x:%08x:%08x\n", + sb->set_uuid0, sb->set_uuid1, + sb->set_uuid2, sb->set_uuid3); + else + printf("MD_UUID=%08x\n", sb->set_uuid0); + printf("MD_UPDATE_TIME=%llu\n", + __le64_to_cpu(sb->ctime) & 0xFFFFFFFFFFULL); + printf("MD_EVENTS=%llu\n", + ((unsigned long long)sb->events_hi << 32) + + sb->events_lo); +} + static void detail_super0(struct supertype *st, char *homehost) { mdp_super_t *sb = st->sb; @@ -283,7 +302,7 @@ static void brief_detail_super0(struct supertype *st) printf("%08x", sb->set_uuid0); } -static void export_super0(struct supertype *st) +static void export_detail_super0(struct supertype *st) { mdp_super_t *sb = st->sb; printf("MD_UUID="); @@ -974,9 +993,10 @@ struct superswitch super0 = { #ifndef MDASSEMBLE .examine_super = examine_super0, .brief_examine_super = brief_examine_super0, + .export_examine_super = export_examine_super0, .detail_super = detail_super0, .brief_detail_super = brief_detail_super0, - .export_super = export_super0, + .export_detail_super = export_detail_super0, #endif .match_home = match_home0, .uuid_from_super = uuid_from_super0, diff --git a/super1.c b/super1.c index 7ea6958a..fe915f8d 100644 --- a/super1.c +++ b/super1.c @@ -375,6 +375,40 @@ static void brief_examine_super1(struct supertype *st) printf("\n"); } +static void export_examine_super1(struct supertype *st) +{ + struct mdp_superblock_1 *sb = st->sb; + int i; + int len = 32; + + printf("MD_LEVEL=%s\n", map_num(pers, __le32_to_cpu(sb->level))); + printf("MD_DEVICES=%d\n", __le32_to_cpu(sb->raid_disks)); + for (i=0; i<32; i++) + if (sb->set_name[i] == '\n' || + sb->set_name[i] == '\0') { + len = i; + break; + } + if (len) + printf("MD_NAME=%.*s\n", len, sb->set_name); + printf("MD_UUID="); + for (i=0; i<16; i++) { + if ((i&3)==0 && i != 0) printf(":"); + printf("%02x", sb->set_uuid[i]); + } + printf("\n"); + printf("MD_UPDATE_TIME=%llu\n", + __le64_to_cpu(sb->utime) & 0xFFFFFFFFFFULL); + printf("MD_DEV_UUID="); + for (i=0; i<16; i++) { + if ((i&3)==0 && i != 0) printf(":"); + printf("%02x", sb->device_uuid[i]); + } + printf("\n"); + printf("MD_EVENTS=%llu\n", + (unsigned long long)__le64_to_cpu(sb->events)); +} + static void detail_super1(struct supertype *st, char *homehost) { struct mdp_superblock_1 *sb = st->sb; @@ -408,7 +442,7 @@ static void brief_detail_super1(struct supertype *st) } } -static void export_super1(struct supertype *st) +static void export_detail_super1(struct supertype *st) { struct mdp_superblock_1 *sb = st->sb; int i; @@ -1386,9 +1420,10 @@ struct superswitch super1 = { #ifndef MDASSEMBLE .examine_super = examine_super1, .brief_examine_super = brief_examine_super1, + .export_examine_super = export_examine_super1, .detail_super = detail_super1, .brief_detail_super = brief_detail_super1, - .export_super = export_super1, + .export_detail_super = export_detail_super1, #endif .match_home = match_home1, .uuid_from_super = uuid_from_super1, -- 2.39.2