| From fd1b6c4a693c9cac59375ffb36ffe5d7c079037c Mon Sep 17 00:00:00 2001 |
| From: Bart Van Assche <bvanassche@acm.org> |
| Date: Wed, 13 Jul 2011 09:19:16 -0700 |
| Subject: IB/srp: Avoid duplicate devices from LUN scan |
| |
| From: Bart Van Assche <bvanassche@acm.org> |
| |
| commit fd1b6c4a693c9cac59375ffb36ffe5d7c079037c upstream. |
| |
| SCSI scanning of a channel:id:lun triplet in Linux works as follows |
| (function scsi_scan_target() in drivers/scsi/scsi_scan.c): |
| |
| - If lun == SCAN_WILD_CARD, send a REPORT LUNS command to the target |
| and process the result. |
| |
| - If lun != SCAN_WILD_CARD, send an INQUIRY command to the LUN |
| corresponding to the specified channel:id:lun triplet to verify |
| whether the LUN exists. |
| |
| So a SCSI driver must either take the channel and target id values in |
| account in its quecommand() function or it should declare that it only |
| supports one channel and one target id. |
| |
| Currently the ib_srp driver does neither. As a result scanning the |
| SCSI bus via e.g. rescan-scsi-bus.sh causes many duplicate SCSI |
| devices to be created. For each 0:0:L device, several duplicates are |
| created with the same LUN number and with (C:I) != (0:0). Fix this by |
| declaring that the ib_srp driver only supports one channel and one |
| target id. |
| |
| Signed-off-by: Bart Van Assche <bvanassche@acm.org> |
| Acked-by: David Dillow <dillowda@ornl.gov> |
| Signed-off-by: Roland Dreier <roland@purestorage.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/infiniband/ulp/srp/ib_srp.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/drivers/infiniband/ulp/srp/ib_srp.c |
| +++ b/drivers/infiniband/ulp/srp/ib_srp.c |
| @@ -2127,6 +2127,8 @@ static ssize_t srp_create_target(struct |
| return -ENOMEM; |
| |
| target_host->transportt = ib_srp_transport_template; |
| + target_host->max_channel = 0; |
| + target_host->max_id = 1; |
| target_host->max_lun = SRP_MAX_LUN; |
| target_host->max_cmd_len = sizeof ((struct srp_cmd *) (void *) 0L)->cdb; |
| |