tcmu: Fix dev_config_store
authorBryant G. Ly <bryantly@linux.vnet.ibm.com>
Fri, 7 Jul 2017 19:20:00 +0000 (14:20 -0500)
committerNicholas Bellinger <nab@linux-iscsi.org>
Mon, 10 Jul 2017 03:57:56 +0000 (20:57 -0700)
Currently when there is a reconfig, the uio_info->name
does not get updated to reflect the change in the dev_config
name change.

On restart tcmu-runner there will be a mismatch between
the dev_config string in uio and the tcmu structure that contains
the string. When this occurs it'll reload the one in uio
and you lose the reconfigured device path.

v2: Created a helper function for the updating of uio_info

Signed-off-by: Bryant G. Ly <bryantly@linux.vnet.ibm.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
drivers/target/target_core_user.c

index cbbfba0..2f1fa92 100644 (file)
@@ -1418,19 +1418,14 @@ free_skb:
        return ret;
 }
 
-static int tcmu_configure_device(struct se_device *dev)
+static int tcmu_update_uio_info(struct tcmu_dev *udev)
 {
-       struct tcmu_dev *udev = TCMU_DEV(dev);
        struct tcmu_hba *hba = udev->hba->hba_ptr;
        struct uio_info *info;
-       struct tcmu_mailbox *mb;
-       size_t size;
-       size_t used;
-       int ret = 0;
+       size_t size, used;
        char *str;
 
        info = &udev->uio_info;
-
        size = snprintf(NULL, 0, "tcm-user/%u/%s/%s", hba->host_id, udev->name,
                        udev->dev_config);
        size += 1; /* for \0 */
@@ -1439,12 +1434,27 @@ static int tcmu_configure_device(struct se_device *dev)
                return -ENOMEM;
 
        used = snprintf(str, size, "tcm-user/%u/%s", hba->host_id, udev->name);
-
        if (udev->dev_config[0])
                snprintf(str + used, size - used, "/%s", udev->dev_config);
 
        info->name = str;
 
+       return 0;
+}
+
+static int tcmu_configure_device(struct se_device *dev)
+{
+       struct tcmu_dev *udev = TCMU_DEV(dev);
+       struct uio_info *info;
+       struct tcmu_mailbox *mb;
+       int ret = 0;
+
+       ret = tcmu_update_uio_info(udev);
+       if (ret)
+               return ret;
+
+       info = &udev->uio_info;
+
        udev->mb_addr = vzalloc(CMDR_SIZE);
        if (!udev->mb_addr) {
                ret = -ENOMEM;
@@ -1786,6 +1796,12 @@ static ssize_t tcmu_dev_config_store(struct config_item *item, const char *page,
                        pr_err("Unable to reconfigure device\n");
                        return ret;
                }
+               strlcpy(udev->dev_config, page, TCMU_CONFIG_LEN);
+
+               ret = tcmu_update_uio_info(udev);
+               if (ret)
+                       return ret;
+               return count;
        }
        strlcpy(udev->dev_config, page, TCMU_CONFIG_LEN);