diff options
author | Andreas Herrmann <aherrman@de.ibm.com> | 2005-09-13 15:47:52 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.(none)> | 2005-09-19 14:01:23 -0400 |
commit | 059c97d0434834d291eff94669ca2dd3eaac9d28 (patch) | |
tree | 70719559f65366c74eb82ee8c7c7a01a0d80aca9 /drivers/s390/scsi/zfcp_aux.c | |
parent | 3734d24b2e8d85796de70c13705cfb7cbb1d77df (diff) |
[SCSI] zfcp: remove union zfcp_req_data, use unit refcount for FCP commands
o union zfcp_req_data removed
o increment unit refcount when processing FCP commands
(This fixes a theoretical race: When all scsi commands of a unit
are aborted and the scsi_device is removed then the unit could be
removed before all fsf_requests of that unit are completely processed.)
Signed-off-by: Andreas Herrmann <aherrman@de.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/s390/scsi/zfcp_aux.c')
-rw-r--r-- | drivers/s390/scsi/zfcp_aux.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index bfe3ba73bc0f..17f9989238f8 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c | |||
@@ -141,7 +141,7 @@ zfcp_cmd_dbf_event_fsf(const char *text, struct zfcp_fsf_req *fsf_req, | |||
141 | 141 | ||
142 | spin_lock_irqsave(&adapter->dbf_lock, flags); | 142 | spin_lock_irqsave(&adapter->dbf_lock, flags); |
143 | if (zfcp_fsf_req_is_scsi_cmnd(fsf_req)) { | 143 | if (zfcp_fsf_req_is_scsi_cmnd(fsf_req)) { |
144 | scsi_cmnd = fsf_req->data.send_fcp_command_task.scsi_cmnd; | 144 | scsi_cmnd = (struct scsi_cmnd*) fsf_req->data; |
145 | debug_text_event(adapter->cmd_dbf, level, "fsferror"); | 145 | debug_text_event(adapter->cmd_dbf, level, "fsferror"); |
146 | debug_text_event(adapter->cmd_dbf, level, text); | 146 | debug_text_event(adapter->cmd_dbf, level, text); |
147 | debug_event(adapter->cmd_dbf, level, &fsf_req, | 147 | debug_event(adapter->cmd_dbf, level, &fsf_req, |
@@ -167,14 +167,12 @@ void | |||
167 | zfcp_cmd_dbf_event_scsi(const char *text, struct scsi_cmnd *scsi_cmnd) | 167 | zfcp_cmd_dbf_event_scsi(const char *text, struct scsi_cmnd *scsi_cmnd) |
168 | { | 168 | { |
169 | struct zfcp_adapter *adapter; | 169 | struct zfcp_adapter *adapter; |
170 | union zfcp_req_data *req_data; | ||
171 | struct zfcp_fsf_req *fsf_req; | 170 | struct zfcp_fsf_req *fsf_req; |
172 | int level = ((host_byte(scsi_cmnd->result) != 0) ? 1 : 5); | 171 | int level = ((host_byte(scsi_cmnd->result) != 0) ? 1 : 5); |
173 | unsigned long flags; | 172 | unsigned long flags; |
174 | 173 | ||
175 | adapter = (struct zfcp_adapter *) scsi_cmnd->device->host->hostdata[0]; | 174 | adapter = (struct zfcp_adapter *) scsi_cmnd->device->host->hostdata[0]; |
176 | req_data = (union zfcp_req_data *) scsi_cmnd->host_scribble; | 175 | fsf_req = (struct zfcp_fsf_req *) scsi_cmnd->host_scribble; |
177 | fsf_req = (req_data ? req_data->send_fcp_command_task.fsf_req : NULL); | ||
178 | spin_lock_irqsave(&adapter->dbf_lock, flags); | 176 | spin_lock_irqsave(&adapter->dbf_lock, flags); |
179 | debug_text_event(adapter->cmd_dbf, level, "hostbyte"); | 177 | debug_text_event(adapter->cmd_dbf, level, "hostbyte"); |
180 | debug_text_event(adapter->cmd_dbf, level, text); | 178 | debug_text_event(adapter->cmd_dbf, level, text); |
@@ -1609,7 +1607,7 @@ zfcp_fsf_incoming_els(struct zfcp_fsf_req *fsf_req) | |||
1609 | u32 els_type; | 1607 | u32 els_type; |
1610 | struct zfcp_adapter *adapter; | 1608 | struct zfcp_adapter *adapter; |
1611 | 1609 | ||
1612 | status_buffer = fsf_req->data.status_read.buffer; | 1610 | status_buffer = (struct fsf_status_read_buffer *) fsf_req->data; |
1613 | els_type = *(u32 *) (status_buffer->payload); | 1611 | els_type = *(u32 *) (status_buffer->payload); |
1614 | adapter = fsf_req->adapter; | 1612 | adapter = fsf_req->adapter; |
1615 | 1613 | ||