Remove all references to hand-craftes sysfs code
authorHannes Reinecke <hare@suse.de>
Thu, 19 Apr 2012 09:09:06 +0000 (11:09 +0200)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Fri, 20 Apr 2012 17:47:52 +0000 (19:47 +0200)
We've now converted everything to libudev, so we can get rid
of all the variables etc.

Signed-off-by: Hannes Reinecke <hare@suse.de>
libmpathpersist/mpath_persist.c
libmultipath/config.c
libmultipath/config.h
libmultipath/dict.c
libmultipath/structs_vec.c
libmultipath/sysfs.c
libmultipath/sysfs.h
multipath/main.c
multipath/multipath.conf.5
multipathd/main.c

index 302dd3f..d99c0da 100644 (file)
@@ -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;
 }
 
index 2263e19..0f17f03 100644 (file)
@@ -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;
index 590dde2..bcca7bd 100644 (file)
@@ -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;
index c51e005..7300b7e 100644 (file)
@@ -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);
index e1fb4b1..6e70d63 100644 (file)
@@ -13,7 +13,6 @@
 #include "dmparser.h"
 #include "config.h"
 #include "propsel.h"
-#include "sysfs.h"
 #include "discovery.h"
 #include "prio.h"
 
index 5cd365a..c9dc280 100644 (file)
@@ -27,6 +27,7 @@
 #include <sys/stat.h>
 #include <string.h>
 #include <dirent.h>
+#include <libudev.h>
 
 #include "checkers.h"
 #include "vector.h"
 #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)
index b5a3f21..13d7545 100644 (file)
@@ -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
index 9be52b5..9ea2ae3 100644 (file)
@@ -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);
index b04a2a9..8dd4a4b 100644 (file)
@@ -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
index b54f6c6..f7625ca 100644 (file)
@@ -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);
        /*