@@ -87,8 +87,7 @@ static int zfcp_scsi_queuecommand(struct scsi_cmnd *scpnt,
87
87
return 0 ;;
88
88
}
89
89
90
- ret = zfcp_fsf_send_fcp_command_task (adapter , unit , scpnt , 0 ,
91
- ZFCP_REQ_AUTO_CLEANUP );
90
+ ret = zfcp_fsf_send_fcp_command_task (unit , scpnt );
92
91
if (unlikely (ret == - EBUSY ))
93
92
return SCSI_MLQUEUE_DEVICE_BUSY ;
94
93
else if (unlikely (ret < 0 ))
@@ -145,79 +144,91 @@ static int zfcp_scsi_slave_alloc(struct scsi_device *sdp)
145
144
146
145
static int zfcp_scsi_eh_abort_handler (struct scsi_cmnd * scpnt )
147
146
{
148
- struct Scsi_Host * scsi_host ;
149
- struct zfcp_adapter * adapter ;
150
- struct zfcp_unit * unit ;
151
- struct zfcp_fsf_req * fsf_req ;
147
+ struct Scsi_Host * scsi_host = scpnt -> device -> host ;
148
+ struct zfcp_adapter * adapter =
149
+ (struct zfcp_adapter * ) scsi_host -> hostdata [0 ];
150
+ struct zfcp_unit * unit = scpnt -> device -> hostdata ;
151
+ struct zfcp_fsf_req * old_req , * abrt_req ;
152
152
unsigned long flags ;
153
153
unsigned long old_req_id = (unsigned long ) scpnt -> host_scribble ;
154
154
int retval = SUCCESS ;
155
-
156
- scsi_host = scpnt -> device -> host ;
157
- adapter = (struct zfcp_adapter * ) scsi_host -> hostdata [0 ];
158
- unit = scpnt -> device -> hostdata ;
155
+ int retry = 3 ;
159
156
160
157
/* avoid race condition between late normal completion and abort */
161
158
write_lock_irqsave (& adapter -> abort_lock , flags );
162
159
163
- /* Check whether corresponding fsf_req is still pending */
164
160
spin_lock (& adapter -> req_list_lock );
165
- fsf_req = zfcp_reqlist_find (adapter , old_req_id );
161
+ old_req = zfcp_reqlist_find (adapter , old_req_id );
166
162
spin_unlock (& adapter -> req_list_lock );
167
- if (!fsf_req ) {
163
+ if (!old_req ) {
168
164
write_unlock_irqrestore (& adapter -> abort_lock , flags );
169
- zfcp_scsi_dbf_event_abort ("lte1" , adapter , scpnt , NULL , 0 );
170
- return retval ;
165
+ zfcp_scsi_dbf_event_abort ("lte1" , adapter , scpnt , NULL ,
166
+ old_req_id );
167
+ return SUCCESS ;
171
168
}
172
- fsf_req -> data = NULL ;
169
+ old_req -> data = NULL ;
173
170
174
171
/* don't access old fsf_req after releasing the abort_lock */
175
172
write_unlock_irqrestore (& adapter -> abort_lock , flags );
176
173
177
- fsf_req = zfcp_fsf_abort_fcp_command (old_req_id , adapter , unit , 0 );
178
- if (!fsf_req ) {
179
- zfcp_scsi_dbf_event_abort ("nres" , adapter , scpnt , NULL ,
180
- old_req_id );
181
- retval = FAILED ;
182
- return retval ;
174
+ while (retry -- ) {
175
+ abrt_req = zfcp_fsf_abort_fcp_command (old_req_id , unit );
176
+ if (abrt_req )
177
+ break ;
178
+
179
+ zfcp_erp_wait (adapter );
180
+ if (!(atomic_read (& adapter -> status ) &
181
+ ZFCP_STATUS_COMMON_RUNNING )) {
182
+ zfcp_scsi_dbf_event_abort ("nres" , adapter , scpnt , NULL ,
183
+ old_req_id );
184
+ return SUCCESS ;
185
+ }
183
186
}
187
+ if (!abrt_req )
188
+ return FAILED ;
184
189
185
- __wait_event ( fsf_req -> completion_wq ,
186
- fsf_req -> status & ZFCP_STATUS_FSFREQ_COMPLETED );
190
+ wait_event ( abrt_req -> completion_wq ,
191
+ abrt_req -> status & ZFCP_STATUS_FSFREQ_COMPLETED );
187
192
188
- if (fsf_req -> status & ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED ) {
189
- zfcp_scsi_dbf_event_abort ("okay" , adapter , scpnt , fsf_req , 0 );
190
- } else if (fsf_req -> status & ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED ) {
191
- zfcp_scsi_dbf_event_abort ("lte2" , adapter , scpnt , fsf_req , 0 );
192
- } else {
193
- zfcp_scsi_dbf_event_abort ("fail" , adapter , scpnt , fsf_req , 0 );
193
+ if (abrt_req -> status & ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED )
194
+ zfcp_scsi_dbf_event_abort ("okay" , adapter , scpnt , abrt_req , 0 );
195
+ else if (abrt_req -> status & ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED )
196
+ zfcp_scsi_dbf_event_abort ("lte2" , adapter , scpnt , abrt_req , 0 );
197
+ else {
198
+ zfcp_scsi_dbf_event_abort ("fail" , adapter , scpnt , abrt_req , 0 );
194
199
retval = FAILED ;
195
200
}
196
- zfcp_fsf_req_free (fsf_req );
197
-
201
+ zfcp_fsf_req_free (abrt_req );
198
202
return retval ;
199
203
}
200
204
201
- static int zfcp_task_mgmt_function (struct zfcp_unit * unit , u8 tm_flags ,
202
- struct scsi_cmnd * scpnt )
205
+ static int zfcp_task_mgmt_function (struct scsi_cmnd * scpnt , u8 tm_flags )
203
206
{
207
+ struct zfcp_unit * unit = scpnt -> device -> hostdata ;
204
208
struct zfcp_adapter * adapter = unit -> port -> adapter ;
205
209
struct zfcp_fsf_req * fsf_req ;
206
210
int retval = SUCCESS ;
207
-
208
- /* issue task management function */
209
- fsf_req = zfcp_fsf_send_fcp_ctm (adapter , unit , tm_flags , 0 );
210
- if (!fsf_req ) {
211
- zfcp_scsi_dbf_event_devreset ("nres" , tm_flags , unit , scpnt );
212
- return FAILED ;
211
+ int retry = 3 ;
212
+
213
+ while (retry -- ) {
214
+ fsf_req = zfcp_fsf_send_fcp_ctm (unit , tm_flags );
215
+ if (fsf_req )
216
+ break ;
217
+
218
+ zfcp_erp_wait (adapter );
219
+ if (!(atomic_read (& adapter -> status ) &
220
+ ZFCP_STATUS_COMMON_RUNNING )) {
221
+ zfcp_scsi_dbf_event_devreset ("nres" , tm_flags , unit ,
222
+ scpnt );
223
+ return SUCCESS ;
224
+ }
213
225
}
226
+ if (!fsf_req )
227
+ return FAILED ;
214
228
215
- __wait_event (fsf_req -> completion_wq ,
216
- fsf_req -> status & ZFCP_STATUS_FSFREQ_COMPLETED );
229
+ wait_event (fsf_req -> completion_wq ,
230
+ fsf_req -> status & ZFCP_STATUS_FSFREQ_COMPLETED );
217
231
218
- /*
219
- * check completion status of task management function
220
- */
221
232
if (fsf_req -> status & ZFCP_STATUS_FSFREQ_TMFUNCFAILED ) {
222
233
zfcp_scsi_dbf_event_devreset ("fail" , tm_flags , unit , scpnt );
223
234
retval = FAILED ;
@@ -228,39 +239,24 @@ static int zfcp_task_mgmt_function(struct zfcp_unit *unit, u8 tm_flags,
228
239
zfcp_scsi_dbf_event_devreset ("okay" , tm_flags , unit , scpnt );
229
240
230
241
zfcp_fsf_req_free (fsf_req );
231
-
232
242
return retval ;
233
243
}
234
244
235
245
static int zfcp_scsi_eh_device_reset_handler (struct scsi_cmnd * scpnt )
236
246
{
237
- struct zfcp_unit * unit = scpnt -> device -> hostdata ;
238
-
239
- if (!unit ) {
240
- WARN_ON (1 );
241
- return SUCCESS ;
242
- }
243
- return zfcp_task_mgmt_function (unit , FCP_LOGICAL_UNIT_RESET , scpnt );
247
+ return zfcp_task_mgmt_function (scpnt , FCP_LOGICAL_UNIT_RESET );
244
248
}
245
249
246
250
static int zfcp_scsi_eh_target_reset_handler (struct scsi_cmnd * scpnt )
247
251
{
248
- struct zfcp_unit * unit = scpnt -> device -> hostdata ;
249
-
250
- if (!unit ) {
251
- WARN_ON (1 );
252
- return SUCCESS ;
253
- }
254
- return zfcp_task_mgmt_function (unit , FCP_TARGET_RESET , scpnt );
252
+ return zfcp_task_mgmt_function (scpnt , FCP_TARGET_RESET );
255
253
}
256
254
257
255
static int zfcp_scsi_eh_host_reset_handler (struct scsi_cmnd * scpnt )
258
256
{
259
- struct zfcp_unit * unit ;
260
- struct zfcp_adapter * adapter ;
257
+ struct zfcp_unit * unit = scpnt -> device -> hostdata ;
258
+ struct zfcp_adapter * adapter = unit -> port -> adapter ;
261
259
262
- unit = scpnt -> device -> hostdata ;
263
- adapter = unit -> port -> adapter ;
264
260
zfcp_erp_adapter_reopen (adapter , 0 , 141 , scpnt );
265
261
zfcp_erp_wait (adapter );
266
262
0 commit comments