@@ -87,8 +87,7 @@ static int zfcp_scsi_queuecommand(struct scsi_cmnd *scpnt,
8787 return 0 ;;
8888 }
8989
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 );
9291 if (unlikely (ret == - EBUSY ))
9392 return SCSI_MLQUEUE_DEVICE_BUSY ;
9493 else if (unlikely (ret < 0 ))
@@ -145,79 +144,91 @@ static int zfcp_scsi_slave_alloc(struct scsi_device *sdp)
145144
146145static int zfcp_scsi_eh_abort_handler (struct scsi_cmnd * scpnt )
147146{
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 ;
152152 unsigned long flags ;
153153 unsigned long old_req_id = (unsigned long ) scpnt -> host_scribble ;
154154 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 ;
159156
160157 /* avoid race condition between late normal completion and abort */
161158 write_lock_irqsave (& adapter -> abort_lock , flags );
162159
163- /* Check whether corresponding fsf_req is still pending */
164160 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 );
166162 spin_unlock (& adapter -> req_list_lock );
167- if (!fsf_req ) {
163+ if (!old_req ) {
168164 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 ;
171168 }
172- fsf_req -> data = NULL ;
169+ old_req -> data = NULL ;
173170
174171 /* don't access old fsf_req after releasing the abort_lock */
175172 write_unlock_irqrestore (& adapter -> abort_lock , flags );
176173
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+ }
183186 }
187+ if (!abrt_req )
188+ return FAILED ;
184189
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 );
187192
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 );
194199 retval = FAILED ;
195200 }
196- zfcp_fsf_req_free (fsf_req );
197-
201+ zfcp_fsf_req_free (abrt_req );
198202 return retval ;
199203}
200204
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 )
203206{
207+ struct zfcp_unit * unit = scpnt -> device -> hostdata ;
204208 struct zfcp_adapter * adapter = unit -> port -> adapter ;
205209 struct zfcp_fsf_req * fsf_req ;
206210 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+ }
213225 }
226+ if (!fsf_req )
227+ return FAILED ;
214228
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 );
217231
218- /*
219- * check completion status of task management function
220- */
221232 if (fsf_req -> status & ZFCP_STATUS_FSFREQ_TMFUNCFAILED ) {
222233 zfcp_scsi_dbf_event_devreset ("fail" , tm_flags , unit , scpnt );
223234 retval = FAILED ;
@@ -228,39 +239,24 @@ static int zfcp_task_mgmt_function(struct zfcp_unit *unit, u8 tm_flags,
228239 zfcp_scsi_dbf_event_devreset ("okay" , tm_flags , unit , scpnt );
229240
230241 zfcp_fsf_req_free (fsf_req );
231-
232242 return retval ;
233243}
234244
235245static int zfcp_scsi_eh_device_reset_handler (struct scsi_cmnd * scpnt )
236246{
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 );
244248}
245249
246250static int zfcp_scsi_eh_target_reset_handler (struct scsi_cmnd * scpnt )
247251{
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 );
255253}
256254
257255static int zfcp_scsi_eh_host_reset_handler (struct scsi_cmnd * scpnt )
258256{
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 ;
261259
262- unit = scpnt -> device -> hostdata ;
263- adapter = unit -> port -> adapter ;
264260 zfcp_erp_adapter_reopen (adapter , 0 , 141 , scpnt );
265261 zfcp_erp_wait (adapter );
266262
0 commit comments