[dm-devel] [PATCH 05/16] Use udev enumeration during discovery

Hannes Reinecke hare at suse.de
Mon Apr 30 10:25:57 UTC 2012


Instead of scanning /sys/block by hand we should be using enumeration
provided by udev.

Signed-off-by: Hannes Reinecke <hare at suse.de>
---
 libmultipath/discovery.c |   40 ++++++++++++++++++----------------------
 1 files changed, 18 insertions(+), 22 deletions(-)

diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index 426c511..d68324b 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -11,6 +11,7 @@
 #include <dirent.h>
 #include <errno.h>
 #include <libgen.h>
+#include <libudev.h>
 
 #include "checkers.h"
 #include "vector.h"
@@ -91,37 +92,32 @@ path_discover (vector pathvec, struct config * conf, char * devname, int flag)
 int
 path_discovery (vector pathvec, struct config * conf, int flag)
 {
-	DIR *blkdir;
-	struct dirent *blkdev;
-	struct stat statbuf;
-	char devpath[PATH_MAX];
+	struct udev_enumerate *udev_iter;
+	struct udev_list_entry *entry;
+	char *devpath;
 	char *devptr;
 	int r = 0;
 
-	if (!(blkdir = opendir("/sys/block")))
+	udev_iter = udev_enumerate_new(conf->udev);
+	if (!udev_iter)
 		return 1;
 
-	strcpy(devpath,"/sys/block");
-	while ((blkdev = readdir(blkdir)) != NULL) {
-		if ((strcmp(blkdev->d_name,".") == 0) ||
-		    (strcmp(blkdev->d_name,"..") == 0))
-			continue;
-
-		devptr = devpath + 10;
-		*devptr = '\0';
-		strcat(devptr,"/");
-		strcat(devptr,blkdev->d_name);
-		if (stat(devpath, &statbuf) < 0)
-			continue;
-
-		if (S_ISDIR(statbuf.st_mode) == 0)
-			continue;
+	udev_enumerate_add_match_subsystem(udev_iter, "block");
+	udev_enumerate_scan_devices(udev_iter);
 
+	udev_list_entry_foreach(entry,
+				udev_enumerate_get_list_entry(udev_iter)) {
+		devpath = udev_list_entry_get_name(entry);
 		condlog(4, "Discover device %s", devpath);
+		devptr = strrchr(devpath, '/');
+		if (devptr)
+			devptr++;
+		else
+			devptr = devpath;
 
-		r += path_discover(pathvec, conf, blkdev->d_name, flag);
+		r += path_discover(pathvec, conf, devptr, flag);
 	}
-	closedir(blkdir);
+	udev_enumerate_unref(udev_iter);
 	condlog(4, "Discovery status %d", r);
 	return r;
 }
-- 
1.7.3.4




More information about the dm-devel mailing list