All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mike Christie <michael.christie@oracle.com>
To: Hannes Reinecke <hare@suse.de>,
	bvanassche@acm.org, bstroesser@ts.fujitsu.com,
	martin.petersen@oracle.com, linux-scsi@vger.kernel.org,
	target-devel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: Re: [PATCH 11/17] target: add session sysfs class support
Date: Mon, 08 Jun 2020 15:21:15 +0000	[thread overview]
Message-ID: <75aa23e1-2194-31fb-ef12-90f868e12494@oracle.com> (raw)
In-Reply-To: <f0bd2a33-c084-6c9b-faa1-9d92bdb2df7a@suse.de>

On 6/8/20 1:14 AM, Hannes Reinecke wrote:
>> +    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;
> 
> I wonder if we need to copy these variables.
> Why can't we display them directly, returning an error if the respective
> link is not available?
> If one is worried about the sysfs/configfs reference counting we can get 
> the reference in the _show() functions; wouldn't that be a better solution?

Do you mean in the sysfs show function do a configfs_depend_item() on 
the tpg, www, acl, etc? If so, I'm not sure that's safe, because for the 
tpg for example, we could do:

1. Userspace starts tpg removal with a rmdir.
2. Userspace also opens sysfs session file and has a ref to the session, 
but not the tpg yet.
3. kernel tears down tpg and sessions under it. The tpg is freed. The 
session is not because of the ref taken in #2.
4. sysfs session show function starts to reference se_sess->se_tpg so it 
can do a configfs_depend_item on the tpg_group.cg_item, but the se_tpg 
is freed in #3.

We either need to:
1. cp like above.
2. Handle both configfs and device struct refcounts for the same struct. 
So add a device struct to the www, tpg, acl and then coordinate the 
refcounting.
3. take a reference to the se_tpg when the session is created then drop 
it in the session release.
4. add some code and end up mix locking and state checks with refcounts. 
For example the tpg would have its configfs refcount like it does today 
(no new device struct in it), and when it deletes the sessions under it 
make sure the se_sess->se_tpg is NULL'd in a way that the session show 
function can do

lock()
if (!se_sess->se_tpg)
	return

se_sess->se_tpg access
unlock()

And then you have to do that up the stack for the other structs we want 
to ref.

WARNING: multiple messages have this Message-ID (diff)
From: Mike Christie <michael.christie@oracle.com>
To: Hannes Reinecke <hare@suse.de>,
	bvanassche@acm.org, bstroesser@ts.fujitsu.com,
	martin.petersen@oracle.com, linux-scsi@vger.kernel.org,
	target-devel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: Re: [PATCH 11/17] target: add session sysfs class support
Date: Mon, 8 Jun 2020 10:21:15 -0500	[thread overview]
Message-ID: <75aa23e1-2194-31fb-ef12-90f868e12494@oracle.com> (raw)
In-Reply-To: <f0bd2a33-c084-6c9b-faa1-9d92bdb2df7a@suse.de>

On 6/8/20 1:14 AM, Hannes Reinecke wrote:
>> +    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;
> 
> I wonder if we need to copy these variables.
> Why can't we display them directly, returning an error if the respective
> link is not available?
> If one is worried about the sysfs/configfs reference counting we can get 
> the reference in the _show() functions; wouldn't that be a better solution?

Do you mean in the sysfs show function do a configfs_depend_item() on 
the tpg, www, acl, etc? If so, I'm not sure that's safe, because for the 
tpg for example, we could do:

1. Userspace starts tpg removal with a rmdir.
2. Userspace also opens sysfs session file and has a ref to the session, 
but not the tpg yet.
3. kernel tears down tpg and sessions under it. The tpg is freed. The 
session is not because of the ref taken in #2.
4. sysfs session show function starts to reference se_sess->se_tpg so it 
can do a configfs_depend_item on the tpg_group.cg_item, but the se_tpg 
is freed in #3.

We either need to:
1. cp like above.
2. Handle both configfs and device struct refcounts for the same struct. 
So add a device struct to the www, tpg, acl and then coordinate the 
refcounting.
3. take a reference to the se_tpg when the session is created then drop 
it in the session release.
4. add some code and end up mix locking and state checks with refcounts. 
For example the tpg would have its configfs refcount like it does today 
(no new device struct in it), and when it deletes the sessions under it 
make sure the se_sess->se_tpg is NULL'd in a way that the session show 
function can do

lock()
if (!se_sess->se_tpg)
	return

se_sess->se_tpg access
unlock()

