Commit 41bbdbebbbe7e06871d25f51c2eb1d6466bb9e5f

Authored by Mike Christie
Committed by James Bottomley
1 parent 2f5899a39d

[SCSI] qla4xxx: do not reuse session when connecting to different target port

qla4xxx does not check the I_T nexus values correctly
so it ends up creating one session to the target. If
a portal should disappear or they should be reported
in different order the driver will think it is already
logged in when it could now be speaking to a different
target portal or accessing it through a different
initiator port (iscsi initiator port is not tied to
hardware and is just the initiator name plus isid
so you could end up with multiple ports through one
host).

This patch has the driver check the iscsi scsi port
values when matching sessions (we do not check
the initiator name because that is static). It results
in a portal from each target portal group getting
logged into instead of just one per target. In the future
the firmware should hopefully send us notification of other
sessions that are created to other portals within the
same tpgt and the sessions should have different isids.

Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>

Showing 2 changed files with 9 additions and 2 deletions Side-by-side Diff

drivers/scsi/qla4xxx/ql4_def.h
... ... @@ -244,6 +244,7 @@
244 244 uint8_t ip_addr[ISCSI_IPADDR_SIZE];
245 245 uint8_t iscsi_name[ISCSI_NAME_SIZE]; /* 72 x48 */
246 246 uint8_t iscsi_alias[0x20];
  247 + uint8_t isid[6];
247 248 };
248 249  
249 250 /*
drivers/scsi/qla4xxx/ql4_init.c
... ... @@ -342,8 +342,12 @@
342 342 DEBUG2(printk("scsi%ld: %s: Looking for ddb[%d]\n", ha->host_no,
343 343 __func__, fw_ddb_index));
344 344 list_for_each_entry(ddb_entry, &ha->ddb_list, list) {
345   - if (memcmp(ddb_entry->iscsi_name, fw_ddb_entry->iscsi_name,
346   - ISCSI_NAME_SIZE) == 0) {
  345 + if ((memcmp(ddb_entry->iscsi_name, fw_ddb_entry->iscsi_name,
  346 + ISCSI_NAME_SIZE) == 0) &&
  347 + (ddb_entry->tpgt ==
  348 + le32_to_cpu(fw_ddb_entry->tgt_portal_grp)) &&
  349 + (memcmp(ddb_entry->isid, fw_ddb_entry->isid,
  350 + sizeof(ddb_entry->isid)) == 0)) {
347 351 found++;
348 352 break;
349 353 }
... ... @@ -430,6 +434,8 @@
430 434  
431 435 ddb_entry->port = le16_to_cpu(fw_ddb_entry->port);
432 436 ddb_entry->tpgt = le32_to_cpu(fw_ddb_entry->tgt_portal_grp);
  437 + memcpy(ddb_entry->isid, fw_ddb_entry->isid, sizeof(ddb_entry->isid));
  438 +
433 439 memcpy(&ddb_entry->iscsi_name[0], &fw_ddb_entry->iscsi_name[0],
434 440 min(sizeof(ddb_entry->iscsi_name),
435 441 sizeof(fw_ddb_entry->iscsi_name)));