Use udev enumeration during discovery
authorHannes Reinecke <hare@suse.de>
Thu, 19 Apr 2012 09:08:59 +0000 (11:08 +0200)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Fri, 20 Apr 2012 17:47:32 +0000 (19:47 +0200)
Instead of scanning /sys/block by hand we should be using enumeration
provided by udev.

Signed-off-by: Hannes Reinecke <hare@suse.de>
libmultipath/discovery.c

index 426c511..d68324b 100644 (file)
@@ -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;
 }