[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