From: Mike Christie <mchristi@redhat.com>
To: Bart Van Assche <bvanassche@acm.org>,
Naohiro Aota <naohiro.aota@wdc.com>,
linux-scsi@vger.kernel.org, target-devel@vger.kernel.org
Cc: Nicholas Bellinger <nab@linux-iscsi.org>,
"Martin K . Petersen" <martin.petersen@oracle.com>
Subject: Re: [PATCH v2 1/2] scsi: target/tcm_loop: ignore already deleted scsi device
Date: Tue, 20 Aug 2019 10:27:21 -0500 [thread overview]
Message-ID: <5D5C1159.4030507@redhat.com> (raw)
In-Reply-To: <1973f310-ad00-ff88-fe08-a31f81dc5c33@acm.org>
On 08/20/2019 09:02 AM, Bart Van Assche wrote:
> On 8/20/19 2:04 AM, Naohiro Aota wrote:
>> If there is no corresponding scsi_device for a LUN,
>> tcm_loop_port_unlink() complains that it "Unable to locate struct
>> scsi_device for " the device and keep %tl_tpg_port_count as is. However,
>> such situation is legal when we delete a SCSI device using
>> /sys/class/scsi_device/${lun}/device/delete. We can safely ignore the
>> missing SCSI device case here.
>>
>> Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
>> ---
>> drivers/target/loopback/tcm_loop.c | 18 +++++++++---------
>> 1 file changed, 9 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/target/loopback/tcm_loop.c
>> b/drivers/target/loopback/tcm_loop.c
>> index 3305b47fdf53..0942f3bd7eec 100644
>> --- a/drivers/target/loopback/tcm_loop.c
>> +++ b/drivers/target/loopback/tcm_loop.c
>> @@ -654,16 +654,16 @@ static void tcm_loop_port_unlink(
>> sd = scsi_device_lookup(tl_hba->sh, 0, tl_tpg->tl_tpgt,
>> se_lun->unpacked_lun);
>> - if (!sd) {
>> - pr_err("Unable to locate struct scsi_device for %d:%d:%llu\n",
>> - 0, tl_tpg->tl_tpgt, se_lun->unpacked_lun);
>> - return;
>> + if (sd) {
>> + /*
>> + * Remove Linux/SCSI struct scsi_device by HCTL
>> + */
>> + scsi_remove_device(sd);
>> + scsi_device_put(sd);
>> + } else {
>> + pr_debug("Unable to locate struct scsi_device for %d:%d:%llu\n",
>> + 0, tl_tpg->tl_tpgt, se_lun->unpacked_lun);
>> }
>> - /*
>> - * Remove Linux/SCSI struct scsi_device by HCTL
>> - */
>> - scsi_remove_device(sd);
>> - scsi_device_put(sd);
>> atomic_dec_mb(&tl_tpg->tl_tpg_port_count);
>
> The above patch looks wrong to me. I think this patch does not fix the
> reference leak present in the current code. Have you considered to
> modify tcm_loop_port_link() such that it saves the pointer returned by
> scsi_add_device() and to use that pointer in tcm_loop_port_unlink()?
>
Are you guys talking about different issues?
tcm loop does not take a reference to the scsi_device at creation/link
time then need to release at removal/unlink time. The above
scsi_device_put is for the successful scsi_device_lookup call. tcm loop
works like a scsi host driver that does its own scanning via
scsi_add_device (maybe similar to scsi drivers that are raid cards).
Like other host drivers it does not take a reference to the device when
it is added and relies on scsi-ml to handle all that for it before doing
operations like queuecommand.
The leak is if you removed the scsi_device via the scsi ml sysfs
interface then there is no way to completely unlink the lio port because
if scsi_device_lookup fails we return from the function and do not do
not release our refcount on the tl_tpg_port_count.
WARNING: multiple messages have this Message-ID (diff)
From: Mike Christie <mchristi@redhat.com>
To: Bart Van Assche <bvanassche@acm.org>,
Naohiro Aota <naohiro.aota@wdc.com>,
linux-scsi@vger.kernel.org, target-devel@vger.kernel.org
Cc: Nicholas Bellinger <nab@linux-iscsi.org>,
"Martin K . Petersen" <martin.petersen@oracle.com>
Subject: Re: [PATCH v2 1/2] scsi: target/tcm_loop: ignore already deleted scsi device
Date: Tue, 20 Aug 2019 15:27:21 +0000 [thread overview]
Message-ID: <5D5C1159.4030507@redhat.com> (raw)
In-Reply-To: <1973f310-ad00-ff88-fe08-a31f81dc5c33@acm.org>
On 08/20/2019 09:02 AM, Bart Van Assche wrote:
> On 8/20/19 2:04 AM, Naohiro Aota wrote:
>> If there is no corresponding scsi_device for a LUN,
>> tcm_loop_port_unlink() complains that it "Unable to locate struct
>> scsi_device for " the device and keep %tl_tpg_port_count as is. However,
>> such situation is legal when we delete a SCSI device using
>> /sys/class/scsi_device/${lun}/device/delete. We can safely ignore the
>> missing SCSI device case here.
>>
>> Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
>> ---
>> drivers/target/loopback/tcm_loop.c | 18 +++++++++---------
>> 1 file changed, 9 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/target/loopback/tcm_loop.c
>> b/drivers/target/loopback/tcm_loop.c
>> index 3305b47fdf53..0942f3bd7eec 100644
>> --- a/drivers/target/loopback/tcm_loop.c
>> +++ b/drivers/target/loopback/tcm_loop.c
>> @@ -654,16 +654,16 @@ static void tcm_loop_port_unlink(
>> sd = scsi_device_lookup(tl_hba->sh, 0, tl_tpg->tl_tpgt,
>> se_lun->unpacked_lun);
>> - if (!sd) {
>> - pr_err("Unable to locate struct scsi_device for %d:%d:%llu\n",
>> - 0, tl_tpg->tl_tpgt, se_lun->unpacked_lun);
>> - return;
>> + if (sd) {
>> + /*
>> + * Remove Linux/SCSI struct scsi_device by HCTL
>> + */
>> + scsi_remove_device(sd);
>> + scsi_device_put(sd);
>> + } else {
>> + pr_debug("Unable to locate struct scsi_device for %d:%d:%llu\n",
>> + 0, tl_tpg->tl_tpgt, se_lun->unpacked_lun);
>> }
>> - /*
>> - * Remove Linux/SCSI struct scsi_device by HCTL
>> - */
>> - scsi_remove_device(sd);
>> - scsi_device_put(sd);
>> atomic_dec_mb(&tl_tpg->tl_tpg_port_count);
>
> The above patch looks wrong to me. I think this patch does not fix the
> reference leak present in the current code. Have you considered to
> modify tcm_loop_port_link() such that it saves the pointer returned by
> scsi_add_device() and to use that pointer in tcm_loop_port_unlink()?
>
Are you guys talking about different issues?
tcm loop does not take a reference to the scsi_device at creation/link
time then need to release at removal/unlink time. The above
scsi_device_put is for the successful scsi_device_lookup call. tcm loop
works like a scsi host driver that does its own scanning via
scsi_add_device (maybe similar to scsi drivers that are raid cards).
Like other host drivers it does not take a reference to the device when
it is added and relies on scsi-ml to handle all that for it before doing
operations like queuecommand.
The leak is if you removed the scsi_device via the scsi ml sysfs
interface then there is no way to completely unlink the lio port because
if scsi_device_lookup fails we return from the function and do not do
not release our refcount on the tl_tpg_port_count.
next prev parent reply other threads:[~2019-08-20 15:27 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-20 9:04 [PATCH v2 1/2] scsi: target/tcm_loop: ignore already deleted scsi device Naohiro Aota
2019-08-20 9:04 ` Naohiro Aota
2019-08-20 9:04 ` [PATCH v2 2/2] scsi: target/tcm_loop: update upper limit of LUN Naohiro Aota
2019-08-20 9:04 ` Naohiro Aota
2019-08-20 14:02 ` [PATCH v2 1/2] scsi: target/tcm_loop: ignore already deleted scsi device Bart Van Assche
2019-08-20 14:02 ` Bart Van Assche
2019-08-20 15:27 ` Mike Christie [this message]
2019-08-20 15:27 ` Mike Christie
2019-08-20 15:43 ` Bart Van Assche
2019-08-20 15:43 ` Bart Van Assche
2019-08-20 17:19 ` Mike Christie
2019-08-20 17:19 ` Mike Christie
2019-08-22 6:51 ` Naohiro Aota
2019-08-22 6:51 ` Naohiro Aota
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=5D5C1159.4030507@redhat.com \
--to=mchristi@redhat.com \
--cc=bvanassche@acm.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=nab@linux-iscsi.org \
--cc=naohiro.aota@wdc.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.