mirror of https://gitee.com/openkylin/linux.git
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: Bryant G. Ly <bryantly@linux.vnet.ibm.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
016a5fec19
commit
de8c5221aa
|
@ -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)
|
||||||
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,
|
||||||
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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue