[dm-devel] [PATCH 12/12] Remove all references to hand-craftes sysfs code

Hannes Reinecke hare at suse.de
Thu Apr 19 09:09:06 UTC 2012


We've now converted everything to libudev, so we can get rid
of all the variables etc.

Signed-off-by: Hannes Reinecke <hare at suse.de>
---
 libmpathpersist/mpath_persist.c |    5 -
 libmultipath/config.c           |    9 +--
 libmultipath/config.h           |    3 -
 libmultipath/dict.c             |   23 +-----
 libmultipath/structs_vec.c      |    1 -
 libmultipath/sysfs.c            |  183 ++++++++++-----------------------------
 libmultipath/sysfs.h            |   21 +----
 multipath/main.c                |    4 -
 multipath/multipath.conf.5      |    4 -
 multipathd/main.c               |    4 -
 10 files changed, 50 insertions(+), 207 deletions(-)

diff --git a/libmpathpersist/mpath_persist.c b/libmpathpersist/mpath_persist.c
index 302dd3f..d99c0da 100644
--- a/libmpathpersist/mpath_persist.c
+++ b/libmpathpersist/mpath_persist.c
@@ -19,7 +19,6 @@
 #include <dmparser.h>
 #include <ctype.h>
 #include <propsel.h>
-#include <sysfs.h>
 
 #include "mpathpr.h"
 #include "mpath_pr_ioctl.h"
@@ -40,10 +39,6 @@ mpath_lib_init (void)
 		return 1;
 	}
 
-	if (sysfs_init(conf->sysfs_dir, FILE_NAME_SIZE)){
-		condlog(0, "Failed. mpathpersist needs sysfs mounted");
-		exit(1);
-	}
 	return 0;
 }
 
diff --git a/libmultipath/config.c b/libmultipath/config.c
index 2263e19..0f17f03 100644
--- a/libmultipath/config.c
+++ b/libmultipath/config.c
@@ -431,9 +431,6 @@ free_config (struct config * conf)
 	if (conf->udev)
 		udev_unref(conf->udev);
 
-	if (conf->udev_dir)
-		FREE(conf->udev_dir);
-
 	if (conf->multipath_dir)
 		FREE(conf->multipath_dir);
 
@@ -597,14 +594,10 @@ load_config (char * file)
 		if (!conf->mptable)
 			goto out;
 	}
-	if (conf->udev_dir == NULL)
-		conf->udev_dir = set_default(DEFAULT_UDEVDIR);
-
 	if (conf->bindings_file == NULL)
 		conf->bindings_file = set_default(DEFAULT_BINDINGS_FILE);
 
-	if (!conf->udev_dir || !conf->multipath_dir ||
-	    !conf->bindings_file)
+	if (!conf->multipath_dir || !conf->bindings_file)
 		goto out;
 
 	return 0;
