Commit de8c5221 authored by Bryant G. Ly's avatar Bryant G. Ly Committed by Nicholas Bellinger

tcmu: Fix dev_config_store

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: default avatarBryant G. Ly <bryantly@linux.vnet.ibm.com>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 016a5fec
...@@ -1418,19 +1418,14 @@ static int tcmu_netlink_event(struct tcmu_dev *udev, enum tcmu_genl_cmd cmd, ...@@ -1418,19 +1418,14 @@ static int tcmu_netlink_event(struct tcmu_dev *udev, enum tcmu_genl_cmd cmd,
return ret; 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 tcmu_hba *hba = udev->hba->hba_ptr;
struct uio_info *info; struct uio_info *info;
struct tcmu_mailbox *mb; size_t size, used;
size_t size;
size_t used;
int ret = 0;
char *str; char *str;
info = &udev->uio_info; info = &udev->uio_info;
size = snprintf(NULL, 0, "tcm-user/%u/%s/%s", hba->host_id, udev->name, size = snprintf(NULL, 0, "tcm-user/%u/%s/%s", hba->host_id, udev->name,
udev->dev_config); udev->dev_config);
size += 1; /* for \0 */ size += 1; /* for \0 */
...@@ -1439,12 +1434,27 @@ static int tcmu_configure_device(struct se_device *dev) ...@@ -1439,12 +1434,27 @@ static int tcmu_configure_device(struct se_device *dev)
return -ENOMEM; return -ENOMEM;
used = snprintf(str, size, "tcm-user/%u/%s", hba->host_id, udev->name); used = snprintf(str, size, "tcm-user/%u/%s", hba->host_id, udev->name);
if (udev->dev_config[0]) if (udev->dev_config[0])
snprintf(str + used, size - used, "/%s", udev->dev_config); snprintf(str + used, size - used, "/%s", udev->dev_config);
info->name = str; 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); udev->mb_addr = vzalloc(CMDR_SIZE);
if (!udev->mb_addr) { if (!udev->mb_addr) {
ret = -ENOMEM; ret = -ENOMEM;
...@@ -1786,6 +1796,12 @@ static ssize_t tcmu_dev_config_store(struct config_item *item, const char *page, ...@@ -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"); pr_err("Unable to reconfigure device\n");
return ret; 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); strlcpy(udev->dev_config, page, TCMU_CONFIG_LEN);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment