dcavalca / rpms / mdadm

Forked from rpms/mdadm 3 years ago
Clone

Blame SOURCES/Query-Use-sysfs-to-obtain-data-if-possible.patch

b7f731
From f22d6cde7c7e4be38230ac4c51c3af850ed1614e Mon Sep 17 00:00:00 2001
b7f731
From: Jes Sorensen <jsorensen@fb.com>
b7f731
Date: Thu, 13 Apr 2017 12:20:46 -0400
b7f731
Subject: [RHEL7.5 PATCH 080/169] Query: Use sysfs to obtain data if
b7f731
 possible
b7f731
b7f731
Use sysfs to obtain leve, raid_disks, and spare_disks. If sysfs fails,
b7f731
fall back to calling the ioctl via md_get_array_info().
b7f731
b7f731
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
b7f731
---
b7f731
 Query.c | 32 ++++++++++++++++++++++----------
b7f731
 1 file changed, 22 insertions(+), 10 deletions(-)
b7f731
b7f731
diff --git a/Query.c b/Query.c
b7f731
index 0d18da4..b761c47 100644
b7f731
--- a/Query.c
b7f731
+++ b/Query.c
b7f731
@@ -35,7 +35,9 @@ int Query(char *dev)
b7f731
 	int fd;
b7f731
 	int ioctlerr, staterr;
b7f731
 	int superror;
b7f731
+	int level, raid_disks, spare_disks;
b7f731
 	struct mdinfo info;
b7f731
+	struct mdinfo *sra;
b7f731
 	mdu_array_info_t array;
b7f731
 	struct supertype *st = NULL;
b7f731
 	unsigned long long larray_size;
b7f731
@@ -50,16 +52,28 @@ int Query(char *dev)
b7f731
 		return 1;
b7f731
 	}
b7f731
 
b7f731
-	if (md_get_array_info(fd, &array) < 0)
b7f731
-		ioctlerr = errno;
b7f731
-	else
b7f731
-		ioctlerr = 0;
b7f731
-
b7f731
 	if (fstat(fd, &stb) < 0)
b7f731
 		staterr = errno;
b7f731
 	else
b7f731
 		staterr = 0;
b7f731
 
b7f731
+	ioctlerr = 0;
b7f731
+
b7f731
+	sra = sysfs_read(fd, dev, GET_DISKS | GET_LEVEL | GET_DEVS | GET_STATE);
b7f731
+	if (sra) {
b7f731
+		level = sra->array.level;
b7f731
+		raid_disks = sra->array.raid_disks;
b7f731
+		spare_disks = sra->array.spare_disks;
b7f731
+	} else {
b7f731
+		if (md_get_array_info(fd, &array) < 0) {
b7f731
+			ioctlerr = errno;
b7f731
+		} else {
b7f731
+			level = array.level;
b7f731
+			raid_disks = array.raid_disks;
b7f731
+			spare_disks = array.spare_disks;
b7f731
+		}
b7f731
+	}
b7f731
+
b7f731
 	if (!ioctlerr && !staterr) {
b7f731
 		if (!get_dev_size(fd, NULL, &larray_size))
b7f731
 			larray_size = 0;
b7f731
@@ -75,11 +89,9 @@ int Query(char *dev)
b7f731
 		       dev, strerror(ioctlerr));
b7f731
 	else {
b7f731
 		printf("%s: %s %s %d devices, %d spare%s. Use mdadm --detail for more detail.\n",
b7f731
-		       dev,
b7f731
-		       human_size_brief(larray_size,IEC),
b7f731
-		       map_num(pers, array.level),
b7f731
-		       array.raid_disks,
b7f731
-		       array.spare_disks, array.spare_disks==1?"":"s");
b7f731
+		       dev, human_size_brief(larray_size,IEC),
b7f731
+		       map_num(pers, level), raid_disks,
b7f731
+		       spare_disks, spare_disks == 1 ? "" : "s");
b7f731
 	}
b7f731
 	st = guess_super(fd);
b7f731
 	if (st && st->ss->compare_super != NULL)
b7f731
-- 
b7f731
2.7.4
b7f731