From: Mike Christie <michaelc@cs.wisc.edu>
To: James.Smart@Emulex.Com
Cc: linux-scsi@vger.kernel.org
Subject: Re: [PATCH] fc_user_scan correction
Date: Tue, 22 Apr 2008 13:11:54 -0500 [thread overview]
Message-ID: <480E2A6A.4040309@cs.wisc.edu> (raw)
In-Reply-To: <480E29FC.3090502@cs.wisc.edu>
Mike Christie wrote:
> James Smart wrote:
>> Way back when, when the fc_user_scan routine was created, it kept some
>> of its original logic that walked the rport list and kicked off a scan.
>> Unfortunately, it didn't keep any of the locking around the rport list,
>> nor did it consider the synchronous nature of the scan invoked. The
>> result,
>> there are some scan requests where the rport list changes, thus a
>> subsequent
>> scan is called on a bogus rport structure and the system NMI's.
>>
>> The fix is to defer to the midlayer scan routine and not deal with
>> locking
>> in the user scan function.
>>
>> Patch was cut against scsi-misc-2.6
>>
>> -- james s
>>
>>
>> Signed-off-by: James Smart <james.smart@emulex.com>
>>
>> ---
>>
>> scsi_scan.c | 1 +
>> scsi_transport_fc.c | 21 +--------------------
>> 2 files changed, 2 insertions(+), 20 deletions(-)
>>
>>
>> diff -upNr a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
>> --- a/drivers/scsi/scsi_scan.c 2008-04-22 13:09:23.000000000 -0400
>> +++ b/drivers/scsi/scsi_scan.c 2008-04-22 13:10:02.000000000 -0400
>> @@ -1669,6 +1669,7 @@ int scsi_scan_host_selected(struct Scsi_
>>
>> return 0;
>> }
>> +EXPORT_SYMBOL(scsi_scan_host_selected);
>>
>> static void scsi_sysfs_add_devices(struct Scsi_Host *shost)
>> {
>> diff -upNr a/drivers/scsi/scsi_transport_fc.c
>> b/drivers/scsi/scsi_transport_fc.c
>> --- a/drivers/scsi/scsi_transport_fc.c 2008-04-22
>> 12:51:22.000000000 -0400
>> +++ b/drivers/scsi/scsi_transport_fc.c 2008-04-22
>> 12:53:30.000000000 -0400
>> @@ -1929,29 +1929,10 @@ fc_timed_out(struct scsi_cmnd *scmd)
>> return EH_NOT_HANDLED;
>> }
>>
>> -/*
>> - * Must be called with shost->host_lock held
>> - */
>> static int fc_user_scan(struct Scsi_Host *shost, uint channel,
>> uint id, uint lun)
>> {
>> - struct fc_rport *rport;
>> -
>> - list_for_each_entry(rport, &fc_host_rports(shost), peers) {
>> - if (rport->scsi_target_id == -1)
>> - continue;
>> -
>> - if (rport->port_state != FC_PORTSTATE_ONLINE)
>> - continue;
>> -
>> - if ((channel == SCAN_WILD_CARD || channel == rport->channel) &&
>> - (id == SCAN_WILD_CARD || id == rport->scsi_target_id)) {
>> - scsi_scan_target(&rport->dev, rport->channel,
>> - rport->scsi_target_id, lun, 1);
>> - }
>> - }
>> -
>> - return 0;
>> + return scsi_scan_host_selected(shost, channel, id, lun, 1);
>> }
>
> Is this is the same as if you did not implement the user_scan callout?
> scsi_sysfs.c will call
>
> scsi_scan_host_selected(shost, channel, id, lun, 1);
>
> I thought we added the user_scan callback because the transport classes
> had to pass in the device struct between the host and target so we got
>
> .../host/rport/target/scsi_device
>
> instead of
>
> .../host/target/scsi_device
>
> qla4xxx has the same problem. Do not look at it for help :( It added a
> mutex and does not deadlock because like the FC class it stats the
> removal of the rport/session then device so the cache sync always fails
> (the check ready function always returns DID_NO_CONNECT so the cache
> sync fails). iscsi tcp/iser/bnx2i works because it has userspace helping
> out with the removal and shutdown and does it in two stages.
>
I think we need some loop + locking + refcounting similar to how the
shost_for_each_device loops over devices.
next prev parent reply other threads:[~2008-04-22 18:12 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-22 17:28 [PATCH] fc_user_scan correction James Smart
2008-04-22 18:10 ` Mike Christie
2008-04-22 18:11 ` Mike Christie [this message]
2008-04-22 19:04 ` James Smart
2008-04-22 19:46 ` Mike Christie
2008-04-22 21:30 ` James Smart
2008-04-22 19:51 ` Mike Christie
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=480E2A6A.4040309@cs.wisc.edu \
--to=michaelc@cs.wisc.edu \
--cc=James.Smart@Emulex.Com \
--cc=linux-scsi@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.