* [PATCH v2 1/7] target: core: add common tpg/enable attribute
2021-03-22 8:05 [PATCH v2 0/7] target: make tpg/enable attribute Dmitry Bogdanov
@ 2021-03-22 8:05 ` Dmitry Bogdanov
2021-03-22 17:35 ` Mike Christie
2021-03-24 21:51 ` Konstantin Shelekhin
2021-03-22 8:05 ` [PATCH v2 2/7] target: iscsi: replace enable attr to ops.enable Dmitry Bogdanov
` (6 subsequent siblings)
7 siblings, 2 replies; 13+ messages in thread
From: Dmitry Bogdanov @ 2021-03-22 8:05 UTC (permalink / raw)
To: Martin Petersen, target-devel
Cc: linux-scsi, linux, Nilesh Javali, Chris Boot, Bart Van Assche,
Michael Cyr, Felipe Balbi, Dmitry Bogdanov, Roman Bolshakov
Many fabric modules provide their own implementation of enable
attribute in tpg.
The change provides a way to remove code duplication in the fabric
modules and automatically add "enable" attribute if a fabric module has
an implementation of fabric_enable_tpg() ops.
Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com>
Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
---
v2:
create enable atribute only for modules with enable_tpg ops
drivers/target/target_core_configfs.c | 1 +
drivers/target/target_core_fabric_configfs.c | 40 ++++++++++++++++++-
drivers/target/target_core_internal.h | 1 +
drivers/target/target_core_tpg.c | 41 ++++++++++++++++++++
include/target/target_core_base.h | 1 +
include/target/target_core_fabric.h | 1 +
6 files changed, 83 insertions(+), 2 deletions(-)
diff --git a/drivers/target/target_core_configfs.c b/drivers/target/target_core_configfs.c
index f04352285155..fc3949e91f9c 100644
--- a/drivers/target/target_core_configfs.c
+++ b/drivers/target/target_core_configfs.c
@@ -490,6 +490,7 @@ void target_unregister_template(const struct target_core_fabric_ops *fo)
* fabric driver unload of TFO->module to proceed.
*/
rcu_barrier();
+ kfree(t->tf_tpg_base_cit.ct_attrs);
kfree(t);
return;
}
diff --git a/drivers/target/target_core_fabric_configfs.c b/drivers/target/target_core_fabric_configfs.c
index ee85602213f7..c5e1b0d54330 100644
--- a/drivers/target/target_core_fabric_configfs.c
+++ b/drivers/target/target_core_fabric_configfs.c
@@ -815,8 +815,40 @@ static struct configfs_item_operations target_fabric_tpg_base_item_ops = {
.release = target_fabric_tpg_release,
};
-TF_CIT_SETUP_DRV(tpg_base, &target_fabric_tpg_base_item_ops, NULL);
+static int
+target_fabric_setup_tpg_base_cit(struct target_fabric_configfs *tf)
+{
+ int i, k, len = 0;
+ struct config_item_type *cit = &tf->tf_tpg_base_cit;
+ struct configfs_attribute **attrs;
+
+ if (tf->tf_ops->fabric_enable_tpg)
+ for (i = 0; core_tpg_base_enable_attrs[i]; i++)
+ len += sizeof(struct configfs_attribute *);
+ if (tf->tf_ops->tfc_tpg_base_attrs)
+ for (i = 0; tf->tf_ops->tfc_tpg_base_attrs[i]; i++)
+ len += sizeof(struct configfs_attribute *);
+ len += sizeof(struct configfs_attribute *);
+
+ attrs = kzalloc(len, GFP_KERNEL);
+ if (!attrs)
+ return -ENOMEM;
+
+ if (tf->tf_ops->fabric_enable_tpg)
+ for (i = 0; core_tpg_base_enable_attrs[i]; i++)
+ attrs[i] = core_tpg_base_enable_attrs[i];
+ if (tf->tf_ops->tfc_tpg_base_attrs)
+ for (k = 0; tf->tf_ops->tfc_tpg_base_attrs[k]; k++, i++)
+ attrs[i] = tf->tf_ops->tfc_tpg_base_attrs[k];
+ attrs[i] = NULL;
+
+ cit->ct_item_ops = &target_fabric_tpg_base_item_ops;
+ cit->ct_attrs = attrs;
+ cit->ct_owner = tf->tf_ops->module;
+ pr_debug("Setup generic tpg_base\n");
+ return 0;
+}
/* End of tfc_tpg_base_cit */
/* Start of tfc_tpg_cit */
@@ -971,11 +1003,15 @@ TF_CIT_SETUP_DRV(discovery, NULL, NULL);
int target_fabric_setup_cits(struct target_fabric_configfs *tf)
{
+ int ret;
+
target_fabric_setup_discovery_cit(tf);
target_fabric_setup_wwn_cit(tf);
target_fabric_setup_wwn_fabric_stats_cit(tf);
target_fabric_setup_tpg_cit(tf);
- target_fabric_setup_tpg_base_cit(tf);
+ ret = target_fabric_setup_tpg_base_cit(tf);
+ if (ret)
+ return ret;
target_fabric_setup_tpg_port_cit(tf);
target_fabric_setup_tpg_port_stat_cit(tf);
target_fabric_setup_tpg_lun_cit(tf);
diff --git a/drivers/target/target_core_internal.h b/drivers/target/target_core_internal.h
index e7b3c6e5d574..274fd670bf9c 100644
--- a/drivers/target/target_core_internal.h
+++ b/drivers/target/target_core_internal.h
@@ -117,6 +117,7 @@ int core_tmr_lun_reset(struct se_device *, struct se_tmr_req *,
/* target_core_tpg.c */
extern struct se_device *g_lun0_dev;
+extern struct configfs_attribute *core_tpg_base_enable_attrs[];
struct se_node_acl *__core_tpg_get_initiator_node_acl(struct se_portal_group *tpg,
const char *);
diff --git a/drivers/target/target_core_tpg.c b/drivers/target/target_core_tpg.c
index 736847c933e5..d06b3fbd8511 100644
--- a/drivers/target/target_core_tpg.c
+++ b/drivers/target/target_core_tpg.c
@@ -650,3 +650,44 @@ void core_tpg_remove_lun(
percpu_ref_exit(&lun->lun_ref);
}
+
+
+static ssize_t core_tpg_base_enable_show(struct config_item *item, char *page)
+{
+ return sysfs_emit(page, "%d\n", to_tpg(item)->enabled);
+}
+
+static ssize_t core_tpg_base_enable_store(struct config_item *item,
+ const char *page, size_t count)
+{
+ struct se_portal_group *se_tpg = to_tpg(item);
+ int ret;
+ u32 op;
+
+ ret = kstrtou32(page, 0, &op);
+ if (ret)
+ return ret;
+ if ((op != 1) && (op != 0)) {
+ pr_err("Illegal value for tpg_enable: %u\n", op);
+ return -EINVAL;
+ }
+
+ if (se_tpg->enabled == op)
+ return count;
+
+ ret = se_tpg->se_tpg_tfo->fabric_enable_tpg(se_tpg, op);
+
+ if (ret)
+ return ret;
+
+ se_tpg->enabled = op;
+
+ return count;
+}
+
+CONFIGFS_ATTR(core_tpg_base_, enable);
+
+struct configfs_attribute *core_tpg_base_enable_attrs[] = {
+ &core_tpg_base_attr_enable,
+ NULL,
+};
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index 54dcc0eb25fa..fabc9dccfeb2 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -885,6 +885,7 @@ struct se_portal_group {
* Negative values can be used by fabric drivers for internal use TPGs.
*/
int proto_id;
+ bool enabled;
/* Used for PR SPEC_I_PT=1 and REGISTER_AND_MOVE */
atomic_t tpg_pr_ref_count;
/* Spinlock for adding/removing ACLed Nodes */
diff --git a/include/target/target_core_fabric.h b/include/target/target_core_fabric.h
index d60a3eb7517a..b7e409e9e13e 100644
--- a/include/target/target_core_fabric.h
+++ b/include/target/target_core_fabric.h
@@ -89,6 +89,7 @@ struct target_core_fabric_ops {
void (*add_wwn_groups)(struct se_wwn *);
struct se_portal_group *(*fabric_make_tpg)(struct se_wwn *,
const char *);
+ int (*fabric_enable_tpg)(struct se_portal_group *se_tpg, bool enable);
void (*fabric_drop_tpg)(struct se_portal_group *);
int (*fabric_post_link)(struct se_portal_group *,
struct se_lun *);
--
2.25.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v2 1/7] target: core: add common tpg/enable attribute
2021-03-22 8:05 ` [PATCH v2 1/7] target: core: add common " Dmitry Bogdanov
@ 2021-03-22 17:35 ` Mike Christie
2021-03-22 17:55 ` Dmitriy Bogdanov
2021-03-24 21:51 ` Konstantin Shelekhin
1 sibling, 1 reply; 13+ messages in thread
From: Mike Christie @ 2021-03-22 17:35 UTC (permalink / raw)
To: Dmitry Bogdanov, Martin Petersen, target-devel
Cc: linux-scsi, linux, Nilesh Javali, Chris Boot, Bart Van Assche,
Michael Cyr, Felipe Balbi, Roman Bolshakov
On 3/22/21 3:05 AM, Dmitry Bogdanov wrote:
> Many fabric modules provide their own implementation of enable
> attribute in tpg.
> The change provides a way to remove code duplication in the fabric
> modules and automatically add "enable" attribute if a fabric module has
> an implementation of fabric_enable_tpg() ops.
>
> Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com>
> Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
> ---
> v2:
> create enable atribute only for modules with enable_tpg ops
>
> drivers/target/target_core_configfs.c | 1 +
> drivers/target/target_core_fabric_configfs.c | 40 ++++++++++++++++++-
> drivers/target/target_core_internal.h | 1 +
> drivers/target/target_core_tpg.c | 41 ++++++++++++++++++++
> include/target/target_core_base.h | 1 +
> include/target/target_core_fabric.h | 1 +
> 6 files changed, 83 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/target/target_core_configfs.c b/drivers/target/target_core_configfs.c
> index f04352285155..fc3949e91f9c 100644
> --- a/drivers/target/target_core_configfs.c
> +++ b/drivers/target/target_core_configfs.c
> @@ -490,6 +490,7 @@ void target_unregister_template(const struct target_core_fabric_ops *fo)
> * fabric driver unload of TFO->module to proceed.
> */
> rcu_barrier();
> + kfree(t->tf_tpg_base_cit.ct_attrs);
> kfree(t);
> return;
> }
> diff --git a/drivers/target/target_core_fabric_configfs.c b/drivers/target/target_core_fabric_configfs.c
> index ee85602213f7..c5e1b0d54330 100644
> --- a/drivers/target/target_core_fabric_configfs.c
> +++ b/drivers/target/target_core_fabric_configfs.c
> @@ -815,8 +815,40 @@ static struct configfs_item_operations target_fabric_tpg_base_item_ops = {
> .release = target_fabric_tpg_release,
> };
>
> -TF_CIT_SETUP_DRV(tpg_base, &target_fabric_tpg_base_item_ops, NULL);
> +static int
> +target_fabric_setup_tpg_base_cit(struct target_fabric_configfs *tf)
> +{
> + int i, k, len = 0;
> + struct config_item_type *cit = &tf->tf_tpg_base_cit;
> + struct configfs_attribute **attrs;
> +
> + if (tf->tf_ops->fabric_enable_tpg)
> + for (i = 0; core_tpg_base_enable_attrs[i]; i++)
> + len += sizeof(struct configfs_attribute *);
> + if (tf->tf_ops->tfc_tpg_base_attrs)
> + for (i = 0; tf->tf_ops->tfc_tpg_base_attrs[i]; i++)
> + len += sizeof(struct configfs_attribute *);
> + len += sizeof(struct configfs_attribute *);
> +
> + attrs = kzalloc(len, GFP_KERNEL);
> + if (!attrs)
> + return -ENOMEM;
> +
> + if (tf->tf_ops->fabric_enable_tpg)
> + for (i = 0; core_tpg_base_enable_attrs[i]; i++)
> + attrs[i] = core_tpg_base_enable_attrs[i];
> + if (tf->tf_ops->tfc_tpg_base_attrs)
> + for (k = 0; tf->tf_ops->tfc_tpg_base_attrs[k]; k++, i++)
If fabric_enable_tpg is not set then I think i is the value from above
when we did the tfc_tpg_base_attrs loop to calculate the total len needed
for the kzalloc.
> + attrs[i] = tf->tf_ops->tfc_tpg_base_attrs[k];
> + attrs[i] = NULL;
If fabric_enable_tpg and tfc_tpg_base_attrs attrs is not set then i is
not initialized.
I'm guessing you guys do more testing with tcm_qla. Maybe also do a quick
target creation test with iscsi and loop to hit some of the different combos.
> +
> + cit->ct_item_ops = &target_fabric_tpg_base_item_ops;
> + cit->ct_attrs = attrs;
> + cit->ct_owner = tf->tf_ops->module;
> + pr_debug("Setup generic tpg_base\n");
>
> + return 0;
> +}
> /* End of tfc_tpg_base_cit */
>
> /* Start of tfc_tpg_cit */
> @@ -971,11 +1003,15 @@ TF_CIT_SETUP_DRV(discovery, NULL, NULL);
>
> int target_fabric_setup_cits(struct target_fabric_configfs *tf)
> {
> + int ret;
> +
> target_fabric_setup_discovery_cit(tf);
> target_fabric_setup_wwn_cit(tf);
> target_fabric_setup_wwn_fabric_stats_cit(tf);
> target_fabric_setup_tpg_cit(tf);
> - target_fabric_setup_tpg_base_cit(tf);
Add newline
> + ret = target_fabric_setup_tpg_base_cit(tf);
> + if (ret)
> + return ret;
Add newline
> target_fabric_setup_tpg_port_cit(tf);
> target_fabric_setup_tpg_port_stat_cit(tf);
> target_fabric_setup_tpg_lun_cit(tf);
> diff --git a/drivers/target/target_core_internal.h b/drivers/target/target_core_internal.h
> index e7b3c6e5d574..274fd670bf9c 100644
> --- a/drivers/target/target_core_internal.h
> +++ b/drivers/target/target_core_internal.h
> @@ -117,6 +117,7 @@ int core_tmr_lun_reset(struct se_device *, struct se_tmr_req *,
>
> /* target_core_tpg.c */
> extern struct se_device *g_lun0_dev;
> +extern struct configfs_attribute *core_tpg_base_enable_attrs[];
>
> struct se_node_acl *__core_tpg_get_initiator_node_acl(struct se_portal_group *tpg,
> const char *);
> diff --git a/drivers/target/target_core_tpg.c b/drivers/target/target_core_tpg.c
> index 736847c933e5..d06b3fbd8511 100644
> --- a/drivers/target/target_core_tpg.c
> +++ b/drivers/target/target_core_tpg.c
> @@ -650,3 +650,44 @@ void core_tpg_remove_lun(
>
> percpu_ref_exit(&lun->lun_ref);
> }
> +
Delete extra newline.
> +
> +static ssize_t core_tpg_base_enable_show(struct config_item *item, char *page)
> +{
> + return sysfs_emit(page, "%d\n", to_tpg(item)->enabled);
> +}
> +
> +static ssize_t core_tpg_base_enable_store(struct config_item *item,
> + const char *page, size_t count)
> +{
> + struct se_portal_group *se_tpg = to_tpg(item);
> + int ret;
> + u32 op;
> +
> + ret = kstrtou32(page, 0, &op);
> + if (ret)
> + return ret;
Add a newline.
> + if ((op != 1) && (op != 0)) {
> + pr_err("Illegal value for tpg_enable: %u\n", op);
> + return -EINVAL;
> + }
> +
> + if (se_tpg->enabled == op)
> + return count;
> +
> + ret = se_tpg->se_tpg_tfo->fabric_enable_tpg(se_tpg, op);
> +
Delete extra newline.
> + if (ret)
> + return ret;
> +
> + se_tpg->enabled = op;
> +
> + return count;
> +}
^ permalink raw reply [flat|nested] 13+ messages in thread
* RE: [PATCH v2 1/7] target: core: add common tpg/enable attribute
2021-03-22 17:35 ` Mike Christie
@ 2021-03-22 17:55 ` Dmitriy Bogdanov
0 siblings, 0 replies; 13+ messages in thread
From: Dmitriy Bogdanov @ 2021-03-22 17:55 UTC (permalink / raw)
To: Mike Christie, Martin Petersen, target-devel
Cc: linux-scsi, linux, Nilesh Javali, Chris Boot, Bart Van Assche,
Michael Cyr, Felipe Balbi, Roman Bolshakov
Hi Mike,
Thank you for the comments.
> > + if (tf->tf_ops->fabric_enable_tpg)
> > + for (i = 0; core_tpg_base_enable_attrs[i]; i++)
> > + attrs[i] = core_tpg_base_enable_attrs[i];
> > + if (tf->tf_ops->tfc_tpg_base_attrs)
> > + for (k = 0; tf->tf_ops->tfc_tpg_base_attrs[k]; k++, i++)
> If fabric_enable_tpg is not set then I think i is the value from above when we did the tfc_tpg_base_attrs loop to calculate the total len needed for the kzalloc.
Yes, you are right, will fix it.
> > + attrs[i] = tf->tf_ops->tfc_tpg_base_attrs[k];
> > + attrs[i] = NULL;
> If fabric_enable_tpg and tfc_tpg_base_attrs attrs is not set then i is not initialized.
Yes, you are right, will fix it.
> I'm guessing you guys do more testing with tcm_qla. Maybe also do a quick target creation test with iscsi and loop to hit some of the different combos.
Shame on me. I did tests for v1 and believed that v2 also works because of trivial changes. I will test each version before submission in the future.
BR,
Dmitry
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v2 1/7] target: core: add common tpg/enable attribute
2021-03-22 8:05 ` [PATCH v2 1/7] target: core: add common " Dmitry Bogdanov
2021-03-22 17:35 ` Mike Christie
@ 2021-03-24 21:51 ` Konstantin Shelekhin
1 sibling, 0 replies; 13+ messages in thread
From: Konstantin Shelekhin @ 2021-03-24 21:51 UTC (permalink / raw)
To: Dmitry Bogdanov
Cc: Martin Petersen, target-devel, linux-scsi, linux, Nilesh Javali,
Chris Boot, Bart Van Assche, Michael Cyr, Felipe Balbi,
Roman Bolshakov
On Mon, Mar 22, 2021 at 11:05:48AM +0300, Dmitry Bogdanov wrote:
> +static int
> +target_fabric_setup_tpg_base_cit(struct target_fabric_configfs *tf)
> +{
> + int i, k, len = 0;
> + struct config_item_type *cit = &tf->tf_tpg_base_cit;
> + struct configfs_attribute **attrs;
> +
> + if (tf->tf_ops->fabric_enable_tpg)
> + for (i = 0; core_tpg_base_enable_attrs[i]; i++)
> + len += sizeof(struct configfs_attribute *);
...
> + if (tf->tf_ops->fabric_enable_tpg)
> + for (i = 0; core_tpg_base_enable_attrs[i]; i++)
...
>+CONFIGFS_ATTR(core_tpg_base_, enable);
>+
>+struct configfs_attribute *core_tpg_base_enable_attrs[] = {
>+ &core_tpg_base_attr_enable,
>+ NULL,
I believe that there is no real benefit in core_tpg_base_enable_attrs[]
with only one attribute. Just use core_tpg_base_attr_enable directly.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 2/7] target: iscsi: replace enable attr to ops.enable
2021-03-22 8:05 [PATCH v2 0/7] target: make tpg/enable attribute Dmitry Bogdanov
2021-03-22 8:05 ` [PATCH v2 1/7] target: core: add common " Dmitry Bogdanov
@ 2021-03-22 8:05 ` Dmitry Bogdanov
2021-03-22 17:43 ` Mike Christie
2021-03-22 8:05 ` [PATCH v2 3/7] target: qla2xx: " Dmitry Bogdanov
` (5 subsequent siblings)
7 siblings, 1 reply; 13+ messages in thread
From: Dmitry Bogdanov @ 2021-03-22 8:05 UTC (permalink / raw)
To: Martin Petersen, target-devel
Cc: linux-scsi, linux, Nilesh Javali, Chris Boot, Bart Van Assche,
Michael Cyr, Felipe Balbi, Dmitry Bogdanov, Roman Bolshakov
Remove tpg/enable attribute.
Add fabric ops enable_tpg impalmentation instead.
Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com>
Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
---
drivers/target/iscsi/iscsi_target_configfs.c | 91 +++++++-------------
1 file changed, 32 insertions(+), 59 deletions(-)
diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c
index 0fa1d57b26fa..be7289728f2d 100644
--- a/drivers/target/iscsi/iscsi_target_configfs.c
+++ b/drivers/target/iscsi/iscsi_target_configfs.c
@@ -1006,74 +1006,15 @@ static struct configfs_attribute *lio_target_tpg_param_attrs[] = {
/* Start items for lio_target_tpg_cit */
-static ssize_t lio_target_tpg_enable_show(struct config_item *item, char *page)
-{
- struct se_portal_group *se_tpg = to_tpg(item);
- struct iscsi_portal_group *tpg = container_of(se_tpg,
- struct iscsi_portal_group, tpg_se_tpg);
- ssize_t len;
-
- spin_lock(&tpg->tpg_state_lock);
- len = sprintf(page, "%d\n",
- (tpg->tpg_state == TPG_STATE_ACTIVE) ? 1 : 0);
- spin_unlock(&tpg->tpg_state_lock);
-
- return len;
-}
-
-static ssize_t lio_target_tpg_enable_store(struct config_item *item,
- const char *page, size_t count)
-{
- struct se_portal_group *se_tpg = to_tpg(item);
- struct iscsi_portal_group *tpg = container_of(se_tpg,
- struct iscsi_portal_group, tpg_se_tpg);
- u32 op;
- int ret;
-
- ret = kstrtou32(page, 0, &op);
- if (ret)
- return ret;
- if ((op != 1) && (op != 0)) {
- pr_err("Illegal value for tpg_enable: %u\n", op);
- return -EINVAL;
- }
-
- ret = iscsit_get_tpg(tpg);
- if (ret < 0)
- return -EINVAL;
-
- if (op) {
- ret = iscsit_tpg_enable_portal_group(tpg);
- if (ret < 0)
- goto out;
- } else {
- /*
- * iscsit_tpg_disable_portal_group() assumes force=1
- */
- ret = iscsit_tpg_disable_portal_group(tpg, 1);
- if (ret < 0)
- goto out;
- }
-
- iscsit_put_tpg(tpg);
- return count;
-out:
- iscsit_put_tpg(tpg);
- return -EINVAL;
-}
-
-
static ssize_t lio_target_tpg_dynamic_sessions_show(struct config_item *item,
char *page)
{
return target_show_dynamic_sessions(to_tpg(item), page);
}
-CONFIGFS_ATTR(lio_target_tpg_, enable);
CONFIGFS_ATTR_RO(lio_target_tpg_, dynamic_sessions);
static struct configfs_attribute *lio_target_tpg_attrs[] = {
- &lio_target_tpg_attr_enable,
&lio_target_tpg_attr_dynamic_sessions,
NULL,
};
@@ -1130,6 +1071,37 @@ static struct se_portal_group *lio_target_tiqn_addtpg(struct se_wwn *wwn,
return NULL;
}
+static int lio_target_tiqn_enabletpg(struct se_portal_group *se_tpg,
+ bool enable)
+{
+ struct iscsi_portal_group *tpg = container_of(se_tpg,
+ struct iscsi_portal_group, tpg_se_tpg);
+ int ret;
+
+ ret = iscsit_get_tpg(tpg);
+ if (ret < 0)
+ return -EINVAL;
+
+ if (enable) {
+ ret = iscsit_tpg_enable_portal_group(tpg);
+ if (ret < 0)
+ goto out;
+ } else {
+ /*
+ * iscsit_tpg_disable_portal_group() assumes force=1
+ */
+ ret = iscsit_tpg_disable_portal_group(tpg, 1);
+ if (ret < 0)
+ goto out;
+ }
+
+ iscsit_put_tpg(tpg);
+ return 0;
+out:
+ iscsit_put_tpg(tpg);
+ return -EINVAL;
+}
+
static void lio_target_tiqn_deltpg(struct se_portal_group *se_tpg)
{
struct iscsi_portal_group *tpg;
@@ -1557,6 +1529,7 @@ const struct target_core_fabric_ops iscsi_ops = {
.fabric_drop_wwn = lio_target_call_coredeltiqn,
.add_wwn_groups = lio_target_add_wwn_groups,
.fabric_make_tpg = lio_target_tiqn_addtpg,
+ .fabric_enable_tpg = lio_target_tiqn_enabletpg,
.fabric_drop_tpg = lio_target_tiqn_deltpg,
.fabric_make_np = lio_target_call_addnptotpg,
.fabric_drop_np = lio_target_call_delnpfromtpg,
--
2.25.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v2 2/7] target: iscsi: replace enable attr to ops.enable
2021-03-22 8:05 ` [PATCH v2 2/7] target: iscsi: replace enable attr to ops.enable Dmitry Bogdanov
@ 2021-03-22 17:43 ` Mike Christie
0 siblings, 0 replies; 13+ messages in thread
From: Mike Christie @ 2021-03-22 17:43 UTC (permalink / raw)
To: Dmitry Bogdanov, Martin Petersen, target-devel
Cc: linux-scsi, linux, Nilesh Javali, Chris Boot, Bart Van Assche,
Michael Cyr, Felipe Balbi, Roman Bolshakov
On 3/22/21 3:05 AM, Dmitry Bogdanov wrote:
>
> +static int lio_target_tiqn_enabletpg(struct se_portal_group *se_tpg,
> + bool enable)
> +{
This driver uses 2 or 3 coding styles for this, but the above is a new one.
Could you tab over then use spaces to line with with "(" so we limit the
styles?
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 3/7] target: qla2xx: replace enable attr to ops.enable
2021-03-22 8:05 [PATCH v2 0/7] target: make tpg/enable attribute Dmitry Bogdanov
2021-03-22 8:05 ` [PATCH v2 1/7] target: core: add common " Dmitry Bogdanov
2021-03-22 8:05 ` [PATCH v2 2/7] target: iscsi: replace enable attr to ops.enable Dmitry Bogdanov
@ 2021-03-22 8:05 ` Dmitry Bogdanov
2021-03-22 8:05 ` [PATCH v2 4/7] target: sbp: " Dmitry Bogdanov
` (4 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Dmitry Bogdanov @ 2021-03-22 8:05 UTC (permalink / raw)
To: Martin Petersen, target-devel
Cc: linux-scsi, linux, Nilesh Javali, Chris Boot, Bart Van Assche,
Michael Cyr, Felipe Balbi, Dmitry Bogdanov, Roman Bolshakov
Remove tpg/enable attribute.
Add fabric ops enable_tpg implementation instead.
Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com>
Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
---
drivers/scsi/qla2xxx/tcm_qla2xxx.c | 73 +++++-------------------------
1 file changed, 12 insertions(+), 61 deletions(-)
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
index b55fc768a2a7..a16f9b06b165 100644
--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c
+++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
@@ -910,40 +910,17 @@ static struct configfs_attribute *tcm_qla2xxx_tpg_attrib_attrs[] = {
/* End items for tcm_qla2xxx_tpg_attrib_cit */
-static ssize_t tcm_qla2xxx_tpg_enable_show(struct config_item *item,
- char *page)
-{
- struct se_portal_group *se_tpg = to_tpg(item);
- struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,
- struct tcm_qla2xxx_tpg, se_tpg);
-
- return snprintf(page, PAGE_SIZE, "%d\n",
- atomic_read(&tpg->lport_tpg_enabled));
-}
-
-static ssize_t tcm_qla2xxx_tpg_enable_store(struct config_item *item,
- const char *page, size_t count)
+static int tcm_qla2xxx_enable_tpg(struct se_portal_group *se_tpg,
+ bool enable)
{
- struct se_portal_group *se_tpg = to_tpg(item);
struct se_wwn *se_wwn = se_tpg->se_tpg_wwn;
struct tcm_qla2xxx_lport *lport = container_of(se_wwn,
struct tcm_qla2xxx_lport, lport_wwn);
struct scsi_qla_host *vha = lport->qla_vha;
struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,
struct tcm_qla2xxx_tpg, se_tpg);
- unsigned long op;
- int rc;
- rc = kstrtoul(page, 0, &op);
- if (rc < 0) {
- pr_err("kstrtoul() returned %d\n", rc);
- return -EINVAL;
- }
- if ((op != 1) && (op != 0)) {
- pr_err("Illegal value for tpg_enable: %lu\n", op);
- return -EINVAL;
- }
- if (op) {
+ if (enable) {
if (atomic_read(&tpg->lport_tpg_enabled))
return -EEXIST;
@@ -951,14 +928,14 @@ static ssize_t tcm_qla2xxx_tpg_enable_store(struct config_item *item,
qlt_enable_vha(vha);
} else {
if (!atomic_read(&tpg->lport_tpg_enabled))
- return count;
+ return 0;
atomic_set(&tpg->lport_tpg_enabled, 0);
qlt_stop_phase1(vha->vha_tgt.qla_tgt);
qlt_stop_phase2(vha->vha_tgt.qla_tgt);
}
- return count;
+ return 0;
}
static ssize_t tcm_qla2xxx_tpg_dynamic_sessions_show(struct config_item *item,
@@ -999,12 +976,10 @@ static ssize_t tcm_qla2xxx_tpg_fabric_prot_type_show(struct config_item *item,
return sprintf(page, "%d\n", tpg->tpg_attrib.fabric_prot_type);
}
-CONFIGFS_ATTR(tcm_qla2xxx_tpg_, enable);
CONFIGFS_ATTR_RO(tcm_qla2xxx_tpg_, dynamic_sessions);
CONFIGFS_ATTR(tcm_qla2xxx_tpg_, fabric_prot_type);
static struct configfs_attribute *tcm_qla2xxx_tpg_attrs[] = {
- &tcm_qla2xxx_tpg_attr_enable,
&tcm_qla2xxx_tpg_attr_dynamic_sessions,
&tcm_qla2xxx_tpg_attr_fabric_prot_type,
NULL,
@@ -1078,35 +1053,17 @@ static void tcm_qla2xxx_drop_tpg(struct se_portal_group *se_tpg)
kfree(tpg);
}
-static ssize_t tcm_qla2xxx_npiv_tpg_enable_show(struct config_item *item,
- char *page)
-{
- return tcm_qla2xxx_tpg_enable_show(item, page);
-}
-
-static ssize_t tcm_qla2xxx_npiv_tpg_enable_store(struct config_item *item,
- const char *page, size_t count)
+static int tcm_qla2xxx_npiv_enable_tpg(struct se_portal_group *se_tpg,
+ bool enable)
{
- struct se_portal_group *se_tpg = to_tpg(item);
struct se_wwn *se_wwn = se_tpg->se_tpg_wwn;
struct tcm_qla2xxx_lport *lport = container_of(se_wwn,
struct tcm_qla2xxx_lport, lport_wwn);
struct scsi_qla_host *vha = lport->qla_vha;
struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg,
struct tcm_qla2xxx_tpg, se_tpg);
- unsigned long op;
- int rc;
- rc = kstrtoul(page, 0, &op);
- if (rc < 0) {
- pr_err("kstrtoul() returned %d\n", rc);
- return -EINVAL;
- }
- if ((op != 1) && (op != 0)) {
- pr_err("Illegal value for tpg_enable: %lu\n", op);
- return -EINVAL;
- }
- if (op) {
+ if (enable) {
if (atomic_read(&tpg->lport_tpg_enabled))
return -EEXIST;
@@ -1114,23 +1071,16 @@ static ssize_t tcm_qla2xxx_npiv_tpg_enable_store(struct config_item *item,
qlt_enable_vha(vha);
} else {
if (!atomic_read(&tpg->lport_tpg_enabled))
- return count;
+ return 0;
atomic_set(&tpg->lport_tpg_enabled, 0);
qlt_stop_phase1(vha->vha_tgt.qla_tgt);
qlt_stop_phase2(vha->vha_tgt.qla_tgt);
}
- return count;
+ return 0;
}
-CONFIGFS_ATTR(tcm_qla2xxx_npiv_tpg_, enable);
-
-static struct configfs_attribute *tcm_qla2xxx_npiv_tpg_attrs[] = {
- &tcm_qla2xxx_npiv_tpg_attr_enable,
- NULL,
-};
-
static struct se_portal_group *tcm_qla2xxx_npiv_make_tpg(struct se_wwn *wwn,
const char *name)
{
@@ -1873,6 +1823,7 @@ static const struct target_core_fabric_ops tcm_qla2xxx_ops = {
.fabric_make_wwn = tcm_qla2xxx_make_lport,
.fabric_drop_wwn = tcm_qla2xxx_drop_lport,
.fabric_make_tpg = tcm_qla2xxx_make_tpg,
+ .fabric_enable_tpg = tcm_qla2xxx_enable_tpg,
.fabric_drop_tpg = tcm_qla2xxx_drop_tpg,
.fabric_init_nodeacl = tcm_qla2xxx_init_nodeacl,
@@ -1913,11 +1864,11 @@ static const struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = {
.fabric_make_wwn = tcm_qla2xxx_npiv_make_lport,
.fabric_drop_wwn = tcm_qla2xxx_npiv_drop_lport,
.fabric_make_tpg = tcm_qla2xxx_npiv_make_tpg,
+ .fabric_enable_tpg = tcm_qla2xxx_npiv_enable_tpg,
.fabric_drop_tpg = tcm_qla2xxx_drop_tpg,
.fabric_init_nodeacl = tcm_qla2xxx_init_nodeacl,
.tfc_wwn_attrs = tcm_qla2xxx_wwn_attrs,
- .tfc_tpg_base_attrs = tcm_qla2xxx_npiv_tpg_attrs,
};
static int tcm_qla2xxx_register_configfs(void)
--
2.25.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 4/7] target: sbp: replace enable attr to ops.enable
2021-03-22 8:05 [PATCH v2 0/7] target: make tpg/enable attribute Dmitry Bogdanov
` (2 preceding siblings ...)
2021-03-22 8:05 ` [PATCH v2 3/7] target: qla2xx: " Dmitry Bogdanov
@ 2021-03-22 8:05 ` Dmitry Bogdanov
2021-03-22 8:05 ` [PATCH v2 5/7] target: srpt " Dmitry Bogdanov
` (3 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Dmitry Bogdanov @ 2021-03-22 8:05 UTC (permalink / raw)
To: Martin Petersen, target-devel
Cc: linux-scsi, linux, Nilesh Javali, Chris Boot, Bart Van Assche,
Michael Cyr, Felipe Balbi, Dmitry Bogdanov, Roman Bolshakov
Remove tpg/enable attribute.
Add fabric ops enable_tpg implementation instead.
Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com>
Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
---
drivers/target/sbp/sbp_target.c | 30 +++++-------------------------
1 file changed, 5 insertions(+), 25 deletions(-)
diff --git a/drivers/target/sbp/sbp_target.c b/drivers/target/sbp/sbp_target.c
index 2a6165febd3b..72f7c00134d3 100644
--- a/drivers/target/sbp/sbp_target.c
+++ b/drivers/target/sbp/sbp_target.c
@@ -2128,32 +2128,13 @@ static ssize_t sbp_tpg_directory_id_store(struct config_item *item,
return count;
}
-static ssize_t sbp_tpg_enable_show(struct config_item *item, char *page)
+static int sbp_enable_tpg(struct se_portal_group *se_tpg, bool enable)
{
- struct se_portal_group *se_tpg = to_tpg(item);
struct sbp_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
struct sbp_tport *tport = tpg->tport;
- return sprintf(page, "%d\n", tport->enable);
-}
-
-static ssize_t sbp_tpg_enable_store(struct config_item *item,
- const char *page, size_t count)
-{
- struct se_portal_group *se_tpg = to_tpg(item);
- struct sbp_tpg *tpg = container_of(se_tpg, struct sbp_tpg, se_tpg);
- struct sbp_tport *tport = tpg->tport;
- unsigned long val;
int ret;
- if (kstrtoul(page, 0, &val) < 0)
- return -EINVAL;
- if ((val != 0) && (val != 1))
- return -EINVAL;
-
- if (tport->enable == val)
- return count;
-
- if (val) {
+ if (enable) {
if (sbp_count_se_tpg_luns(&tpg->se_tpg) == 0) {
pr_err("Cannot enable a target with no LUNs!\n");
return -EINVAL;
@@ -2168,7 +2149,7 @@ static ssize_t sbp_tpg_enable_store(struct config_item *item,
spin_unlock_bh(&se_tpg->session_lock);
}
- tport->enable = val;
+ tport->enable = enable;
ret = sbp_update_unit_directory(tport);
if (ret < 0) {
@@ -2176,15 +2157,13 @@ static ssize_t sbp_tpg_enable_store(struct config_item *item,
return ret;
}
- return count;
+ return 0;
}
CONFIGFS_ATTR(sbp_tpg_, directory_id);
-CONFIGFS_ATTR(sbp_tpg_, enable);
static struct configfs_attribute *sbp_tpg_base_attrs[] = {
&sbp_tpg_attr_directory_id,
- &sbp_tpg_attr_enable,
NULL,
};
@@ -2322,6 +2301,7 @@ static const struct target_core_fabric_ops sbp_ops = {
.fabric_make_wwn = sbp_make_tport,
.fabric_drop_wwn = sbp_drop_tport,
.fabric_make_tpg = sbp_make_tpg,
+ .fabric_enable_tpg = sbp_enable_tpg,
.fabric_drop_tpg = sbp_drop_tpg,
.fabric_post_link = sbp_post_link_lun,
.fabric_pre_unlink = sbp_pre_unlink_lun,
--
2.25.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 5/7] target: srpt replace enable attr to ops.enable
2021-03-22 8:05 [PATCH v2 0/7] target: make tpg/enable attribute Dmitry Bogdanov
` (3 preceding siblings ...)
2021-03-22 8:05 ` [PATCH v2 4/7] target: sbp: " Dmitry Bogdanov
@ 2021-03-22 8:05 ` Dmitry Bogdanov
2021-03-22 8:05 ` [PATCH v2 6/7] target: ibm_vscsi: " Dmitry Bogdanov
` (2 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Dmitry Bogdanov @ 2021-03-22 8:05 UTC (permalink / raw)
To: Martin Petersen, target-devel
Cc: linux-scsi, linux, Nilesh Javali, Chris Boot, Bart Van Assche,
Michael Cyr, Felipe Balbi, Dmitry Bogdanov, Roman Bolshakov
Remove tpg/enable attribute.
Add fabric ops enable_tpg implementation instead.
Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com>
Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
---
drivers/infiniband/ulp/srpt/ib_srpt.c | 38 +++------------------------
1 file changed, 4 insertions(+), 34 deletions(-)
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c
index 6be60aa5ffe2..527205941347 100644
--- a/drivers/infiniband/ulp/srpt/ib_srpt.c
+++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
@@ -3700,47 +3700,17 @@ static struct configfs_attribute *srpt_da_attrs[] = {
NULL,
};
-static ssize_t srpt_tpg_enable_show(struct config_item *item, char *page)
+static int srpt_enable_tpg(struct se_portal_group *se_tpg, bool enable)
{
- struct se_portal_group *se_tpg = to_tpg(item);
struct srpt_port *sport = srpt_tpg_to_sport(se_tpg);
- return sysfs_emit(page, "%d\n", sport->enabled);
-}
-
-static ssize_t srpt_tpg_enable_store(struct config_item *item,
- const char *page, size_t count)
-{
- struct se_portal_group *se_tpg = to_tpg(item);
- struct srpt_port *sport = srpt_tpg_to_sport(se_tpg);
- unsigned long tmp;
- int ret;
-
- ret = kstrtoul(page, 0, &tmp);
- if (ret < 0) {
- pr_err("Unable to extract srpt_tpg_store_enable\n");
- return -EINVAL;
- }
-
- if ((tmp != 0) && (tmp != 1)) {
- pr_err("Illegal value for srpt_tpg_store_enable: %lu\n", tmp);
- return -EINVAL;
- }
-
mutex_lock(&sport->mutex);
- srpt_set_enabled(sport, tmp);
+ srpt_set_enabled(sport, enable);
mutex_unlock(&sport->mutex);
- return count;
+ return 0;
}
-CONFIGFS_ATTR(srpt_tpg_, enable);
-
-static struct configfs_attribute *srpt_tpg_attrs[] = {
- &srpt_tpg_attr_enable,
- NULL,
-};
-
/**
* srpt_make_tpg - configfs callback invoked for mkdir /sys/kernel/config/target/$driver/$port/$tpg
* @wwn: Corresponds to $driver/$port.
@@ -3851,12 +3821,12 @@ static const struct target_core_fabric_ops srpt_template = {
.fabric_make_wwn = srpt_make_tport,
.fabric_drop_wwn = srpt_drop_tport,
.fabric_make_tpg = srpt_make_tpg,
+ .fabric_enable_tpg = srpt_enable_tpg,
.fabric_drop_tpg = srpt_drop_tpg,
.fabric_init_nodeacl = srpt_init_nodeacl,
.tfc_discovery_attrs = srpt_da_attrs,
.tfc_wwn_attrs = srpt_wwn_attrs,
- .tfc_tpg_base_attrs = srpt_tpg_attrs,
.tfc_tpg_attrib_attrs = srpt_tpg_attrib_attrs,
};
--
2.25.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 6/7] target: ibm_vscsi: replace enable attr to ops.enable
2021-03-22 8:05 [PATCH v2 0/7] target: make tpg/enable attribute Dmitry Bogdanov
` (4 preceding siblings ...)
2021-03-22 8:05 ` [PATCH v2 5/7] target: srpt " Dmitry Bogdanov
@ 2021-03-22 8:05 ` Dmitry Bogdanov
2021-03-22 8:05 ` [PATCH v2 7/7] target: usb: " Dmitry Bogdanov
2021-03-22 14:49 ` [PATCH v2 0/7] target: make tpg/enable attribute Himanshu Madhani
7 siblings, 0 replies; 13+ messages in thread
From: Dmitry Bogdanov @ 2021-03-22 8:05 UTC (permalink / raw)
To: Martin Petersen, target-devel
Cc: linux-scsi, linux, Nilesh Javali, Chris Boot, Bart Van Assche,
Michael Cyr, Felipe Balbi, Dmitry Bogdanov, Roman Bolshakov
Remove tpg/enable attribute.
Add fabric ops enable_tpg implementation instead.
Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com>
Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
---
drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c | 42 +++---------------------
1 file changed, 4 insertions(+), 38 deletions(-)
diff --git a/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c b/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c
index 9abd9e253af6..90129a6c3496 100644
--- a/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c
+++ b/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c
@@ -3956,41 +3956,16 @@ static struct configfs_attribute *ibmvscsis_wwn_attrs[] = {
NULL,
};
-static ssize_t ibmvscsis_tpg_enable_show(struct config_item *item,
- char *page)
-{
- struct se_portal_group *se_tpg = to_tpg(item);
- struct ibmvscsis_tport *tport = container_of(se_tpg,
- struct ibmvscsis_tport,
- se_tpg);
- return snprintf(page, PAGE_SIZE, "%d\n", (tport->enabled) ? 1 : 0);
-}
-
-static ssize_t ibmvscsis_tpg_enable_store(struct config_item *item,
- const char *page, size_t count)
+static int ibmvscsis_enable_tpg(struct se_portal_group *se_tpg, bool enable)
{
- struct se_portal_group *se_tpg = to_tpg(item);
struct ibmvscsis_tport *tport = container_of(se_tpg,
struct ibmvscsis_tport,
se_tpg);
struct scsi_info *vscsi = container_of(tport, struct scsi_info, tport);
- unsigned long tmp;
- int rc;
long lrc;
- rc = kstrtoul(page, 0, &tmp);
- if (rc < 0) {
- dev_err(&vscsi->dev, "Unable to extract srpt_tpg_store_enable\n");
- return -EINVAL;
- }
-
- if ((tmp != 0) && (tmp != 1)) {
- dev_err(&vscsi->dev, "Illegal value for srpt_tpg_store_enable\n");
- return -EINVAL;
- }
-
- if (tmp) {
+ if (enable) {
spin_lock_bh(&vscsi->intr_lock);
tport->enabled = true;
lrc = ibmvscsis_enable_change_state(vscsi);
@@ -4006,17 +3981,8 @@ static ssize_t ibmvscsis_tpg_enable_store(struct config_item *item,
spin_unlock_bh(&vscsi->intr_lock);
}
- dev_dbg(&vscsi->dev, "tpg_enable_store, tmp %ld, state %d\n", tmp,
- vscsi->state);
-
- return count;
+ return 0;
}
-CONFIGFS_ATTR(ibmvscsis_tpg_, enable);
-
-static struct configfs_attribute *ibmvscsis_tpg_attrs[] = {
- &ibmvscsis_tpg_attr_enable,
- NULL,
-};
static const struct target_core_fabric_ops ibmvscsis_ops = {
.module = THIS_MODULE,
@@ -4046,10 +4012,10 @@ static const struct target_core_fabric_ops ibmvscsis_ops = {
.fabric_make_wwn = ibmvscsis_make_tport,
.fabric_drop_wwn = ibmvscsis_drop_tport,
.fabric_make_tpg = ibmvscsis_make_tpg,
+ .fabric_enable_tpg = ibmvscsis_enable_tpg,
.fabric_drop_tpg = ibmvscsis_drop_tpg,
.tfc_wwn_attrs = ibmvscsis_wwn_attrs,
- .tfc_tpg_base_attrs = ibmvscsis_tpg_attrs,
};
static void ibmvscsis_dev_release(struct device *dev) {};
--
2.25.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 7/7] target: usb: replace enable attr to ops.enable
2021-03-22 8:05 [PATCH v2 0/7] target: make tpg/enable attribute Dmitry Bogdanov
` (5 preceding siblings ...)
2021-03-22 8:05 ` [PATCH v2 6/7] target: ibm_vscsi: " Dmitry Bogdanov
@ 2021-03-22 8:05 ` Dmitry Bogdanov
2021-03-22 14:49 ` [PATCH v2 0/7] target: make tpg/enable attribute Himanshu Madhani
7 siblings, 0 replies; 13+ messages in thread
From: Dmitry Bogdanov @ 2021-03-22 8:05 UTC (permalink / raw)
To: Martin Petersen, target-devel
Cc: linux-scsi, linux, Nilesh Javali, Chris Boot, Bart Van Assche,
Michael Cyr, Felipe Balbi, Dmitry Bogdanov, Roman Bolshakov
Remove tpg/enable attribute.
Add fabric ops enable_tpg implementation instead.
Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com>
Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
---
drivers/usb/gadget/function/f_tcm.c | 31 ++++++-----------------------
1 file changed, 6 insertions(+), 25 deletions(-)
diff --git a/drivers/usb/gadget/function/f_tcm.c b/drivers/usb/gadget/function/f_tcm.c
index 410fa89eae8f..6cfa5362bc8d 100644
--- a/drivers/usb/gadget/function/f_tcm.c
+++ b/drivers/usb/gadget/function/f_tcm.c
@@ -1499,42 +1499,24 @@ static struct configfs_attribute *usbg_wwn_attrs[] = {
NULL,
};
-static ssize_t tcm_usbg_tpg_enable_show(struct config_item *item, char *page)
-{
- struct se_portal_group *se_tpg = to_tpg(item);
- struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg);
-
- return snprintf(page, PAGE_SIZE, "%u\n", tpg->gadget_connect);
-}
-
static int usbg_attach(struct usbg_tpg *);
static void usbg_detach(struct usbg_tpg *);
-static ssize_t tcm_usbg_tpg_enable_store(struct config_item *item,
- const char *page, size_t count)
+static int usbg_enable_tpg(struct se_portal_group *se_tpg, bool enable)
{
- struct se_portal_group *se_tpg = to_tpg(item);
struct usbg_tpg *tpg = container_of(se_tpg, struct usbg_tpg, se_tpg);
- bool op;
- ssize_t ret;
-
- ret = strtobool(page, &op);
- if (ret)
- return ret;
-
- if ((op && tpg->gadget_connect) || (!op && !tpg->gadget_connect))
- return -EINVAL;
+ int ret;
- if (op)
+ if (enable)
ret = usbg_attach(tpg);
else
usbg_detach(tpg);
if (ret)
return ret;
- tpg->gadget_connect = op;
+ tpg->gadget_connect = enable;
- return count;
+ return 0;
}
static ssize_t tcm_usbg_tpg_nexus_show(struct config_item *item, char *page)
@@ -1677,11 +1659,9 @@ static ssize_t tcm_usbg_tpg_nexus_store(struct config_item *item,
return count;
}
-CONFIGFS_ATTR(tcm_usbg_tpg_, enable);
CONFIGFS_ATTR(tcm_usbg_tpg_, nexus);
static struct configfs_attribute *usbg_base_attrs[] = {
- &tcm_usbg_tpg_attr_enable,
&tcm_usbg_tpg_attr_nexus,
NULL,
};
@@ -1734,6 +1714,7 @@ static const struct target_core_fabric_ops usbg_ops = {
.fabric_make_wwn = usbg_make_tport,
.fabric_drop_wwn = usbg_drop_tport,
.fabric_make_tpg = usbg_make_tpg,
+ .fabric_enable_tpg = usbg_enable_tpg,
.fabric_drop_tpg = usbg_drop_tpg,
.fabric_post_link = usbg_port_link,
.fabric_pre_unlink = usbg_port_unlink,
--
2.25.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v2 0/7] target: make tpg/enable attribute
2021-03-22 8:05 [PATCH v2 0/7] target: make tpg/enable attribute Dmitry Bogdanov
` (6 preceding siblings ...)
2021-03-22 8:05 ` [PATCH v2 7/7] target: usb: " Dmitry Bogdanov
@ 2021-03-22 14:49 ` Himanshu Madhani
7 siblings, 0 replies; 13+ messages in thread
From: Himanshu Madhani @ 2021-03-22 14:49 UTC (permalink / raw)
To: Dmitry Bogdanov
Cc: Martin Petersen, target-devel, linux-scsi, linux, Nilesh Javali,
Chris Boot, Bart Van Assche, Michael Cyr, Felipe Balbi
> On Mar 22, 2021, at 3:05 AM, Dmitry Bogdanov <d.bogdanov@yadro.com> wrote:
>
> Many fabric modules provide their own implementation of enable
> attribute in tpg.
> The change set removes the code duplication and automatically adds "enable"
> attribute for fabric modules that has an implementation of
> fabric_enable_tpg() ops.
>
> This patchset is intended for scsi-queue.
>
> v2:
> create enable atribute only for modules with enable_tpg ops
> add patches for srpt, usb and ibmvscsi
>
> Dmitry Bogdanov (7):
> target: core: add common tpg/enable attribute
> target: iscsi: replace enable attr to ops.enable
> target: qla2xx: replace enable attr to ops.enable
> target: sbp: replace enable attr to ops.enable
> target: srpt replace enable attr to ops.enable
> target: ibm_vscsi: replace enable attr to ops.enable
> target: usb: replace enable attr to ops.enable
>
> drivers/infiniband/ulp/srpt/ib_srpt.c | 38 +-------
> drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c | 42 +--------
> drivers/scsi/qla2xxx/tcm_qla2xxx.c | 73 +++-------------
> drivers/target/iscsi/iscsi_target_configfs.c | 91 +++++++-------------
> drivers/target/sbp/sbp_target.c | 30 ++-----
> drivers/target/target_core_configfs.c | 1 +
> drivers/target/target_core_fabric_configfs.c | 40 ++++++++-
> drivers/target/target_core_internal.h | 1 +
> drivers/target/target_core_tpg.c | 41 +++++++++
> drivers/usb/gadget/function/f_tcm.c | 31 ++-----
> include/target/target_core_base.h | 1 +
> include/target/target_core_fabric.h | 1 +
> 12 files changed, 146 insertions(+), 244 deletions(-)
>
> --
> 2.25.1
>
Series looks good.
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
--
Himanshu Madhani Oracle Linux Engineering
^ permalink raw reply [flat|nested] 13+ messages in thread