File 0001-Don-t-rely-on-searching-for-block-in-sysfs-path-for-.patch of Package ledmon

From f0e0aac35deb8052f93256488e933409bdbfdc21 Mon Sep 17 00:00:00 2001
From: Zhilong Liu <zlliu@suse.com>
Date: Fri, 12 May 2017 16:13:04 +0800
Subject: [PATCH] Don't rely on searching for "/block" in sysfs path for
 detecting partitions

It is simpler and more reliable to check for a "partition" file in the device's
directory (supported since kernel 2.6.28). The previous approach would fail for
nvme devices because their device path looks like this:
/sys/devices/pci0000:00/0000:00:0c.0/nvme/nvme0/nvme0n1

Fixes: b30173ec8c05 ("* fix off-normal-failure block dev status loop * remove
unused raid->slave_list member * support md raid on block device partitions")

Signed-off-by: Zhilong Liu <zlliu@suse.com>
---
 src/slave.c | 27 ++++++++++++++-------------
 1 file changed, 14 insertions(+), 13 deletions(-)

diff --git a/src/slave.c b/src/slave.c
index 9843ffd..436ed4a 100644
--- a/src/slave.c
+++ b/src/slave.c
@@ -22,6 +22,8 @@
 #include <string.h>
 #include <stdlib.h>
 #include <stdint.h>
+#include <stdio.h>
+#include <sys/stat.h>
 
 #if _HAVE_DMALLOC_H
 #include <dmalloc.h>
@@ -100,27 +102,26 @@ static struct block_device *_get_block(const char *path, void *block_list)
 {
 	char temp[PATH_MAX];
 	char link[PATH_MAX];
-	char *ptr;
-	struct block_device *device = NULL;
 
 	str_cpy(temp, path, PATH_MAX);
 	str_cat(temp, "/block", PATH_MAX);
 
-	if (realpath(temp, link)) {
-		ptr = strrchr(link, '/');
-		if (ptr && link < ptr - strlen("/block")) {
-			/* translate partition to master block dev */
-			if(strncmp(
-				ptr - strlen("/block"),
-				"/block",
-				strlen("/block"))) {
+	if (!realpath(temp, link))
+		return NULL;
 
+	/* translate partition to master block dev */
+	if (snprintf(temp, PATH_MAX, "%s/partition", link) > 0) {
+		struct stat sb;
+		char *ptr;
+
+		if (stat(temp, &sb) == 0 && S_ISREG(sb.st_mode)) {
+			ptr = strrchr(link, '/');
+			if (ptr)
 				*ptr = '\0';
-			}
-			device = list_first_that(block_list, _compare, link);
 		}
 	}
-	return device;
+
+	return list_first_that(block_list, _compare, link);
 }
 
 /**
-- 
2.6.6

openSUSE Build Service is sponsored by