zfcp: fix device registration issues
Subsystems (3)
PATCH 1/1 zfcp: fix device registration issues
As always I have some late zfcp bug fixes. This time for 2.6.16.
The patch fixes following issues:
(1) Replace scsi_add_device with scsi_scan_target. (Thus the rport instead of the scsi_host becomes parent of a scsi_target again.)
(2) Avoid scsi_device allocation during registration of an remote port. (Would be done during fc_scsi_scan_rport.)
(3) Fix queuecommand behaviour when an zfcp unit is blocked. (Call scsi_done with DID_NO_CONNECT instead of returning SCSI_MLQUEUE_DEVICE_BUSY otherwise we might end up waiting for completion in blk_execute_rq for ever.)
Please apply. Thanks.
Andreas
zfcp: fix device registration issues
Replace scsi_add_device with scsi_scan_target.
Avoid scsi_device allocation during registration of an remote port. Fix queuecommand behaviour when an zfcp unit is blocked.
---
drivers/s390/scsi/zfcp_def.h | 1 + drivers/s390/scsi/zfcp_erp.c | 11 +++++++---- drivers/s390/scsi/zfcp_scsi.c | 6 ++++-- 3 files changed, 12 insertions(+), 6 deletions(-)
7d33dfc4fa7f88f83b70cf1ac41bc4e5e5685fe7
drivers/s390/scsi/zfcp_def.h +1 -0
@@ -664,6 +664,7 @@ do { \#define ZFCP_STATUS_UNIT_TEMPORARY 0x00000002#define ZFCP_STATUS_UNIT_SHARED 0x00000004#define ZFCP_STATUS_UNIT_READONLY 0x00000008 +#define ZFCP_STATUS_UNIT_REGISTERED 0x00000010/* FSF request status (this does not have a common part) */ #define ZFCP_STATUS_FSFREQ_NOT_INIT 0x00000000
drivers/s390/scsi/zfcp_erp.c +7 -4
@@ -3391,10 +3391,13 @@ zfcp_erp_action_cleanup(int action, stru && (!atomic_test_mask(ZFCP_STATUS_UNIT_TEMPORARY, &unit->status)) && !unit->device - && port->rport) -scsi_add_device (port->adapter->scsi_host,0 , - port->rport->scsi_target_id, - unit->scsi_lun); + && port->rport) { +atomic_set_mask (ZFCP_STATUS_UNIT_REGISTERED , + &unit->status); +scsi_scan_target (&port->rport->dev,0 , + port->rport->scsi_target_id, + unit->scsi_lun,0 ); + }zfcp_unit_put (unit);break ;case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED :
drivers/s390/scsi/zfcp_scsi.c +4 -2
@@ -183,7 +183,8 @@ zfcp_scsi_slave_alloc(struct scsi_deviceread_lock_irqsave (&zfcp_data.config_lock, flags); unit =zfcp_unit_lookup (adapter, sdp->channel, sdp->id, sdp->lun); -if (unit) { +if (unit &&atomic_test_mask (ZFCP_STATUS_UNIT_REGISTERED , + &unit->status)) { sdp->hostdata = unit; unit->device = sdp;zfcp_unit_get (unit);
@@ -208,6 +209,7 @@ zfcp_scsi_slave_destroy(struct scsi_devistruct zfcp_unit *unit = (struct zfcp_unit *) sdpnt->hostdata;if (unit) { +atomic_clear_mask (ZFCP_STATUS_UNIT_REGISTERED , &unit->status); sdpnt->hostdata =NULL ; unit->device =NULL ;zfcp_unit_put (unit);
@@ -291,7 +293,7 @@ zfcp_scsi_command_async(struct zfcp_adap"on port 0x%016Lx in recovery\n" ,zfcp_get_busid_by_unit (unit), unit->fcp_lun, unit->port->wwpn); - retval =SCSI_MLQUEUE_DEVICE_BUSY ; +zfcp_scsi_command_fail (scpnt,DID_NO_CONNECT ); goto out; }
Signature · 1 line
1.2.4.gf067