diff --git a/libmultipath/config.h b/libmultipath/config.h
index 590dde2..bcca7bd 100644
--- a/libmultipath/config.h
+++ b/libmultipath/config.h
@@ -77,7 +77,6 @@ struct config {
 	int dry_run;
 	int list;
 	int pgpolicy_flag;
-	int with_sysfs;
 	int pgpolicy;
 	enum devtypes dev_type;
 	int minio;
@@ -110,8 +109,6 @@ struct config {
 
 	char * dev;
 	struct udev * udev;
-	char * sysfs_dir;
-	char * udev_dir;
 	char * multipath_dir;
 	char * selector;
 	char * uid_attribute;
diff --git a/libmultipath/dict.c b/libmultipath/dict.c
index c51e005..7300b7e 100644
--- a/libmultipath/dict.c
+++ b/libmultipath/dict.c
@@ -112,17 +112,6 @@ reassign_maps_handler(vector strvec)
 }
 
 static int
-udev_dir_handler(vector strvec)
-{
-	conf->udev_dir = set_value(strvec);
-
-	if (!conf->udev_dir)
-		return 1;
-
-	return 0;
-}
-
-static int
 multipath_dir_handler(vector strvec)
 {
 	conf->multipath_dir = set_value(strvec);
@@ -2237,18 +2226,9 @@ snprint_reassign_maps (char * buff, int len, void * data)
 }
 
 static int
-snprint_def_udev_dir (char * buff, int len, void * data)
-{
-	if (!conf->udev_dir)
-		return 0;
-
-	return snprintf(buff, len, "\"%s\"", conf->udev_dir);
-}
-
-static int
 snprint_def_multipath_dir (char * buff, int len, void * data)
 {
-	if (!conf->udev_dir)
+	if (!conf->multipath_dir)
 		return 0;
 
 	return snprintf(buff, len, "\"%s\"", conf->multipath_dir);
@@ -2547,7 +2527,6 @@ init_keywords(void)
 	install_keyword("polling_interval", &polling_interval_handler, &snprint_def_polling_interval);
 	install_keyword("max_polling_interval", &max_polling_interval_handler, &snprint_def_max_polling_interval);
 	install_keyword("reassign_maps", &reassign_maps_handler, &snprint_reassign_maps);
-	install_keyword("udev_dir", &udev_dir_handler, &snprint_def_udev_dir);
 	install_keyword("multipath_dir", &multipath_dir_handler, &snprint_def_multipath_dir);
 	install_keyword("path_selector", &def_selector_handler, &snprint_def_selector);
 	install_keyword("path_grouping_policy", &def_pgpolicy_handler, &snprint_def_path_grouping_policy);
diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c
index e1fb4b1..6e70d63 100644
--- a/libmultipath/structs_vec.c
+++ b/libmultipath/structs_vec.c
@@ -13,7 +13,6 @@
 #include "dmparser.h"
 #include "config.h"
 #include "propsel.h"
-#include "sysfs.h"
 #include "discovery.h"
 #include "prio.h"
 
diff --git a/libmultipath/sysfs.c b/libmultipath/sysfs.c
index 5cd365a..c9dc280 100644
--- a/libmultipath/sysfs.c
+++ b/libmultipath/sysfs.c
@@ -27,6 +27,7 @@
 #include <sys/stat.h>
 #include <string.h>
 #include <dirent.h>
+#include <libudev.h>
 
 #include "checkers.h"
 #include "vector.h"
@@ -37,171 +38,77 @@
 #include "debug.h"
 #include "devmapper.h"
 
-char sysfs_path[PATH_SIZE];
-
-int sysfs_init(char *path, size_t len)
-{
-	if (path) {
-		strlcpy(sysfs_path, path, len);
-		remove_trailing_chars(sysfs_path, '/');
-	} else
-		strlcpy(sysfs_path, "/sys", sizeof(sysfs_path));
-	dbg("sysfs_path='%s'", sysfs_path);
-
-	return 0;
-}
-
-int sysfs_resolve_link(char *devpath, size_t size)
-{
-	char link_path[PATH_SIZE];
-	char link_target[PATH_SIZE];
-	int len;
-	int i;
-	int back;
-
-	strlcpy(link_path, sysfs_path, sizeof(link_path));
-	strlcat(link_path, devpath, sizeof(link_path));
-	len = readlink(link_path, link_target, sizeof(link_target));
-	if (len <= 0)
-		return -1;
-	link_target[len] = '\0';
-	dbg("path link '%s' points to '%s'", devpath, link_target);
-
-	for (back = 0; strncmp(&link_target[back * 3], "../", 3) == 0; back++)
-		;
-	dbg("base '%s', tail '%s', back %i", devpath, &link_target[back * 3], back);
-	for (i = 0; i <= back; i++) {
-		char *pos = strrchr(devpath, '/');
-
-		if (pos == NULL)
-			return -1;
-		pos[0] = '\0';
-	}
-	dbg("after moving back '%s'", devpath);
-	strlcat(devpath, "/", size);
-	strlcat(devpath, &link_target[back * 3], size);
-	return 0;
-}
-
-size_t sysfs_attr_get_value(const char *devpath, const char *attr_name,
-			    char *attr_value, int attr_len)
+ssize_t sysfs_attr_set_value(struct udev_device *dev, const char *attr_name,
+			     char * value, size_t value_len)
 {
-	char path_full[PATH_SIZE];
+	const char *devpath;
 	struct stat statbuf;
 	int fd;
-	ssize_t size;
-	size_t sysfs_len;
+	ssize_t size = -1;
 
-	if (!attr_value || !attr_len)
+	if (!dev || !attr_name || !value)
 		return 0;
 
-	attr_value[0] = '\0';
-	size = 0;
-
-	dbg("open '%s'/'%s'", devpath, attr_name);
-	sysfs_len = strlcpy(path_full, sysfs_path, sizeof(path_full));
-	if(sysfs_len >= sizeof(path_full))
-		sysfs_len = sizeof(path_full) - 1;
-
-	strlcat(path_full, devpath, sizeof(path_full));
-	strlcat(path_full, "/", sizeof(path_full));
-	strlcat(path_full, attr_name, sizeof(path_full));
-
-	if (stat(path_full, &statbuf) != 0) {
-		dbg("stat '%s' failed: %s", path_full, strerror(errno));
-		goto out;
+	devpath = udev_device_get_syspath(dev);
+	condlog(4, "open '%s'/'%s'", devpath, attr_name);
+	if (stat(devpath, &statbuf) != 0) {
+		condlog(4, "stat '%s' failed: %s", devpath, strerror(errno));
+		return 0;
 	}
 
 	/* skip directories */
 	if (S_ISDIR(statbuf.st_mode))
-		goto out;
+		return 0;
 
-	/* skip non-readable files */
-	if ((statbuf.st_mode & S_IRUSR) == 0)
-		goto out;
+	/* skip non-writeable files */
+	if ((statbuf.st_mode & S_IWUSR) == 0)
+		return 0;
 
-	/* read attribute value */
-	fd = open(path_full, O_RDONLY);
+	/* write attribute value */
+	fd = open(devpath, O_WRONLY);
 	if (fd < 0) {
-		dbg("attribute '%s' can not be opened: %s",
-		    path_full, strerror(errno));
-		goto out;
+		condlog(4, "attribute '%s' can not be opened: %s",
+			devpath, strerror(errno));
+		return 0;
 	}
-	size = read(fd, attr_value, attr_len);
-	close(fd);
-	if (size < 0)
-		goto out;
-	if (size == attr_len) {
-		dbg("overflow in attribute '%s', truncating", path_full);
-		size--;
+	size = write(fd, value, value_len);
+	if (size < 0) {
+		condlog(4, "write to %s failed: %s", devpath, strerror(errno));
+		size = 0;
+	} else if (size < value_len) {
+		condlog(4, "tried to write %ld to %s. Wrote %ld\n",
+			(long)value_len, devpath, (long)size);
+		size = 0;
 	}
 
-	/* got a valid value, store and return it */
-	attr_value[size] = '\0';
-	remove_trailing_chars(attr_value, '\n');
-
-out:
+	close(fd);
 	return size;
 }
 
-ssize_t sysfs_attr_set_value(const char *devpath, const char *attr_name,
-			     const char *value, int value_len)
+int
+sysfs_get_size (struct path *pp, unsigned long long * size)
 {
-	char path_full[PATH_SIZE];
-	struct stat statbuf;
-	int fd;
-	ssize_t size = -1;
-	size_t sysfs_len;
-
-	if (!attr_name || !value || !value_len)
-		return 0;
+	const char * attr;
+	int r;
 
-	dbg("open '%s'/'%s'", devpath, attr_name);
-	sysfs_len = snprintf(path_full, PATH_SIZE, "%s%s/%s", sysfs_path,
-			     devpath, attr_name);
-	if (sysfs_len >= PATH_SIZE || sysfs_len < 0) {
-		if (sysfs_len < 0)
-			dbg("cannot copy sysfs path %s%s/%s : %s", sysfs_path,
-			    devpath, attr_name, strerror(errno));
-		else
-			dbg("sysfs_path %s%s/%s too large", sysfs_path,
-			    devpath, attr_name);
-		goto out;
-	}
+	if (!pp->udev)
+		return 1;
 
-	if (stat(path_full, &statbuf) != 0) {
-		dbg("stat '%s' failed: %s", path_full, strerror(errno));
-		goto out;
+	attr = udev_device_get_sysattr_value(pp->udev, "size");
+	if (!attr) {
+		condlog(3, "%s: No size attribute in sysfs", pp->dev);
+		return 1;
 	}
 
-	/* skip directories */
-	if (S_ISDIR(statbuf.st_mode))
-		goto out;
-
-	/* skip non-writeable files */
-	if ((statbuf.st_mode & S_IWUSR) == 0)
-		goto out;
+	r = sscanf(attr, "%llu\n", size);
 
-	/* write attribute value */
-	fd = open(path_full, O_WRONLY);
-	if (fd < 0) {
-		dbg("attribute '%s' can not be opened: %s",
-		    path_full, strerror(errno));
-		goto out;
+	if (r != 1) {
+		condlog(3, "%s: Cannot parse size attribute '%s'",
+			pp->dev, attr);
+		return 1;
 	}
-	size = write(fd, value, value_len);
-	if (size < 0)
-		dbg("write to %s failed: %s", path_full, strerror(errno));
-	else if (size < value_len) {
-		dbg("tried to write %d to %s. Wrote %d\n", value_len,
-		    path_full, size);
-		size = -1;
-	}
-
-	close(fd);
-out:
 
-	return size;
+	return 0;
 }
 
 int sysfs_check_holders(char * check_devt, char * new_devt)
diff --git a/libmultipath/sysfs.h b/libmultipath/sysfs.h
index b5a3f21..13d7545 100644
--- a/libmultipath/sysfs.h
+++ b/libmultipath/sysfs.h
@@ -5,23 +5,8 @@
 #ifndef _LIBMULTIPATH_SYSFS_H
 #define _LIBMULTIPATH_SYSFS_H
 
-#ifdef DEBUG
-# define dbg(format, args...) condlog(4, format, ##args)
-#else
-# define dbg(format, args...) do {} while (0)
-#endif
-
-int sysfs_init(char *path, size_t len);
-void sysfs_cleanup(void);
-struct sysfs_device *sysfs_device_get(const char *devpath);
-struct sysfs_device *sysfs_device_get_parent(struct sysfs_device *dev);
-void sysfs_device_put(struct sysfs_device *dev);
-struct sysfs_device *sysfs_device_verify(struct sysfs_device *dev);
-size_t sysfs_attr_get_value(const char *devpath, const char *attr_name,
-			    char *attr_value, int attr_len);
-ssize_t sysfs_attr_set_value(const char *devpath, const char *attr_name,
-			     const char *value, int value_len);
-int sysfs_resolve_link(char *path, size_t size);
-int sysfs_get_size(struct path *pp, unsigned long long * size);
+ssize_t sysfs_attr_set_value(struct udev_device *dev, const char *attr_name,
+			     char * value, size_t value_len);
+int sysfs_get_size (struct path *pp, unsigned long long * size);
 int sysfs_check_holders(char * check_devt, char * new_devt);
 #endif
diff --git a/multipath/main.c b/multipath/main.c
index 9be52b5..9ea2ae3 100644
--- a/multipath/main.c
+++ b/multipath/main.c
@@ -412,10 +412,6 @@ main (int argc, char *argv[])
 	if (load_config(DEFAULT_CONFIGFILE))
 		exit(1);
 
-	if (sysfs_init(conf->sysfs_dir, FILE_NAME_SIZE)) {
-		condlog(0, "multipath tools need sysfs mounted");
-		exit(1);
-	}
 	while ((arg = getopt(argc, argv, ":dhl::FfM:v:p:b:Brtq")) != EOF ) {
 		switch(arg) {
 		case 1: printf("optarg : %s\n",optarg);
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
index b04a2a9..8dd4a4b 100644
--- a/multipath/multipath.conf.5
+++ b/multipath/multipath.conf.5
@@ -79,10 +79,6 @@ default is
 maximal interval between two path checks in seconds; default is
 .I 4 * polling_interval
 .TP
-.B udev_dir
-directory where udev creates its device nodes; default is
-.I /dev
-.TP
 .B multipath_dir
 directory where the dynamic shared objects are stored; default is system
 dependent, commonly
diff --git a/multipathd/main.c b/multipathd/main.c
index b54f6c6..f7625ca 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -1607,10 +1607,6 @@ child (void * param)
 	if (!vecs)
 		exit(1);
 
-	if (sysfs_init(conf->sysfs_dir, FILE_NAME_SIZE)) {
-		condlog(0, "can not find sysfs mount point");
-		exit(1);
-	}
 	conf->daemon = 1;
 	udev_set_sync_support(0);
 	/*
-- 
1.7.3.4




More information about the dm-devel mailing list