Neil Brown: Use sysfs info for metadata version info in Detail and elsewhere.

Martin F. Krafft madduck at alioth.debian.org
Wed Jun 25 15:42:23 UTC 2008


Module: mdadm
Branch: build
Commit: 142cb9e181b876b399c548567dad5e011ff3d0dc
URL:    http://git.debian.org/?p=pkg-mdadm/mdadm.git;a=commit;h=142cb9e181b876b399c548567dad5e011ff3d0dc

Author: Neil Brown <neilb at suse.de>
Date:   Fri Dec 14 20:15:21 2007 +1100

Use sysfs info for metadata version info in Detail and elsewhere.

---

 Detail.c |   41 ++++++++++++++++++++++++++++++-----------
 sysfs.c  |    6 +++++-
 util.c   |    4 +++-
 3 files changed, 38 insertions(+), 13 deletions(-)

diff --git a/Detail.c b/Detail.c
index 5a408ec..de1f409 100644
--- a/Detail.c
+++ b/Detail.c
@@ -55,6 +55,7 @@ int Detail(char *dev, int brief, int export, int test, char *homehost)
 	struct supertype *st = NULL;
 	int max_disks = MD_SB_DISKS; /* just a default */
 	struct mdinfo info;
+	struct mdinfo *sra;
 
 	int rv = test ? 4 : 1;
 	int avail_disks = 0;
@@ -88,6 +89,7 @@ int Detail(char *dev, int brief, int export, int test, char *homehost)
 		close(fd);
 		return rv;
 	}
+	sra = sysfs_read(fd, 0, GET_VERSION);
 	st = super_by_fd(fd);
 
 	if (fstat(fd, &stb) != 0 && !S_ISBLK(stb.st_mode))
@@ -133,19 +135,27 @@ int Detail(char *dev, int brief, int export, int test, char *homehost)
 		if (c)
 			printf("MD_LEVEL=%s\n", c);
 		printf("MD_DEVICES=%d\n", array.raid_disks);
-		printf("MD_METADATA=%d.%d\n", array.major_version,
-		       array.minor_version);
+		if (sra && sra->array.major_version < 0)
+			printf("MD_METADATA=%s\n", sra->text_version);
+		else
+			printf("MD_METADATA=%02d.%02d\n",
+			       array.major_version, array.minor_version);
+
 		if (st && st->sb)
 			st->ss->export_super(st);
 		goto out;
 	}
 
-	if (brief)
-		printf("ARRAY %s level=%s metadata=%d.%d num-devices=%d", dev,
+	if (brief) {
+		printf("ARRAY %s level=%s num-devices=%d", dev,
 		       c?c:"-unknown-",
-		       array.major_version, array.minor_version,
 		       array.raid_disks );
-	else {
+		if (sra && sra->array.major_version < 0)
+			printf(" metadata=%s", sra->text_version);
+		else
+			printf(" metadata=%02d.%02d",
+			       array.major_version, array.minor_version);
+	} else {
 		mdu_bitmap_file_t bmf;
 		unsigned long long larray_size;
 		struct mdstat_ent *ms = mdstat_read(0, 0);
@@ -161,10 +171,16 @@ int Detail(char *dev, int brief, int export, int test, char *homehost)
 			larray_size = 0;
 
 		printf("%s:\n", dev);
-		printf("        Version : %02d.%02d.%02d\n",
-		       array.major_version, array.minor_version, array.patch_version);
+
+		if (sra && sra->array.major_version < 0)
+			printf("        Version : %s\n", sra->text_version);
+		else
+			printf("        Version : %02d.%02d\n",
+			       array.major_version, array.minor_version);
+
 		atime = array.ctime;
 		printf("  Creation Time : %.24s\n", ctime(&atime));
+		if (array.raid_disks == 0) c = "container";
 		printf("     Raid Level : %s\n", c?c:"-unknown-");
 		if (larray_size)
 			printf("     Array Size : %llu%s\n", (larray_size>>10), human_size(larray_size));
@@ -185,8 +201,9 @@ int Detail(char *dev, int brief, int export, int test, char *homehost)
 		printf("   Raid Devices : %d\n", array.raid_disks);
 		printf("  Total Devices : %d\n", array.nr_disks);
 		printf("Preferred Minor : %d\n", array.md_minor);
-		printf("    Persistence : Superblock is %spersistent\n",
-		       array.not_persistent?"not ":"");
+		if (sra == NULL || sra->array.major_version >= 0)
+			printf("    Persistence : Superblock is %spersistent\n",
+			       array.not_persistent?"not ":"");
 		printf("\n");
 		/* Only try GET_BITMAP_FILE for 0.90.01 and later */
 		if (vers >= 9001 &&
@@ -224,7 +241,9 @@ int Detail(char *dev, int brief, int export, int test, char *homehost)
 		case 5:
 		case 10:
 		case 6:
-			printf("     Chunk Size : %dK\n\n", array.chunk_size/1024);
+			if (array.chunk_size)
+				printf("     Chunk Size : %dK\n\n",
+				       array.chunk_size/1024);
 			break;
 		case -1:
 			printf("       Rounding : %dK\n\n", array.chunk_size/1024);
diff --git a/sysfs.c b/sysfs.c
index f198d16..03b09fd 100644
--- a/sysfs.c
+++ b/sysfs.c
@@ -106,7 +106,11 @@ struct mdinfo *sysfs_read(int fd, int devnum, unsigned long options)
 		if (strncmp(buf, "none", 4) == 0)
 			sra->array.major_version =
 				sra->array.minor_version = -1;
-		else
+		else if (strncmp(buf, "external:", 9) == 0) {
+			sra->array.major_version = -1;
+			sra->array.minor_version = -2;
+			strcpy(sra->text_version, buf+9);
+		} else
 			sscanf(buf, "%d.%d",
 			       &sra->array.major_version,
 			       &sra->array.minor_version);
diff --git a/util.c b/util.c
index dd8b176..1ba236b 100644
--- a/util.c
+++ b/util.c
@@ -730,7 +730,7 @@ struct supertype *super_by_fd(int fd)
 	int minor;
 	struct supertype *st = NULL;
 	struct mdinfo *sra;
-	char *verstr = NULL;
+	char *verstr;
 	char version[20];
 	int i;
 
@@ -739,11 +739,13 @@ struct supertype *super_by_fd(int fd)
 	if (sra) {
 		vers = sra->array.major_version;
 		minor = sra->array.minor_version;
+		verstr = sra->text_version;
 	} else {
 		if (ioctl(fd, GET_ARRAY_INFO, &array))
 			array.major_version = array.minor_version = 0;
 		vers = array.major_version;
 		minor = array.minor_version;
+		verstr = "";
 	}
 
 	if (vers != -1) {




More information about the pkg-mdadm-commits mailing list