multipath: fix setting sysfs fc timeout parameters
authorBenjamin Marzinski <bmarzins@redhat.com>
Mon, 20 Aug 2012 22:26:46 +0000 (17:26 -0500)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Tue, 21 Aug 2012 17:39:32 +0000 (19:39 +0200)
Multipath was accidentally trying to write to the directory where
dev_loss_tmo and fast_io_fail_tmo were located instead to the files
themselves. Also, if dev_loss_tmo was unset, it was trying to set it
to 0. Finally, it wasn't correctly checking for errors in setting
the files.  This patch fixes these issues.

Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
libmultipath/discovery.c
libmultipath/sysfs.c

index 3315b5e..33e44b6 100644 (file)
@@ -281,7 +281,8 @@ sysfs_set_rport_tmo(struct multipath *mpp, struct path *pp)
                pp->sg_id.channel, pp->sg_id.scsi_id, rport_id);
 
        snprintf(value, 11, "%u", mpp->dev_loss);
-       if (sysfs_attr_set_value(rport_dev, "dev_loss_tmo", value, 11) < 0) {
+       if (mpp->dev_loss &&
+           sysfs_attr_set_value(rport_dev, "dev_loss_tmo", value, 11) <= 0) {
                if ((!mpp->fast_io_fail ||
                     mpp->fast_io_fail == MP_FAST_IO_FAIL_OFF)
                    && mpp->dev_loss > 600) {
@@ -289,7 +290,7 @@ sysfs_set_rport_tmo(struct multipath *mpp, struct path *pp)
                                "fast_io_fail is not set", mpp->alias);
                        snprintf(value, 11, "%u", 600);
                        if (sysfs_attr_set_value(rport_dev, "dev_loss_tmo",
-                                                value, 11) < 0)
+                                                value, 11) <= 0)
                                condlog(0, "%s failed to set dev_loss_tmo",
                                        mpp->alias);
                        goto out;
@@ -303,7 +304,7 @@ sysfs_set_rport_tmo(struct multipath *mpp, struct path *pp)
                else
                        snprintf(value, 11, "%u", mpp->fast_io_fail);
                if (sysfs_attr_set_value(rport_dev, "fast_io_fail_tmo",
-                                        value, 11) < 0) {
+                                        value, 11) <= 0) {
                        condlog(0, "%s failed to set fast_io_fail_tmo",
                                mpp->alias);
                }
index c9dc280..8e986e8 100644 (file)
@@ -41,7 +41,7 @@
 ssize_t sysfs_attr_set_value(struct udev_device *dev, const char *attr_name,
                             char * value, size_t value_len)
 {
-       const char *devpath;
+       char devpath[PATH_SIZE];
        struct stat statbuf;
        int fd;
        ssize_t size = -1;
@@ -49,8 +49,9 @@ ssize_t sysfs_attr_set_value(struct udev_device *dev, const char *attr_name,
        if (!dev || !attr_name || !value)
                return 0;
 
-       devpath = udev_device_get_syspath(dev);
-       condlog(4, "open '%s'/'%s'", devpath, attr_name);
+       snprintf(devpath, PATH_SIZE, "%s/%s", udev_device_get_syspath(dev),
+                attr_name);
+       condlog(4, "open '%s'", devpath);
        if (stat(devpath, &statbuf) != 0) {
                condlog(4, "stat '%s' failed: %s", devpath, strerror(errno));
                return 0;