And then you have to do that up the stack for the other structs we want 
to ref.

  reply	other threads:[~2020-06-08 15:21 UTC|newest]

Thread overview: 83+ 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 ` Mike Christie
2020-06-07 20:35 ` [PATCH 01/17] target: check enforce_pr_isids during registration Mike Christie
2020-06-07 20:35   ` Mike Christie
2020-06-07 20:35 ` [PATCH 02/17] target: separate acl name from port ids Mike Christie
2020-06-07 20:35   ` Mike Christie
2020-06-09 10:11   ` Stefan Hajnoczi
2020-06-09 10:11     ` Stefan Hajnoczi
2020-06-09 14:13   ` Himanshu Madhani
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   ` Mike Christie
2020-06-07 20:35 ` [PATCH 04/17] tcm loop: use target_parse_emulated_name Mike Christie
2020-06-07 20:35   ` Mike Christie
2020-06-07 20:35 ` [PATCH 05/17] vhost scsi: " Mike Christie
2020-06-07 20:35   ` Mike Christie
2020-06-09 10:21   ` Stefan Hajnoczi
2020-06-09 10:21     ` Stefan Hajnoczi
2020-06-07 20:35 ` [PATCH 06/17] xen scsiback: " Mike Christie
2020-06-07 20:35   ` Mike Christie
2020-06-07 20:35 ` [PATCH 07/17] iscsi target: setup transport_id Mike Christie
2020-06-07 20:35   ` 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   ` 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   ` Mike Christie
2020-06-07 20:35 ` [PATCH 10/17] target: drop sess_get_initiator_sid Mike Christie
2020-06-07 20:35   ` Mike Christie
2020-06-07 20:35 ` [PATCH 11/17] target: add session sysfs class support Mike Christie
2020-06-07 20:35   ` Mike Christie
2020-06-08  5:32   ` Greg Kroah-Hartman
2020-06-08  5:32     ` Greg Kroah-Hartman
2020-06-08 15:35     ` Mike Christie
2020-06-08 15:35       ` Mike Christie
2020-06-08 16:36       ` Greg Kroah-Hartman
2020-06-08 16:36         ` Greg Kroah-Hartman
2020-06-08 19:02         ` Mike Christie
2020-06-08 19:02           ` Mike Christie
2020-06-09  6:05           ` Greg Kroah-Hartman
2020-06-09  6:05             ` Greg Kroah-Hartman
2020-06-08  6:14   ` Hannes Reinecke
2020-06-08  6:14     ` Hannes Reinecke
2020-06-08 15:21     ` Mike Christie [this message]
2020-06-08 15:21       ` Mike Christie
2020-06-08 15:55       ` Michael Christie
2020-06-08 15:55         ` Michael Christie
2020-06-09  3:10         ` Michael Christie
2020-06-09  3:10           ` Michael Christie
2020-06-08 12:06   ` Bodo Stroesser
2020-06-08 12:06     ` Bodo Stroesser
2020-06-08 14:49     ` Mike Christie
2020-06-08 14:49       ` Mike Christie
2020-06-08 12:18   ` Greg Kroah-Hartman
2020-06-08 12:18     ` Greg Kroah-Hartman
2020-06-08 12:18   ` Greg Kroah-Hartman
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-07 20:35   ` Mike Christie
2020-06-08  6:15   ` Hannes Reinecke
2020-06-08  6:15     ` Hannes Reinecke
2020-06-08 10:20   ` kernel test robot
2020-06-08 10:20     ` kernel test robot
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-07 20:36   ` Mike Christie
2020-06-08  6:16   ` Hannes Reinecke
2020-06-08  6:16     ` Hannes Reinecke
2020-06-07 20:36 ` [PATCH 14/17] target: add free_session callout Mike Christie
2020-06-07 20:36   ` Mike Christie
2020-06-08  6:19   ` Hannes Reinecke
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-07 20:36   ` Mike Christie
2020-06-08  6:20   ` Hannes Reinecke
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-07 20:36   ` Mike Christie
2020-06-08  6:21   ` Hannes Reinecke
2020-06-08  6:21     ` Hannes Reinecke
2020-06-07 20:36 ` [PATCH 17/17] target: drop sess_get_index Mike Christie
2020-06-07 20:36   ` Mike Christie
2020-06-08  6:21   ` Hannes Reinecke
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=75aa23e1-2194-31fb-ef12-90f868e12494@oracle.com \
    --to=michael.christie@oracle.com \
    --cc=bstroesser@ts.fujitsu.com \
    --cc=bvanassche@acm.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=hare@suse.de \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.