| From 1cc45281b892f7d863643e63f08a52b1dee27a80 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 23 Jun 2017 01:18:17 -0500 |
| Subject: xcopy: loop over devices using idr helper |
| |
| From: Mike Christie <mchristi@redhat.com> |
| |
| [ Upstream commit 6906d008b4b06e42cad393ac25bec76fbf31fabd ] |
| |
| This converts the xcopy code to use the idr helper. The next patch |
| will drop the g_device_list and make g_device_mutex local to the |
| target_core_device.c file. |
| |
| Signed-off-by: Mike Christie <mchristi@redhat.com> |
| Reviewed-by: Bart Van Assche <bart.vanassche@wdc.com> |
| Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/target/target_core_xcopy.c | 70 +++++++++++++++++------------- |
| 1 file changed, 41 insertions(+), 29 deletions(-) |
| |
| diff --git a/drivers/target/target_core_xcopy.c b/drivers/target/target_core_xcopy.c |
| index b380f5e2af47d..065669f9ca8cc 100644 |
| --- a/drivers/target/target_core_xcopy.c |
| +++ b/drivers/target/target_core_xcopy.c |
| @@ -52,48 +52,60 @@ static int target_xcopy_gen_naa_ieee(struct se_device *dev, unsigned char *buf) |
| return 0; |
| } |
| |
| -static int target_xcopy_locate_se_dev_e4(const unsigned char *dev_wwn, |
| - struct se_device **found_dev) |
| +struct xcopy_dev_search_info { |
| + const unsigned char *dev_wwn; |
| + struct se_device *found_dev; |
| +}; |
| + |
| +static int target_xcopy_locate_se_dev_e4_iter(struct se_device *se_dev, |
| + void *data) |
| { |
| - struct se_device *se_dev; |
| + struct xcopy_dev_search_info *info = data; |
| unsigned char tmp_dev_wwn[XCOPY_NAA_IEEE_REGEX_LEN]; |
| int rc; |
| |
| - mutex_lock(&g_device_mutex); |
| - list_for_each_entry(se_dev, &g_device_list, g_dev_node) { |
| + if (!se_dev->dev_attrib.emulate_3pc) |
| + return 0; |
| |
| - if (!se_dev->dev_attrib.emulate_3pc) |
| - continue; |
| + memset(&tmp_dev_wwn[0], 0, XCOPY_NAA_IEEE_REGEX_LEN); |
| + target_xcopy_gen_naa_ieee(se_dev, &tmp_dev_wwn[0]); |
| |
| - memset(&tmp_dev_wwn[0], 0, XCOPY_NAA_IEEE_REGEX_LEN); |
| - target_xcopy_gen_naa_ieee(se_dev, &tmp_dev_wwn[0]); |
| + rc = memcmp(&tmp_dev_wwn[0], info->dev_wwn, XCOPY_NAA_IEEE_REGEX_LEN); |
| + if (rc != 0) |
| + return 0; |
| |
| - rc = memcmp(&tmp_dev_wwn[0], dev_wwn, XCOPY_NAA_IEEE_REGEX_LEN); |
| - if (rc != 0) |
| - continue; |
| + info->found_dev = se_dev; |
| + pr_debug("XCOPY 0xe4: located se_dev: %p\n", se_dev); |
| |
| - *found_dev = se_dev; |
| - pr_debug("XCOPY 0xe4: located se_dev: %p\n", se_dev); |
| + rc = target_depend_item(&se_dev->dev_group.cg_item); |
| + if (rc != 0) { |
| + pr_err("configfs_depend_item attempt failed: %d for se_dev: %p\n", |
| + rc, se_dev); |
| + return rc; |
| + } |
| |
| - rc = target_depend_item(&se_dev->dev_group.cg_item); |
| - if (rc != 0) { |
| - pr_err("configfs_depend_item attempt failed:" |
| - " %d for se_dev: %p\n", rc, se_dev); |
| - mutex_unlock(&g_device_mutex); |
| - return rc; |
| - } |
| + pr_debug("Called configfs_depend_item for se_dev: %p se_dev->se_dev_group: %p\n", |
| + se_dev, &se_dev->dev_group); |
| + return 1; |
| +} |
| + |
| +static int target_xcopy_locate_se_dev_e4(const unsigned char *dev_wwn, |
| + struct se_device **found_dev) |
| +{ |
| + struct xcopy_dev_search_info info; |
| + int ret; |
| |
| - pr_debug("Called configfs_depend_item for se_dev: %p" |
| - " se_dev->se_dev_group: %p\n", se_dev, |
| - &se_dev->dev_group); |
| + memset(&info, 0, sizeof(info)); |
| + info.dev_wwn = dev_wwn; |
| |
| - mutex_unlock(&g_device_mutex); |
| + ret = target_for_each_device(target_xcopy_locate_se_dev_e4_iter, &info); |
| + if (ret == 1) { |
| + *found_dev = info.found_dev; |
| return 0; |
| + } else { |
| + pr_debug_ratelimited("Unable to locate 0xe4 descriptor for EXTENDED_COPY\n"); |
| + return -EINVAL; |
| } |
| - mutex_unlock(&g_device_mutex); |
| - |
| - pr_debug_ratelimited("Unable to locate 0xe4 descriptor for EXTENDED_COPY\n"); |
| - return -EINVAL; |
| } |
| |
| static int target_xcopy_parse_tiddesc_e4(struct se_cmd *se_cmd, struct xcopy_op *xop, |
| -- |
| 2.27.0 |
| |