From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: Mike Christie <michael.christie@oracle.com>
Cc: bvanassche@acm.org, bstroesser@ts.fujitsu.com,
martin.petersen@oracle.com, linux-scsi@vger.kernel.org,
target-devel@vger.kernel.org
Subject: Re: [PATCH 11/17] target: add session sysfs class support
Date: Mon, 8 Jun 2020 14:18:02 +0200 [thread overview]
Message-ID: <20200608121802.GB306451@kroah.com> (raw)
In-Reply-To: <1591562164-9766-12-git-send-email-michael.christie@oracle.com>
On Sun, Jun 07, 2020 at 03:35:58PM -0500, Mike Christie wrote:
> +#define target_attr_show(field) \
> +static ssize_t show_target_##field(struct device *dev, \
> + struct device_attribute *attr, char *buf) \
> +{ \
> + struct se_session *se_sess = dev_to_se_sess(dev); \
> + \
> + if (!se_sess->field##_name) \
> + return 0; \
> + \
> + return snprintf(buf, PAGE_SIZE, "%s", se_sess->field##_name); \
Nit, you do not need to call snprintf() as you "know" your buffer is big
enough, right? Please just use sprintf() for sysfs show functions to
enforce that.
> +/* transportID attrs */
> +#define tpt_id_attr_show(name, fmt_str) \
> +static ssize_t show_tpid_##name(struct device *dev, \
> + struct device_attribute *attr, char *buf) \
> +{ \
> + struct se_session *se_sess = dev_to_se_sess(dev); \
> + return snprintf(buf, PAGE_SIZE, fmt_str, se_sess->tpt_id->name); \
sprintf() as above. Same for all of the other show calls in this file.
thanks,
greg k-h
> +}
> +
> +#define tpt_id_attr(name, fmt_str) \
> + tpt_id_attr_show(name, fmt_str) \
> +static DEVICE_ATTR(name, S_IRUGO, show_tpid_##name, NULL)
> +
> +tpt_id_attr(proto, "0x%x");
> +tpt_id_attr(name, "%s");
> +
> +static ssize_t session_id_show(struct device *dev,
> + struct device_attribute *attr, char *buf)
> +{
> + struct se_session *se_sess = dev_to_se_sess(dev);
> +
> + if (!se_sess->tpt_id->session_id)
> + return 0;
> +
> + return snprintf(buf, PAGE_SIZE, "0x%s", se_sess->tpt_id->session_id);
> +}
> +
> +static DEVICE_ATTR(session_id, S_IRUGO, session_id_show, NULL);
DEVICE_ATTR_RO().
> +
> +static struct attribute *tpt_id_attrs[] = {
> + &dev_attr_proto.attr,
> + &dev_attr_name.attr,
> + &dev_attr_session_id.attr,
> + NULL,
> +};
> +
> +static const struct attribute_group tpt_id_group = {
> + .name = "transport_id",
> + .attrs = tpt_id_attrs,
> +};
> +
> +static const struct attribute_group *def_session_groups[] = {
> + &tpt_id_group,
> + &target_endpoint_group,
> + NULL,
> +};
> +
> +static struct class session_class = {
> + .owner = THIS_MODULE,
> + .name = "scsi_target_session",
> + .dev_release = target_sysfs_session_release,
> + .dev_groups = def_session_groups,
> +};
> +
> +int target_sysfs_init_session(struct se_session *se_sess)
> +{
> + int ret;
> +
> + ret = ida_simple_get(&session_ida, 1, 0, GFP_KERNEL);
> + if (ret < 0) {
> + pr_err("Unable to allocate session index.\n");
> + return ret;
> + }
> + se_sess->sid = ret;
> +
> + device_initialize(&se_sess->dev);
> + se_sess->dev.class = &session_class;
> +
> + ret = dev_set_name(&se_sess->dev, "session-%d", se_sess->sid);
> + if (ret)
> + goto put_dev;
> +
> + return 0;
> +
> +put_dev:
> + put_device(&se_sess->dev);
> + return ret;
> +}
> +
> +static int target_cp_endpoint_strs(struct se_portal_group *se_tpg,
> + struct se_session *se_sess)
> +{
> + /*
> + * Copy configfs dir/object names so userspace can match the session
> + * to its target, and we also don't have to worry about mixing configfs
> + * refcounts with sysfs.
> + */
> + if (!se_sess->se_node_acl->dynamic_node_acl) {
> + se_sess->acl_name = kstrdup(se_sess->se_node_acl->initiatorname,
> + GFP_KERNEL);
> + if (!se_sess->acl_name)
> + return -ENOMEM;
> + }
> +
> + se_sess->target_name = kstrdup(se_tpg->se_tpg_wwn->wwn_group.cg_item.ci_name,
> + GFP_KERNEL);
> + if (!se_sess->target_name)
> + goto free_acl;
> +
> + if (se_sess->tfo->fabric_alias)
> + se_sess->fabric_name = kstrdup(se_sess->tfo->fabric_alias,
> + GFP_KERNEL);
> + else
> + se_sess->fabric_name = kstrdup(se_sess->tfo->fabric_name,
> + GFP_KERNEL);
> + if (!se_sess->fabric_name)
> + goto free_target;
> +
> + se_sess->tpg_name = kstrdup(se_tpg->tpg_group.cg_item.ci_name,
> + GFP_KERNEL);
> + if (!se_sess->tpg_name)
> + goto free_fabric;
> +
> + return 0;
> +
> +free_fabric:
> + kfree(se_sess->fabric_name);
> + se_sess->fabric_name = NULL;
> +free_target:
> + kfree(se_sess->target_name);
> + se_sess->target_name = NULL;
> +free_acl:
> + kfree(se_sess->acl_name);
> + se_sess->acl_name = NULL;
> + return -ENOMEM;
> +}
> +
> +int target_sysfs_add_session(struct se_portal_group *se_tpg,
> + struct se_session *se_sess)
> +{
> + struct t10_transport_id *tpt_id = se_sess->tpt_id;
> + int ret;
> +
> + if (!try_module_get(se_sess->tfo->module))
> + return -EINVAL;
> +
> + ret = target_cp_endpoint_strs(se_tpg, se_sess);
> + if (ret)
> + goto put_mod;
> +
> + se_sess->dev.groups = se_sess->tfo->session_attr_groups;
> + ret = device_add(&se_sess->dev);
> + if (ret) {
> + pr_err("Could not add session%d to sysfs. Error %d.\n",
> + se_sess->sid, ret);
> + goto free_ep_strs;
> + }
> +
> + pr_info("TCM added session-%d from [fabric: %s, target: %s, tpg %s, acl: %s] to [initiator port: %s%s%s]",
> + se_sess->sid, se_sess->fabric_name, se_sess->target_name,
> + se_sess->tpg_name, se_sess->acl_name ? se_sess->acl_name : "dynamic",
> + tpt_id->name, tpt_id->session_id ? "," : "",
> + tpt_id->session_id ? tpt_id->session_id : "");
> +
> + se_sess->sysfs_added = true;
> + return 0;
> +
> +free_ep_strs:
> + target_free_endpoint_strs(se_sess);
> +put_mod:
> + module_put(se_sess->tfo->module);
> + return ret;
> +}
> +EXPORT_SYMBOL(target_sysfs_add_session);
> +
> +void target_sysfs_remove_session(struct se_session *se_sess)
> +{
> + struct t10_transport_id *tpt_id = se_sess->tpt_id;
> +
> + /* discovery sessions are normally not added to sysfs */
> + if (!se_sess->sysfs_added)
> + return;
> + se_sess->sysfs_added = false;
> +
> + pr_info("TCM removed session-%d from [fabric: %s, target: %s, tpg %s, acl: %s] to [initiator port: %s%s%s]",
> + se_sess->sid, se_sess->fabric_name, se_sess->target_name,
> + se_sess->tpg_name, se_sess->acl_name ? se_sess->acl_name : "dynamic",
> + tpt_id->name, tpt_id->session_id ? "," : "",
> + tpt_id->session_id ? tpt_id->session_id : "");
> +
> + device_del(&se_sess->dev);
> +}
> +EXPORT_SYMBOL(target_sysfs_remove_session);
> +
> +void target_sysfs_init(void)
> +{
> + class_register(&session_class);
> +}
> +
> +void target_sysfs_exit(void)
> +{
> + class_unregister(&session_class);
I think you forgot to cleanup your ida structure here, right?
thanks,
greg k-h
next prev parent reply other threads:[~2020-06-08 12:18 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-07 20:35 [PATCH v6 00/17] target: add sysfs support Mike Christie
2020-06-07 20:35 ` [PATCH 01/17] target: check enforce_pr_isids during registration Mike Christie
2020-06-07 20:35 ` [PATCH 02/17] target: separate acl name from port ids Mike Christie
2020-06-09 10:11 ` Stefan Hajnoczi
2020-06-09 14:13 ` Himanshu Madhani
2020-06-07 20:35 ` [PATCH 03/17] target: add helper to parse acl and transport name Mike Christie
2020-06-07 20:35 ` [PATCH 04/17] tcm loop: use target_parse_emulated_name Mike Christie
2020-06-07 20:35 ` [PATCH 05/17] vhost scsi: " Mike Christie
2020-06-09 10:21 ` Stefan Hajnoczi
2020-06-07 20:35 ` [PATCH 06/17] xen scsiback: " Mike Christie
2020-06-07 20:35 ` [PATCH 07/17] iscsi target: setup transport_id Mike Christie
2020-06-07 20:35 ` [PATCH 08/17] target: use tpt_id in target_stat_iport_port_ident_show Mike Christie
2020-06-07 20:35 ` [PATCH 09/17] target: drop sess_get_initiator_sid from PR code Mike Christie
2020-06-07 20:35 ` [PATCH 10/17] target: drop sess_get_initiator_sid Mike Christie
2020-06-07 20:35 ` [PATCH 11/17] target: add session sysfs class support Mike Christie
2020-06-08 5:32 ` Greg Kroah-Hartman
2020-06-08 15:35 ` Mike Christie
2020-06-08 16:36 ` Greg Kroah-Hartman
2020-06-08 19:02 ` Mike Christie
2020-06-09 6:05 ` Greg Kroah-Hartman
2020-06-08 6:14 ` Hannes Reinecke
2020-06-08 15:21 ` Mike Christie
2020-06-08 15:55 ` Michael Christie
2020-06-09 3:10 ` Michael Christie
2020-06-08 12:06 ` Bodo Stroesser
2020-06-08 14:49 ` Mike Christie
2020-06-08 12:18 ` Greg Kroah-Hartman [this message]
2020-06-08 12:18 ` Greg Kroah-Hartman
2020-06-07 20:35 ` [PATCH 12/17] target: hook most target users into sysfs API Mike Christie
2020-06-08 6:15 ` Hannes Reinecke
2020-06-08 10:20 ` kernel test robot
2020-06-07 20:36 ` [PATCH 13/17] iscsi target: replace module sids with lio's sid Mike Christie
2020-06-08 6:16 ` Hannes Reinecke
2020-06-07 20:36 ` [PATCH 14/17] target: add free_session callout Mike Christie
2020-06-08 6:19 ` Hannes Reinecke
2020-06-07 20:36 ` [PATCH 15/17] iscsi target: hook iscsi target into sysfs API Mike Christie
2020-06-08 6:20 ` Hannes Reinecke
2020-06-07 20:36 ` [PATCH 16/17] iscsi target: export session state and alias in sysfs Mike Christie
2020-06-08 6:21 ` Hannes Reinecke
2020-06-07 20:36 ` [PATCH 17/17] target: drop sess_get_index Mike Christie
2020-06-08 6:21 ` Hannes Reinecke
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200608121802.GB306451@kroah.com \
--to=gregkh@linuxfoundation.org \
--cc=bstroesser@ts.fujitsu.com \
--cc=bvanassche@acm.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=michael.christie@oracle.com \
--cc=target-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox