1 // SPDX-License-Identifier: GPL-2.0
5 * Error Recovery Procedures (ERP).
7 * Copyright IBM Corp. 2002, 2016
10 #define KMSG_COMPONENT "zfcp"
11 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
13 #include <linux/kthread.h>
15 #include "zfcp_reqlist.h"
17 #define ZFCP_MAX_ERPS 3
19 enum zfcp_erp_act_flags {
20 ZFCP_STATUS_ERP_TIMEDOUT = 0x10000000,
21 ZFCP_STATUS_ERP_CLOSE_ONLY = 0x01000000,
22 ZFCP_STATUS_ERP_DISMISSED = 0x00200000,
23 ZFCP_STATUS_ERP_LOWMEM = 0x00400000,
24 ZFCP_STATUS_ERP_NO_REF = 0x00800000,
28 ZFCP_ERP_STEP_UNINITIALIZED = 0x0000,
29 ZFCP_ERP_STEP_PHYS_PORT_CLOSING = 0x0010,
30 ZFCP_ERP_STEP_PORT_CLOSING = 0x0100,
31 ZFCP_ERP_STEP_PORT_OPENING = 0x0800,
32 ZFCP_ERP_STEP_LUN_CLOSING = 0x1000,
33 ZFCP_ERP_STEP_LUN_OPENING = 0x2000,
37 * enum zfcp_erp_act_type - Type of ERP action object.
38 * @ZFCP_ERP_ACTION_REOPEN_LUN: LUN recovery.
39 * @ZFCP_ERP_ACTION_REOPEN_PORT: Port recovery.
40 * @ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: Forced port recovery.
41 * @ZFCP_ERP_ACTION_REOPEN_ADAPTER: Adapter recovery.
42 * @ZFCP_ERP_ACTION_NONE: Eyecatcher pseudo flag to bitwise or-combine with
43 * either of the first four enum values.
44 * Used to indicate that an ERP action could not be
45 * set up despite a detected need for some recovery.
46 * @ZFCP_ERP_ACTION_FAILED: Eyecatcher pseudo flag to bitwise or-combine with
47 * either of the first four enum values.
48 * Used to indicate that ERP not needed because
49 * the object has ZFCP_STATUS_COMMON_ERP_FAILED.
51 enum zfcp_erp_act_type {
52 ZFCP_ERP_ACTION_REOPEN_LUN = 1,
53 ZFCP_ERP_ACTION_REOPEN_PORT = 2,
54 ZFCP_ERP_ACTION_REOPEN_PORT_FORCED = 3,
55 ZFCP_ERP_ACTION_REOPEN_ADAPTER = 4,
56 ZFCP_ERP_ACTION_NONE = 0xc0,
57 ZFCP_ERP_ACTION_FAILED = 0xe0,
60 enum zfcp_erp_act_result {
61 ZFCP_ERP_SUCCEEDED = 0,
63 ZFCP_ERP_CONTINUES = 2,
65 ZFCP_ERP_DISMISSED = 4,
69 static void zfcp_erp_adapter_block(struct zfcp_adapter *adapter, int mask)
71 zfcp_erp_clear_adapter_status(adapter,
72 ZFCP_STATUS_COMMON_UNBLOCKED | mask);
75 static bool zfcp_erp_action_is_running(struct zfcp_erp_action *act)
77 struct zfcp_erp_action *curr_act;
79 list_for_each_entry(curr_act, &act->adapter->erp_running_head, list)
85 static void zfcp_erp_action_ready(struct zfcp_erp_action *act)
87 struct zfcp_adapter *adapter = act->adapter;
89 list_move(&act->list, &act->adapter->erp_ready_head);
90 zfcp_dbf_rec_run("erardy1", act);
91 wake_up(&adapter->erp_ready_wq);
92 zfcp_dbf_rec_run("erardy2", act);
95 static void zfcp_erp_action_dismiss(struct zfcp_erp_action *act)
97 act->status |= ZFCP_STATUS_ERP_DISMISSED;
98 if (zfcp_erp_action_is_running(act))
99 zfcp_erp_action_ready(act);
102 static void zfcp_erp_action_dismiss_lun(struct scsi_device *sdev)
104 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
106 if (atomic_read(&zfcp_sdev->status) & ZFCP_STATUS_COMMON_ERP_INUSE)
107 zfcp_erp_action_dismiss(&zfcp_sdev->erp_action);
110 static void zfcp_erp_action_dismiss_port(struct zfcp_port *port)
112 struct scsi_device *sdev;
114 if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_INUSE)
115 zfcp_erp_action_dismiss(&port->erp_action);
117 spin_lock(port->adapter->scsi_host->host_lock);
118 __shost_for_each_device(sdev, port->adapter->scsi_host)
119 if (sdev_to_zfcp(sdev)->port == port)
120 zfcp_erp_action_dismiss_lun(sdev);
121 spin_unlock(port->adapter->scsi_host->host_lock);
125 static void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter)
127 struct zfcp_port *port;
129 if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_ERP_INUSE)
130 zfcp_erp_action_dismiss(&adapter->erp_action);
132 read_lock(&adapter->port_list_lock);
133 list_for_each_entry(port, &adapter->port_list, list)
134 zfcp_erp_action_dismiss_port(port);
135 read_unlock(&adapter->port_list_lock);
139 static int zfcp_erp_handle_failed(int want, struct zfcp_adapter *adapter,
140 struct zfcp_port *port,
141 struct scsi_device *sdev)
144 struct zfcp_scsi_dev *zsdev;
147 case ZFCP_ERP_ACTION_REOPEN_LUN:
148 zsdev = sdev_to_zfcp(sdev);
149 if (atomic_read(&zsdev->status) & ZFCP_STATUS_COMMON_ERP_FAILED)
152 case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
153 if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_FAILED)
156 case ZFCP_ERP_ACTION_REOPEN_PORT:
157 if (atomic_read(&port->status) &
158 ZFCP_STATUS_COMMON_ERP_FAILED) {
160 /* ensure propagation of failed status to new devices */
161 zfcp_erp_set_port_status(
162 port, ZFCP_STATUS_COMMON_ERP_FAILED);
165 case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
166 if (atomic_read(&adapter->status) &
167 ZFCP_STATUS_COMMON_ERP_FAILED) {
169 /* ensure propagation of failed status to new devices */
170 zfcp_erp_set_adapter_status(
171 adapter, ZFCP_STATUS_COMMON_ERP_FAILED);
182 static int zfcp_erp_required_act(int want, struct zfcp_adapter *adapter,
183 struct zfcp_port *port,
184 struct scsi_device *sdev)
187 int l_status, p_status, a_status;
188 struct zfcp_scsi_dev *zfcp_sdev;
191 case ZFCP_ERP_ACTION_REOPEN_LUN:
192 zfcp_sdev = sdev_to_zfcp(sdev);
193 l_status = atomic_read(&zfcp_sdev->status);
194 if (l_status & ZFCP_STATUS_COMMON_ERP_INUSE)
196 p_status = atomic_read(&port->status);
197 if (!(p_status & ZFCP_STATUS_COMMON_RUNNING) ||
198 p_status & ZFCP_STATUS_COMMON_ERP_FAILED)
200 if (!(p_status & ZFCP_STATUS_COMMON_UNBLOCKED))
201 need = ZFCP_ERP_ACTION_REOPEN_PORT;
203 case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
204 p_status = atomic_read(&port->status);
205 if (!(p_status & ZFCP_STATUS_COMMON_OPEN))
206 need = ZFCP_ERP_ACTION_REOPEN_PORT;
208 case ZFCP_ERP_ACTION_REOPEN_PORT:
209 p_status = atomic_read(&port->status);
210 if (p_status & ZFCP_STATUS_COMMON_ERP_INUSE)
212 a_status = atomic_read(&adapter->status);
213 if (!(a_status & ZFCP_STATUS_COMMON_RUNNING) ||
214 a_status & ZFCP_STATUS_COMMON_ERP_FAILED)
216 if (p_status & ZFCP_STATUS_COMMON_NOESC)
218 if (!(a_status & ZFCP_STATUS_COMMON_UNBLOCKED))
219 need = ZFCP_ERP_ACTION_REOPEN_ADAPTER;
221 case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
222 a_status = atomic_read(&adapter->status);
223 if (a_status & ZFCP_STATUS_COMMON_ERP_INUSE)
225 if (!(a_status & ZFCP_STATUS_COMMON_RUNNING) &&
226 !(a_status & ZFCP_STATUS_COMMON_OPEN))
227 return 0; /* shutdown requested for closed adapter */
233 static struct zfcp_erp_action *zfcp_erp_setup_act(int need, u32 act_status,
234 struct zfcp_adapter *adapter,
235 struct zfcp_port *port,
236 struct scsi_device *sdev)
238 struct zfcp_erp_action *erp_action;
239 struct zfcp_scsi_dev *zfcp_sdev;
242 case ZFCP_ERP_ACTION_REOPEN_LUN:
243 zfcp_sdev = sdev_to_zfcp(sdev);
244 if (!(act_status & ZFCP_STATUS_ERP_NO_REF))
245 if (scsi_device_get(sdev))
247 atomic_or(ZFCP_STATUS_COMMON_ERP_INUSE,
249 erp_action = &zfcp_sdev->erp_action;
250 WARN_ON_ONCE(erp_action->port != port);
251 WARN_ON_ONCE(erp_action->sdev != sdev);
252 if (!(atomic_read(&zfcp_sdev->status) &
253 ZFCP_STATUS_COMMON_RUNNING))
254 act_status |= ZFCP_STATUS_ERP_CLOSE_ONLY;
257 case ZFCP_ERP_ACTION_REOPEN_PORT:
258 case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
259 if (!get_device(&port->dev))
261 zfcp_erp_action_dismiss_port(port);
262 atomic_or(ZFCP_STATUS_COMMON_ERP_INUSE, &port->status);
263 erp_action = &port->erp_action;
264 WARN_ON_ONCE(erp_action->port != port);
265 WARN_ON_ONCE(erp_action->sdev != NULL);
266 if (!(atomic_read(&port->status) & ZFCP_STATUS_COMMON_RUNNING))
267 act_status |= ZFCP_STATUS_ERP_CLOSE_ONLY;
270 case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
271 kref_get(&adapter->ref);
272 zfcp_erp_action_dismiss_adapter(adapter);
273 atomic_or(ZFCP_STATUS_COMMON_ERP_INUSE, &adapter->status);
274 erp_action = &adapter->erp_action;
275 WARN_ON_ONCE(erp_action->port != NULL);
276 WARN_ON_ONCE(erp_action->sdev != NULL);
277 if (!(atomic_read(&adapter->status) &
278 ZFCP_STATUS_COMMON_RUNNING))
279 act_status |= ZFCP_STATUS_ERP_CLOSE_ONLY;
286 WARN_ON_ONCE(erp_action->adapter != adapter);
287 memset(&erp_action->list, 0, sizeof(erp_action->list));
288 memset(&erp_action->timer, 0, sizeof(erp_action->timer));
289 erp_action->step = ZFCP_ERP_STEP_UNINITIALIZED;
290 erp_action->fsf_req_id = 0;
291 erp_action->action = need;
292 erp_action->status = act_status;
297 static int zfcp_erp_action_enqueue(int want, struct zfcp_adapter *adapter,
298 struct zfcp_port *port,
299 struct scsi_device *sdev,
300 char *id, u32 act_status)
302 int retval = 1, need;
303 struct zfcp_erp_action *act;
305 need = zfcp_erp_handle_failed(want, adapter, port, sdev);
307 need = ZFCP_ERP_ACTION_FAILED; /* marker for trace */
311 if (!adapter->erp_thread) {
312 need = ZFCP_ERP_ACTION_NONE; /* marker for trace */
317 need = zfcp_erp_required_act(want, adapter, port, sdev);
321 act = zfcp_erp_setup_act(need, act_status, adapter, port, sdev);
323 need |= ZFCP_ERP_ACTION_NONE; /* marker for trace */
326 atomic_or(ZFCP_STATUS_ADAPTER_ERP_PENDING, &adapter->status);
327 ++adapter->erp_total_count;
328 list_add_tail(&act->list, &adapter->erp_ready_head);
329 wake_up(&adapter->erp_ready_wq);
332 zfcp_dbf_rec_trig(id, adapter, port, sdev, want, need);
336 void zfcp_erp_port_forced_no_port_dbf(char *id, struct zfcp_adapter *adapter,
337 u64 port_name, u32 port_id)
340 static /* don't waste stack */ struct zfcp_port tmpport;
342 write_lock_irqsave(&adapter->erp_lock, flags);
343 /* Stand-in zfcp port with fields just good enough for
344 * zfcp_dbf_rec_trig() and zfcp_dbf_set_common().
345 * Under lock because tmpport is static.
347 atomic_set(&tmpport.status, -1); /* unknown */
348 tmpport.wwpn = port_name;
349 tmpport.d_id = port_id;
350 zfcp_dbf_rec_trig(id, adapter, &tmpport, NULL,
351 ZFCP_ERP_ACTION_REOPEN_PORT_FORCED,
352 ZFCP_ERP_ACTION_NONE);
353 write_unlock_irqrestore(&adapter->erp_lock, flags);
356 static int _zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter,
357 int clear_mask, char *id)
359 zfcp_erp_adapter_block(adapter, clear_mask);
360 zfcp_scsi_schedule_rports_block(adapter);
362 return zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_ADAPTER,
363 adapter, NULL, NULL, id, 0);
367 * zfcp_erp_adapter_reopen - Reopen adapter.
368 * @adapter: Adapter to reopen.
369 * @clear: Status flags to clear.
370 * @id: Id for debug trace event.
372 void zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter, int clear, char *id)
376 zfcp_erp_adapter_block(adapter, clear);
377 zfcp_scsi_schedule_rports_block(adapter);
379 write_lock_irqsave(&adapter->erp_lock, flags);
380 zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_ADAPTER, adapter,
382 write_unlock_irqrestore(&adapter->erp_lock, flags);
386 * zfcp_erp_adapter_shutdown - Shutdown adapter.
387 * @adapter: Adapter to shut down.
388 * @clear: Status flags to clear.
389 * @id: Id for debug trace event.
391 void zfcp_erp_adapter_shutdown(struct zfcp_adapter *adapter, int clear,
394 int flags = ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED;
395 zfcp_erp_adapter_reopen(adapter, clear | flags, id);
399 * zfcp_erp_port_shutdown - Shutdown port
400 * @port: Port to shut down.
401 * @clear: Status flags to clear.
402 * @id: Id for debug trace event.
404 void zfcp_erp_port_shutdown(struct zfcp_port *port, int clear, char *id)
406 int flags = ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED;
407 zfcp_erp_port_reopen(port, clear | flags, id);
410 static void zfcp_erp_port_block(struct zfcp_port *port, int clear)
412 zfcp_erp_clear_port_status(port,
413 ZFCP_STATUS_COMMON_UNBLOCKED | clear);
416 static void _zfcp_erp_port_forced_reopen(struct zfcp_port *port, int clear,
419 zfcp_erp_port_block(port, clear);
420 zfcp_scsi_schedule_rport_block(port);
422 zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT_FORCED,
423 port->adapter, port, NULL, id, 0);
427 * zfcp_erp_port_forced_reopen - Forced close of port and open again
428 * @port: Port to force close and to reopen.
429 * @clear: Status flags to clear.
430 * @id: Id for debug trace event.
432 void zfcp_erp_port_forced_reopen(struct zfcp_port *port, int clear, char *id)
435 struct zfcp_adapter *adapter = port->adapter;
437 write_lock_irqsave(&adapter->erp_lock, flags);
438 _zfcp_erp_port_forced_reopen(port, clear, id);
439 write_unlock_irqrestore(&adapter->erp_lock, flags);
442 static int _zfcp_erp_port_reopen(struct zfcp_port *port, int clear, char *id)
444 zfcp_erp_port_block(port, clear);
445 zfcp_scsi_schedule_rport_block(port);
447 return zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT,
448 port->adapter, port, NULL, id, 0);
452 * zfcp_erp_port_reopen - trigger remote port recovery
453 * @port: port to recover
454 * @clear_mask: flags in port status to be cleared
455 * @id: Id for debug trace event.
457 * Returns 0 if recovery has been triggered, < 0 if not.
459 int zfcp_erp_port_reopen(struct zfcp_port *port, int clear, char *id)
463 struct zfcp_adapter *adapter = port->adapter;
465 write_lock_irqsave(&adapter->erp_lock, flags);
466 retval = _zfcp_erp_port_reopen(port, clear, id);
467 write_unlock_irqrestore(&adapter->erp_lock, flags);
472 static void zfcp_erp_lun_block(struct scsi_device *sdev, int clear_mask)
474 zfcp_erp_clear_lun_status(sdev,
475 ZFCP_STATUS_COMMON_UNBLOCKED | clear_mask);
478 static void _zfcp_erp_lun_reopen(struct scsi_device *sdev, int clear, char *id,
481 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
482 struct zfcp_adapter *adapter = zfcp_sdev->port->adapter;
484 zfcp_erp_lun_block(sdev, clear);
486 zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_LUN, adapter,
487 zfcp_sdev->port, sdev, id, act_status);
491 * zfcp_erp_lun_reopen - initiate reopen of a LUN
492 * @sdev: SCSI device / LUN to be reopened
493 * @clear_mask: specifies flags in LUN status to be cleared
494 * @id: Id for debug trace event.
496 * Return: 0 on success, < 0 on error
498 void zfcp_erp_lun_reopen(struct scsi_device *sdev, int clear, char *id)
501 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
502 struct zfcp_port *port = zfcp_sdev->port;
503 struct zfcp_adapter *adapter = port->adapter;
505 write_lock_irqsave(&adapter->erp_lock, flags);
506 _zfcp_erp_lun_reopen(sdev, clear, id, 0);
507 write_unlock_irqrestore(&adapter->erp_lock, flags);
511 * zfcp_erp_lun_shutdown - Shutdown LUN
512 * @sdev: SCSI device / LUN to shut down.
513 * @clear: Status flags to clear.
514 * @id: Id for debug trace event.
516 void zfcp_erp_lun_shutdown(struct scsi_device *sdev, int clear, char *id)
518 int flags = ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED;
519 zfcp_erp_lun_reopen(sdev, clear | flags, id);
523 * zfcp_erp_lun_shutdown_wait - Shutdown LUN and wait for erp completion
524 * @sdev: SCSI device / LUN to shut down.
525 * @id: Id for debug trace event.
527 * Do not acquire a reference for the LUN when creating the ERP
528 * action. It is safe, because this function waits for the ERP to
529 * complete first. This allows to shutdown the LUN, even when the SCSI
530 * device is in the state SDEV_DEL when scsi_device_get will fail.
532 void zfcp_erp_lun_shutdown_wait(struct scsi_device *sdev, char *id)
535 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
536 struct zfcp_port *port = zfcp_sdev->port;
537 struct zfcp_adapter *adapter = port->adapter;
538 int clear = ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED;
540 write_lock_irqsave(&adapter->erp_lock, flags);
541 _zfcp_erp_lun_reopen(sdev, clear, id, ZFCP_STATUS_ERP_NO_REF);
542 write_unlock_irqrestore(&adapter->erp_lock, flags);
544 zfcp_erp_wait(adapter);
547 static int zfcp_erp_status_change_set(unsigned long mask, atomic_t *status)
549 return (atomic_read(status) ^ mask) & mask;
552 static void zfcp_erp_adapter_unblock(struct zfcp_adapter *adapter)
554 if (zfcp_erp_status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED,
556 zfcp_dbf_rec_run("eraubl1", &adapter->erp_action);
557 atomic_or(ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status);
560 static void zfcp_erp_port_unblock(struct zfcp_port *port)
562 if (zfcp_erp_status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED,
564 zfcp_dbf_rec_run("erpubl1", &port->erp_action);
565 atomic_or(ZFCP_STATUS_COMMON_UNBLOCKED, &port->status);
568 static void zfcp_erp_lun_unblock(struct scsi_device *sdev)
570 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
572 if (zfcp_erp_status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED,
574 zfcp_dbf_rec_run("erlubl1", &sdev_to_zfcp(sdev)->erp_action);
575 atomic_or(ZFCP_STATUS_COMMON_UNBLOCKED, &zfcp_sdev->status);
578 static void zfcp_erp_action_to_running(struct zfcp_erp_action *erp_action)
580 list_move(&erp_action->list, &erp_action->adapter->erp_running_head);
581 zfcp_dbf_rec_run("erator1", erp_action);
584 static void zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *act)
586 struct zfcp_adapter *adapter = act->adapter;
587 struct zfcp_fsf_req *req;
589 if (!act->fsf_req_id)
592 spin_lock(&adapter->req_list->lock);
593 req = _zfcp_reqlist_find(adapter->req_list, act->fsf_req_id);
594 if (req && req->erp_action == act) {
595 if (act->status & (ZFCP_STATUS_ERP_DISMISSED |
596 ZFCP_STATUS_ERP_TIMEDOUT)) {
597 req->status |= ZFCP_STATUS_FSFREQ_DISMISSED;
598 zfcp_dbf_rec_run("erscf_1", act);
599 req->erp_action = NULL;
601 if (act->status & ZFCP_STATUS_ERP_TIMEDOUT)
602 zfcp_dbf_rec_run("erscf_2", act);
603 if (req->status & ZFCP_STATUS_FSFREQ_DISMISSED)
607 spin_unlock(&adapter->req_list->lock);
611 * zfcp_erp_notify - Trigger ERP action.
612 * @erp_action: ERP action to continue.
613 * @set_mask: ERP action status flags to set.
615 void zfcp_erp_notify(struct zfcp_erp_action *erp_action, unsigned long set_mask)
617 struct zfcp_adapter *adapter = erp_action->adapter;
620 write_lock_irqsave(&adapter->erp_lock, flags);
621 if (zfcp_erp_action_is_running(erp_action)) {
622 erp_action->status |= set_mask;
623 zfcp_erp_action_ready(erp_action);
625 write_unlock_irqrestore(&adapter->erp_lock, flags);
629 * zfcp_erp_timeout_handler - Trigger ERP action from timed out ERP request
630 * @data: ERP action (from timer data)
632 void zfcp_erp_timeout_handler(struct timer_list *t)
634 struct zfcp_fsf_req *fsf_req = from_timer(fsf_req, t, timer);
635 struct zfcp_erp_action *act = fsf_req->erp_action;
637 zfcp_erp_notify(act, ZFCP_STATUS_ERP_TIMEDOUT);
640 static void zfcp_erp_memwait_handler(struct timer_list *t)
642 struct zfcp_erp_action *act = from_timer(act, t, timer);
644 zfcp_erp_notify(act, 0);
647 static void zfcp_erp_strategy_memwait(struct zfcp_erp_action *erp_action)
649 timer_setup(&erp_action->timer, zfcp_erp_memwait_handler, 0);
650 erp_action->timer.expires = jiffies + HZ;
651 add_timer(&erp_action->timer);
654 static void _zfcp_erp_port_reopen_all(struct zfcp_adapter *adapter,
657 struct zfcp_port *port;
659 read_lock(&adapter->port_list_lock);
660 list_for_each_entry(port, &adapter->port_list, list)
661 _zfcp_erp_port_reopen(port, clear, id);
662 read_unlock(&adapter->port_list_lock);
665 static void _zfcp_erp_lun_reopen_all(struct zfcp_port *port, int clear,
668 struct scsi_device *sdev;
670 spin_lock(port->adapter->scsi_host->host_lock);
671 __shost_for_each_device(sdev, port->adapter->scsi_host)
672 if (sdev_to_zfcp(sdev)->port == port)
673 _zfcp_erp_lun_reopen(sdev, clear, id, 0);
674 spin_unlock(port->adapter->scsi_host->host_lock);
677 static void zfcp_erp_strategy_followup_failed(struct zfcp_erp_action *act)
679 switch (act->action) {
680 case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
681 _zfcp_erp_adapter_reopen(act->adapter, 0, "ersff_1");
683 case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
684 _zfcp_erp_port_forced_reopen(act->port, 0, "ersff_2");
686 case ZFCP_ERP_ACTION_REOPEN_PORT:
687 _zfcp_erp_port_reopen(act->port, 0, "ersff_3");
689 case ZFCP_ERP_ACTION_REOPEN_LUN:
690 _zfcp_erp_lun_reopen(act->sdev, 0, "ersff_4", 0);
695 static void zfcp_erp_strategy_followup_success(struct zfcp_erp_action *act)
697 switch (act->action) {
698 case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
699 _zfcp_erp_port_reopen_all(act->adapter, 0, "ersfs_1");
701 case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
702 _zfcp_erp_port_reopen(act->port, 0, "ersfs_2");
704 case ZFCP_ERP_ACTION_REOPEN_PORT:
705 _zfcp_erp_lun_reopen_all(act->port, 0, "ersfs_3");
710 static void zfcp_erp_wakeup(struct zfcp_adapter *adapter)
714 read_lock_irqsave(&adapter->erp_lock, flags);
715 if (list_empty(&adapter->erp_ready_head) &&
716 list_empty(&adapter->erp_running_head)) {
717 atomic_andnot(ZFCP_STATUS_ADAPTER_ERP_PENDING,
719 wake_up(&adapter->erp_done_wqh);
721 read_unlock_irqrestore(&adapter->erp_lock, flags);
724 static void zfcp_erp_enqueue_ptp_port(struct zfcp_adapter *adapter)
726 struct zfcp_port *port;
727 port = zfcp_port_enqueue(adapter, adapter->peer_wwpn, 0,
729 if (IS_ERR(port)) /* error or port already attached */
731 _zfcp_erp_port_reopen(port, 0, "ereptp1");
734 static int zfcp_erp_adapter_strat_fsf_xconf(struct zfcp_erp_action *erp_action)
738 struct zfcp_adapter *adapter = erp_action->adapter;
740 atomic_andnot(ZFCP_STATUS_ADAPTER_XCONFIG_OK, &adapter->status);
742 for (retries = 7; retries; retries--) {
743 atomic_andnot(ZFCP_STATUS_ADAPTER_HOST_CON_INIT,
745 write_lock_irq(&adapter->erp_lock);
746 zfcp_erp_action_to_running(erp_action);
747 write_unlock_irq(&adapter->erp_lock);
748 if (zfcp_fsf_exchange_config_data(erp_action)) {
749 atomic_andnot(ZFCP_STATUS_ADAPTER_HOST_CON_INIT,
751 return ZFCP_ERP_FAILED;
754 wait_event(adapter->erp_ready_wq,
755 !list_empty(&adapter->erp_ready_head));
756 if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT)
759 if (!(atomic_read(&adapter->status) &
760 ZFCP_STATUS_ADAPTER_HOST_CON_INIT))
767 atomic_andnot(ZFCP_STATUS_ADAPTER_HOST_CON_INIT,
770 if (!(atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_XCONFIG_OK))
771 return ZFCP_ERP_FAILED;
773 if (fc_host_port_type(adapter->scsi_host) == FC_PORTTYPE_PTP)
774 zfcp_erp_enqueue_ptp_port(adapter);
776 return ZFCP_ERP_SUCCEEDED;
779 static int zfcp_erp_adapter_strategy_open_fsf_xport(struct zfcp_erp_action *act)
782 struct zfcp_adapter *adapter = act->adapter;
784 write_lock_irq(&adapter->erp_lock);
785 zfcp_erp_action_to_running(act);
786 write_unlock_irq(&adapter->erp_lock);
788 ret = zfcp_fsf_exchange_port_data(act);
789 if (ret == -EOPNOTSUPP)
790 return ZFCP_ERP_SUCCEEDED;
792 return ZFCP_ERP_FAILED;
794 zfcp_dbf_rec_run("erasox1", act);
795 wait_event(adapter->erp_ready_wq,
796 !list_empty(&adapter->erp_ready_head));
797 zfcp_dbf_rec_run("erasox2", act);
798 if (act->status & ZFCP_STATUS_ERP_TIMEDOUT)
799 return ZFCP_ERP_FAILED;
801 return ZFCP_ERP_SUCCEEDED;
804 static int zfcp_erp_adapter_strategy_open_fsf(struct zfcp_erp_action *act)
806 if (zfcp_erp_adapter_strat_fsf_xconf(act) == ZFCP_ERP_FAILED)
807 return ZFCP_ERP_FAILED;
809 if (zfcp_erp_adapter_strategy_open_fsf_xport(act) == ZFCP_ERP_FAILED)
810 return ZFCP_ERP_FAILED;
812 if (mempool_resize(act->adapter->pool.sr_data,
813 act->adapter->stat_read_buf_num))
814 return ZFCP_ERP_FAILED;
816 if (mempool_resize(act->adapter->pool.status_read_req,
817 act->adapter->stat_read_buf_num))
818 return ZFCP_ERP_FAILED;
820 atomic_set(&act->adapter->stat_miss, act->adapter->stat_read_buf_num);
821 if (zfcp_status_read_refill(act->adapter))
822 return ZFCP_ERP_FAILED;
824 return ZFCP_ERP_SUCCEEDED;
827 static void zfcp_erp_adapter_strategy_close(struct zfcp_erp_action *act)
829 struct zfcp_adapter *adapter = act->adapter;
831 /* close queues to ensure that buffers are not accessed by adapter */
832 zfcp_qdio_close(adapter->qdio);
833 zfcp_fsf_req_dismiss_all(adapter);
834 adapter->fsf_req_seq_no = 0;
835 zfcp_fc_wka_ports_force_offline(adapter->gs);
836 /* all ports and LUNs are closed */
837 zfcp_erp_clear_adapter_status(adapter, ZFCP_STATUS_COMMON_OPEN);
839 atomic_andnot(ZFCP_STATUS_ADAPTER_XCONFIG_OK |
840 ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, &adapter->status);
843 static int zfcp_erp_adapter_strategy_open(struct zfcp_erp_action *act)
845 struct zfcp_adapter *adapter = act->adapter;
847 if (zfcp_qdio_open(adapter->qdio)) {
848 atomic_andnot(ZFCP_STATUS_ADAPTER_XCONFIG_OK |
849 ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED,
851 return ZFCP_ERP_FAILED;
854 if (zfcp_erp_adapter_strategy_open_fsf(act)) {
855 zfcp_erp_adapter_strategy_close(act);
856 return ZFCP_ERP_FAILED;
859 atomic_or(ZFCP_STATUS_COMMON_OPEN, &adapter->status);
861 return ZFCP_ERP_SUCCEEDED;
864 static int zfcp_erp_adapter_strategy(struct zfcp_erp_action *act)
866 struct zfcp_adapter *adapter = act->adapter;
868 if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_OPEN) {
869 zfcp_erp_adapter_strategy_close(act);
870 if (act->status & ZFCP_STATUS_ERP_CLOSE_ONLY)
871 return ZFCP_ERP_EXIT;
874 if (zfcp_erp_adapter_strategy_open(act)) {
876 return ZFCP_ERP_FAILED;
879 return ZFCP_ERP_SUCCEEDED;
882 static int zfcp_erp_port_forced_strategy_close(struct zfcp_erp_action *act)
886 retval = zfcp_fsf_close_physical_port(act);
887 if (retval == -ENOMEM)
888 return ZFCP_ERP_NOMEM;
889 act->step = ZFCP_ERP_STEP_PHYS_PORT_CLOSING;
891 return ZFCP_ERP_FAILED;
893 return ZFCP_ERP_CONTINUES;
896 static int zfcp_erp_port_forced_strategy(struct zfcp_erp_action *erp_action)
898 struct zfcp_port *port = erp_action->port;
899 int status = atomic_read(&port->status);
901 switch (erp_action->step) {
902 case ZFCP_ERP_STEP_UNINITIALIZED:
903 if ((status & ZFCP_STATUS_PORT_PHYS_OPEN) &&
904 (status & ZFCP_STATUS_COMMON_OPEN))
905 return zfcp_erp_port_forced_strategy_close(erp_action);
907 return ZFCP_ERP_FAILED;
909 case ZFCP_ERP_STEP_PHYS_PORT_CLOSING:
910 if (!(status & ZFCP_STATUS_PORT_PHYS_OPEN))
911 return ZFCP_ERP_SUCCEEDED;
913 return ZFCP_ERP_FAILED;
916 static int zfcp_erp_port_strategy_close(struct zfcp_erp_action *erp_action)
920 retval = zfcp_fsf_close_port(erp_action);
921 if (retval == -ENOMEM)
922 return ZFCP_ERP_NOMEM;
923 erp_action->step = ZFCP_ERP_STEP_PORT_CLOSING;
925 return ZFCP_ERP_FAILED;
926 return ZFCP_ERP_CONTINUES;
929 static int zfcp_erp_port_strategy_open_port(struct zfcp_erp_action *erp_action)
933 retval = zfcp_fsf_open_port(erp_action);
934 if (retval == -ENOMEM)
935 return ZFCP_ERP_NOMEM;
936 erp_action->step = ZFCP_ERP_STEP_PORT_OPENING;
938 return ZFCP_ERP_FAILED;
939 return ZFCP_ERP_CONTINUES;
942 static int zfcp_erp_open_ptp_port(struct zfcp_erp_action *act)
944 struct zfcp_adapter *adapter = act->adapter;
945 struct zfcp_port *port = act->port;
947 if (port->wwpn != adapter->peer_wwpn) {
948 zfcp_erp_set_port_status(port, ZFCP_STATUS_COMMON_ERP_FAILED);
949 return ZFCP_ERP_FAILED;
951 port->d_id = adapter->peer_d_id;
952 return zfcp_erp_port_strategy_open_port(act);
955 static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *act)
957 struct zfcp_adapter *adapter = act->adapter;
958 struct zfcp_port *port = act->port;
959 int p_status = atomic_read(&port->status);
962 case ZFCP_ERP_STEP_UNINITIALIZED:
963 case ZFCP_ERP_STEP_PHYS_PORT_CLOSING:
964 case ZFCP_ERP_STEP_PORT_CLOSING:
965 if (fc_host_port_type(adapter->scsi_host) == FC_PORTTYPE_PTP)
966 return zfcp_erp_open_ptp_port(act);
968 zfcp_fc_trigger_did_lookup(port);
969 return ZFCP_ERP_EXIT;
971 return zfcp_erp_port_strategy_open_port(act);
973 case ZFCP_ERP_STEP_PORT_OPENING:
974 /* D_ID might have changed during open */
975 if (p_status & ZFCP_STATUS_COMMON_OPEN) {
977 zfcp_fc_trigger_did_lookup(port);
978 return ZFCP_ERP_EXIT;
980 return ZFCP_ERP_SUCCEEDED;
982 if (port->d_id && !(p_status & ZFCP_STATUS_COMMON_NOESC)) {
984 return ZFCP_ERP_FAILED;
986 /* fall through otherwise */
988 return ZFCP_ERP_FAILED;
991 static int zfcp_erp_port_strategy(struct zfcp_erp_action *erp_action)
993 struct zfcp_port *port = erp_action->port;
994 int p_status = atomic_read(&port->status);
996 if ((p_status & ZFCP_STATUS_COMMON_NOESC) &&
997 !(p_status & ZFCP_STATUS_COMMON_OPEN))
998 goto close_init_done;
1000 switch (erp_action->step) {
1001 case ZFCP_ERP_STEP_UNINITIALIZED:
1002 if (p_status & ZFCP_STATUS_COMMON_OPEN)
1003 return zfcp_erp_port_strategy_close(erp_action);
1006 case ZFCP_ERP_STEP_PORT_CLOSING:
1007 if (p_status & ZFCP_STATUS_COMMON_OPEN)
1008 return ZFCP_ERP_FAILED;
1013 if (erp_action->status & ZFCP_STATUS_ERP_CLOSE_ONLY)
1014 return ZFCP_ERP_EXIT;
1016 return zfcp_erp_port_strategy_open_common(erp_action);
1019 static void zfcp_erp_lun_strategy_clearstati(struct scsi_device *sdev)
1021 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
1023 atomic_andnot(ZFCP_STATUS_COMMON_ACCESS_DENIED,
1024 &zfcp_sdev->status);
1027 static int zfcp_erp_lun_strategy_close(struct zfcp_erp_action *erp_action)
1029 int retval = zfcp_fsf_close_lun(erp_action);
1030 if (retval == -ENOMEM)
1031 return ZFCP_ERP_NOMEM;
1032 erp_action->step = ZFCP_ERP_STEP_LUN_CLOSING;
1034 return ZFCP_ERP_FAILED;
1035 return ZFCP_ERP_CONTINUES;
1038 static int zfcp_erp_lun_strategy_open(struct zfcp_erp_action *erp_action)
1040 int retval = zfcp_fsf_open_lun(erp_action);
1041 if (retval == -ENOMEM)
1042 return ZFCP_ERP_NOMEM;
1043 erp_action->step = ZFCP_ERP_STEP_LUN_OPENING;
1045 return ZFCP_ERP_FAILED;
1046 return ZFCP_ERP_CONTINUES;
1049 static int zfcp_erp_lun_strategy(struct zfcp_erp_action *erp_action)
1051 struct scsi_device *sdev = erp_action->sdev;
1052 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
1054 switch (erp_action->step) {
1055 case ZFCP_ERP_STEP_UNINITIALIZED:
1056 zfcp_erp_lun_strategy_clearstati(sdev);
1057 if (atomic_read(&zfcp_sdev->status) & ZFCP_STATUS_COMMON_OPEN)
1058 return zfcp_erp_lun_strategy_close(erp_action);
1059 /* already closed, fall through */
1060 case ZFCP_ERP_STEP_LUN_CLOSING:
1061 if (atomic_read(&zfcp_sdev->status) & ZFCP_STATUS_COMMON_OPEN)
1062 return ZFCP_ERP_FAILED;
1063 if (erp_action->status & ZFCP_STATUS_ERP_CLOSE_ONLY)
1064 return ZFCP_ERP_EXIT;
1065 return zfcp_erp_lun_strategy_open(erp_action);
1067 case ZFCP_ERP_STEP_LUN_OPENING:
1068 if (atomic_read(&zfcp_sdev->status) & ZFCP_STATUS_COMMON_OPEN)
1069 return ZFCP_ERP_SUCCEEDED;
1071 return ZFCP_ERP_FAILED;
1074 static int zfcp_erp_strategy_check_lun(struct scsi_device *sdev, int result)
1076 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
1079 case ZFCP_ERP_SUCCEEDED :
1080 atomic_set(&zfcp_sdev->erp_counter, 0);
1081 zfcp_erp_lun_unblock(sdev);
1083 case ZFCP_ERP_FAILED :
1084 atomic_inc(&zfcp_sdev->erp_counter);
1085 if (atomic_read(&zfcp_sdev->erp_counter) > ZFCP_MAX_ERPS) {
1086 dev_err(&zfcp_sdev->port->adapter->ccw_device->dev,
1087 "ERP failed for LUN 0x%016Lx on "
1089 (unsigned long long)zfcp_scsi_dev_lun(sdev),
1090 (unsigned long long)zfcp_sdev->port->wwpn);
1091 zfcp_erp_set_lun_status(sdev,
1092 ZFCP_STATUS_COMMON_ERP_FAILED);
1097 if (atomic_read(&zfcp_sdev->status) & ZFCP_STATUS_COMMON_ERP_FAILED) {
1098 zfcp_erp_lun_block(sdev, 0);
1099 result = ZFCP_ERP_EXIT;
1104 static int zfcp_erp_strategy_check_port(struct zfcp_port *port, int result)
1107 case ZFCP_ERP_SUCCEEDED :
1108 atomic_set(&port->erp_counter, 0);
1109 zfcp_erp_port_unblock(port);
1112 case ZFCP_ERP_FAILED :
1113 if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_NOESC) {
1114 zfcp_erp_port_block(port, 0);
1115 result = ZFCP_ERP_EXIT;
1117 atomic_inc(&port->erp_counter);
1118 if (atomic_read(&port->erp_counter) > ZFCP_MAX_ERPS) {
1119 dev_err(&port->adapter->ccw_device->dev,
1120 "ERP failed for remote port 0x%016Lx\n",
1121 (unsigned long long)port->wwpn);
1122 zfcp_erp_set_port_status(port,
1123 ZFCP_STATUS_COMMON_ERP_FAILED);
1128 if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_FAILED) {
1129 zfcp_erp_port_block(port, 0);
1130 result = ZFCP_ERP_EXIT;
1135 static int zfcp_erp_strategy_check_adapter(struct zfcp_adapter *adapter,
1139 case ZFCP_ERP_SUCCEEDED :
1140 atomic_set(&adapter->erp_counter, 0);
1141 zfcp_erp_adapter_unblock(adapter);
1144 case ZFCP_ERP_FAILED :
1145 atomic_inc(&adapter->erp_counter);
1146 if (atomic_read(&adapter->erp_counter) > ZFCP_MAX_ERPS) {
1147 dev_err(&adapter->ccw_device->dev,
1148 "ERP cannot recover an error "
1149 "on the FCP device\n");
1150 zfcp_erp_set_adapter_status(adapter,
1151 ZFCP_STATUS_COMMON_ERP_FAILED);
1156 if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_ERP_FAILED) {
1157 zfcp_erp_adapter_block(adapter, 0);
1158 result = ZFCP_ERP_EXIT;
1163 static int zfcp_erp_strategy_check_target(struct zfcp_erp_action *erp_action,
1166 struct zfcp_adapter *adapter = erp_action->adapter;
1167 struct zfcp_port *port = erp_action->port;
1168 struct scsi_device *sdev = erp_action->sdev;
1170 switch (erp_action->action) {
1172 case ZFCP_ERP_ACTION_REOPEN_LUN:
1173 result = zfcp_erp_strategy_check_lun(sdev, result);
1176 case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
1177 case ZFCP_ERP_ACTION_REOPEN_PORT:
1178 result = zfcp_erp_strategy_check_port(port, result);
1181 case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
1182 result = zfcp_erp_strategy_check_adapter(adapter, result);
1188 static int zfcp_erp_strat_change_det(atomic_t *target_status, u32 erp_status)
1190 int status = atomic_read(target_status);
1192 if ((status & ZFCP_STATUS_COMMON_RUNNING) &&
1193 (erp_status & ZFCP_STATUS_ERP_CLOSE_ONLY))
1194 return 1; /* take it online */
1196 if (!(status & ZFCP_STATUS_COMMON_RUNNING) &&
1197 !(erp_status & ZFCP_STATUS_ERP_CLOSE_ONLY))
1198 return 1; /* take it offline */
1203 static int zfcp_erp_strategy_statechange(struct zfcp_erp_action *act, int ret)
1205 int action = act->action;
1206 struct zfcp_adapter *adapter = act->adapter;
1207 struct zfcp_port *port = act->port;
1208 struct scsi_device *sdev = act->sdev;
1209 struct zfcp_scsi_dev *zfcp_sdev;
1210 u32 erp_status = act->status;
1213 case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
1214 if (zfcp_erp_strat_change_det(&adapter->status, erp_status)) {
1215 _zfcp_erp_adapter_reopen(adapter,
1216 ZFCP_STATUS_COMMON_ERP_FAILED,
1218 return ZFCP_ERP_EXIT;
1222 case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
1223 case ZFCP_ERP_ACTION_REOPEN_PORT:
1224 if (zfcp_erp_strat_change_det(&port->status, erp_status)) {
1225 _zfcp_erp_port_reopen(port,
1226 ZFCP_STATUS_COMMON_ERP_FAILED,
1228 return ZFCP_ERP_EXIT;
1232 case ZFCP_ERP_ACTION_REOPEN_LUN:
1233 zfcp_sdev = sdev_to_zfcp(sdev);
1234 if (zfcp_erp_strat_change_det(&zfcp_sdev->status, erp_status)) {
1235 _zfcp_erp_lun_reopen(sdev,
1236 ZFCP_STATUS_COMMON_ERP_FAILED,
1238 return ZFCP_ERP_EXIT;
1245 static void zfcp_erp_action_dequeue(struct zfcp_erp_action *erp_action)
1247 struct zfcp_adapter *adapter = erp_action->adapter;
1248 struct zfcp_scsi_dev *zfcp_sdev;
1250 adapter->erp_total_count--;
1251 if (erp_action->status & ZFCP_STATUS_ERP_LOWMEM) {
1252 adapter->erp_low_mem_count--;
1253 erp_action->status &= ~ZFCP_STATUS_ERP_LOWMEM;
1256 list_del(&erp_action->list);
1257 zfcp_dbf_rec_run("eractd1", erp_action);
1259 switch (erp_action->action) {
1260 case ZFCP_ERP_ACTION_REOPEN_LUN:
1261 zfcp_sdev = sdev_to_zfcp(erp_action->sdev);
1262 atomic_andnot(ZFCP_STATUS_COMMON_ERP_INUSE,
1263 &zfcp_sdev->status);
1266 case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
1267 case ZFCP_ERP_ACTION_REOPEN_PORT:
1268 atomic_andnot(ZFCP_STATUS_COMMON_ERP_INUSE,
1269 &erp_action->port->status);
1272 case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
1273 atomic_andnot(ZFCP_STATUS_COMMON_ERP_INUSE,
1274 &erp_action->adapter->status);
1280 * zfcp_erp_try_rport_unblock - unblock rport if no more/new recovery
1281 * @port: zfcp_port whose fc_rport we should try to unblock
1283 static void zfcp_erp_try_rport_unblock(struct zfcp_port *port)
1285 unsigned long flags;
1286 struct zfcp_adapter *adapter = port->adapter;
1288 struct Scsi_Host *shost = adapter->scsi_host;
1289 struct scsi_device *sdev;
1291 write_lock_irqsave(&adapter->erp_lock, flags);
1292 port_status = atomic_read(&port->status);
1293 if ((port_status & ZFCP_STATUS_COMMON_UNBLOCKED) == 0 ||
1294 (port_status & (ZFCP_STATUS_COMMON_ERP_INUSE |
1295 ZFCP_STATUS_COMMON_ERP_FAILED)) != 0) {
1296 /* new ERP of severity >= port triggered elsewhere meanwhile or
1297 * local link down (adapter erp_failed but not clear unblock)
1299 zfcp_dbf_rec_run_lvl(4, "ertru_p", &port->erp_action);
1300 write_unlock_irqrestore(&adapter->erp_lock, flags);
1303 spin_lock(shost->host_lock);
1304 __shost_for_each_device(sdev, shost) {
1305 struct zfcp_scsi_dev *zsdev = sdev_to_zfcp(sdev);
1308 if (zsdev->port != port)
1310 /* LUN under port of interest */
1311 lun_status = atomic_read(&zsdev->status);
1312 if ((lun_status & ZFCP_STATUS_COMMON_ERP_FAILED) != 0)
1313 continue; /* unblock rport despite failed LUNs */
1314 /* LUN recovery not given up yet [maybe follow-up pending] */
1315 if ((lun_status & ZFCP_STATUS_COMMON_UNBLOCKED) == 0 ||
1316 (lun_status & ZFCP_STATUS_COMMON_ERP_INUSE) != 0) {
1318 * not yet unblocked [LUN recovery pending]
1319 * or meanwhile blocked [new LUN recovery triggered]
1321 zfcp_dbf_rec_run_lvl(4, "ertru_l", &zsdev->erp_action);
1322 spin_unlock(shost->host_lock);
1323 write_unlock_irqrestore(&adapter->erp_lock, flags);
1327 /* now port has no child or all children have completed recovery,
1328 * and no ERP of severity >= port was meanwhile triggered elsewhere
1330 zfcp_scsi_schedule_rport_register(port);
1331 spin_unlock(shost->host_lock);
1332 write_unlock_irqrestore(&adapter->erp_lock, flags);
1335 static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result)
1337 struct zfcp_adapter *adapter = act->adapter;
1338 struct zfcp_port *port = act->port;
1339 struct scsi_device *sdev = act->sdev;
1341 switch (act->action) {
1342 case ZFCP_ERP_ACTION_REOPEN_LUN:
1343 if (!(act->status & ZFCP_STATUS_ERP_NO_REF))
1344 scsi_device_put(sdev);
1345 zfcp_erp_try_rport_unblock(port);
1348 case ZFCP_ERP_ACTION_REOPEN_PORT:
1349 /* This switch case might also happen after a forced reopen
1350 * was successfully done and thus overwritten with a new
1351 * non-forced reopen at `ersfs_2'. In this case, we must not
1352 * do the clean-up of the non-forced version.
1354 if (act->step != ZFCP_ERP_STEP_UNINITIALIZED)
1355 if (result == ZFCP_ERP_SUCCEEDED)
1356 zfcp_erp_try_rport_unblock(port);
1358 case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
1359 put_device(&port->dev);
1362 case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
1363 if (result == ZFCP_ERP_SUCCEEDED) {
1364 register_service_level(&adapter->service_level);
1365 zfcp_fc_conditional_port_scan(adapter);
1366 queue_work(adapter->work_queue, &adapter->ns_up_work);
1368 unregister_service_level(&adapter->service_level);
1370 kref_put(&adapter->ref, zfcp_adapter_release);
1375 static int zfcp_erp_strategy_do_action(struct zfcp_erp_action *erp_action)
1377 switch (erp_action->action) {
1378 case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
1379 return zfcp_erp_adapter_strategy(erp_action);
1380 case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
1381 return zfcp_erp_port_forced_strategy(erp_action);
1382 case ZFCP_ERP_ACTION_REOPEN_PORT:
1383 return zfcp_erp_port_strategy(erp_action);
1384 case ZFCP_ERP_ACTION_REOPEN_LUN:
1385 return zfcp_erp_lun_strategy(erp_action);
1387 return ZFCP_ERP_FAILED;
1390 static int zfcp_erp_strategy(struct zfcp_erp_action *erp_action)
1393 unsigned long flags;
1394 struct zfcp_adapter *adapter = erp_action->adapter;
1396 kref_get(&adapter->ref);
1398 write_lock_irqsave(&adapter->erp_lock, flags);
1399 zfcp_erp_strategy_check_fsfreq(erp_action);
1401 if (erp_action->status & ZFCP_STATUS_ERP_DISMISSED) {
1402 zfcp_erp_action_dequeue(erp_action);
1403 retval = ZFCP_ERP_DISMISSED;
1407 if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) {
1408 retval = ZFCP_ERP_FAILED;
1412 zfcp_erp_action_to_running(erp_action);
1414 /* no lock to allow for blocking operations */
1415 write_unlock_irqrestore(&adapter->erp_lock, flags);
1416 retval = zfcp_erp_strategy_do_action(erp_action);
1417 write_lock_irqsave(&adapter->erp_lock, flags);
1419 if (erp_action->status & ZFCP_STATUS_ERP_DISMISSED)
1420 retval = ZFCP_ERP_CONTINUES;
1423 case ZFCP_ERP_NOMEM:
1424 if (!(erp_action->status & ZFCP_STATUS_ERP_LOWMEM)) {
1425 ++adapter->erp_low_mem_count;
1426 erp_action->status |= ZFCP_STATUS_ERP_LOWMEM;
1428 if (adapter->erp_total_count == adapter->erp_low_mem_count)
1429 _zfcp_erp_adapter_reopen(adapter, 0, "erstgy1");
1431 zfcp_erp_strategy_memwait(erp_action);
1432 retval = ZFCP_ERP_CONTINUES;
1436 case ZFCP_ERP_CONTINUES:
1437 if (erp_action->status & ZFCP_STATUS_ERP_LOWMEM) {
1438 --adapter->erp_low_mem_count;
1439 erp_action->status &= ~ZFCP_STATUS_ERP_LOWMEM;
1445 retval = zfcp_erp_strategy_check_target(erp_action, retval);
1446 zfcp_erp_action_dequeue(erp_action);
1447 retval = zfcp_erp_strategy_statechange(erp_action, retval);
1448 if (retval == ZFCP_ERP_EXIT)
1450 if (retval == ZFCP_ERP_SUCCEEDED)
1451 zfcp_erp_strategy_followup_success(erp_action);
1452 if (retval == ZFCP_ERP_FAILED)
1453 zfcp_erp_strategy_followup_failed(erp_action);
1456 write_unlock_irqrestore(&adapter->erp_lock, flags);
1458 if (retval != ZFCP_ERP_CONTINUES)
1459 zfcp_erp_action_cleanup(erp_action, retval);
1461 kref_put(&adapter->ref, zfcp_adapter_release);
1465 static int zfcp_erp_thread(void *data)
1467 struct zfcp_adapter *adapter = (struct zfcp_adapter *) data;
1468 struct list_head *next;
1469 struct zfcp_erp_action *act;
1470 unsigned long flags;
1473 wait_event_interruptible(adapter->erp_ready_wq,
1474 !list_empty(&adapter->erp_ready_head) ||
1475 kthread_should_stop());
1477 if (kthread_should_stop())
1480 write_lock_irqsave(&adapter->erp_lock, flags);
1481 next = adapter->erp_ready_head.next;
1482 write_unlock_irqrestore(&adapter->erp_lock, flags);
1484 if (next != &adapter->erp_ready_head) {
1485 act = list_entry(next, struct zfcp_erp_action, list);
1487 /* there is more to come after dismission, no notify */
1488 if (zfcp_erp_strategy(act) != ZFCP_ERP_DISMISSED)
1489 zfcp_erp_wakeup(adapter);
1497 * zfcp_erp_thread_setup - Start ERP thread for adapter
1498 * @adapter: Adapter to start the ERP thread for
1500 * Returns 0 on success or error code from kernel_thread()
1502 int zfcp_erp_thread_setup(struct zfcp_adapter *adapter)
1504 struct task_struct *thread;
1506 thread = kthread_run(zfcp_erp_thread, adapter, "zfcperp%s",
1507 dev_name(&adapter->ccw_device->dev));
1508 if (IS_ERR(thread)) {
1509 dev_err(&adapter->ccw_device->dev,
1510 "Creating an ERP thread for the FCP device failed.\n");
1511 return PTR_ERR(thread);
1514 adapter->erp_thread = thread;
1519 * zfcp_erp_thread_kill - Stop ERP thread.
1520 * @adapter: Adapter where the ERP thread should be stopped.
1522 * The caller of this routine ensures that the specified adapter has
1523 * been shut down and that this operation has been completed. Thus,
1524 * there are no pending erp_actions which would need to be handled
1527 void zfcp_erp_thread_kill(struct zfcp_adapter *adapter)
1529 kthread_stop(adapter->erp_thread);
1530 adapter->erp_thread = NULL;
1531 WARN_ON(!list_empty(&adapter->erp_ready_head));
1532 WARN_ON(!list_empty(&adapter->erp_running_head));
1536 * zfcp_erp_wait - wait for completion of error recovery on an adapter
1537 * @adapter: adapter for which to wait for completion of its error recovery
1539 void zfcp_erp_wait(struct zfcp_adapter *adapter)
1541 wait_event(adapter->erp_done_wqh,
1542 !(atomic_read(&adapter->status) &
1543 ZFCP_STATUS_ADAPTER_ERP_PENDING));
1547 * zfcp_erp_set_adapter_status - set adapter status bits
1548 * @adapter: adapter to change the status
1549 * @mask: status bits to change
1551 * Changes in common status bits are propagated to attached ports and LUNs.
1553 void zfcp_erp_set_adapter_status(struct zfcp_adapter *adapter, u32 mask)
1555 struct zfcp_port *port;
1556 struct scsi_device *sdev;
1557 unsigned long flags;
1558 u32 common_mask = mask & ZFCP_COMMON_FLAGS;
1560 atomic_or(mask, &adapter->status);
1565 read_lock_irqsave(&adapter->port_list_lock, flags);
1566 list_for_each_entry(port, &adapter->port_list, list)
1567 atomic_or(common_mask, &port->status);
1568 read_unlock_irqrestore(&adapter->port_list_lock, flags);
1570 spin_lock_irqsave(adapter->scsi_host->host_lock, flags);
1571 __shost_for_each_device(sdev, adapter->scsi_host)
1572 atomic_or(common_mask, &sdev_to_zfcp(sdev)->status);
1573 spin_unlock_irqrestore(adapter->scsi_host->host_lock, flags);
1577 * zfcp_erp_clear_adapter_status - clear adapter status bits
1578 * @adapter: adapter to change the status
1579 * @mask: status bits to change
1581 * Changes in common status bits are propagated to attached ports and LUNs.
1583 void zfcp_erp_clear_adapter_status(struct zfcp_adapter *adapter, u32 mask)
1585 struct zfcp_port *port;
1586 struct scsi_device *sdev;
1587 unsigned long flags;
1588 u32 common_mask = mask & ZFCP_COMMON_FLAGS;
1589 u32 clear_counter = mask & ZFCP_STATUS_COMMON_ERP_FAILED;
1591 atomic_andnot(mask, &adapter->status);
1597 atomic_set(&adapter->erp_counter, 0);
1599 read_lock_irqsave(&adapter->port_list_lock, flags);
1600 list_for_each_entry(port, &adapter->port_list, list) {
1601 atomic_andnot(common_mask, &port->status);
1603 atomic_set(&port->erp_counter, 0);
1605 read_unlock_irqrestore(&adapter->port_list_lock, flags);
1607 spin_lock_irqsave(adapter->scsi_host->host_lock, flags);
1608 __shost_for_each_device(sdev, adapter->scsi_host) {
1609 atomic_andnot(common_mask, &sdev_to_zfcp(sdev)->status);
1611 atomic_set(&sdev_to_zfcp(sdev)->erp_counter, 0);
1613 spin_unlock_irqrestore(adapter->scsi_host->host_lock, flags);
1617 * zfcp_erp_set_port_status - set port status bits
1618 * @port: port to change the status
1619 * @mask: status bits to change
1621 * Changes in common status bits are propagated to attached LUNs.
1623 void zfcp_erp_set_port_status(struct zfcp_port *port, u32 mask)
1625 struct scsi_device *sdev;
1626 u32 common_mask = mask & ZFCP_COMMON_FLAGS;
1627 unsigned long flags;
1629 atomic_or(mask, &port->status);
1634 spin_lock_irqsave(port->adapter->scsi_host->host_lock, flags);
1635 __shost_for_each_device(sdev, port->adapter->scsi_host)
1636 if (sdev_to_zfcp(sdev)->port == port)
1637 atomic_or(common_mask,
1638 &sdev_to_zfcp(sdev)->status);
1639 spin_unlock_irqrestore(port->adapter->scsi_host->host_lock, flags);
1643 * zfcp_erp_clear_port_status - clear port status bits
1644 * @port: adapter to change the status
1645 * @mask: status bits to change
1647 * Changes in common status bits are propagated to attached LUNs.
1649 void zfcp_erp_clear_port_status(struct zfcp_port *port, u32 mask)
1651 struct scsi_device *sdev;
1652 u32 common_mask = mask & ZFCP_COMMON_FLAGS;
1653 u32 clear_counter = mask & ZFCP_STATUS_COMMON_ERP_FAILED;
1654 unsigned long flags;
1656 atomic_andnot(mask, &port->status);
1662 atomic_set(&port->erp_counter, 0);
1664 spin_lock_irqsave(port->adapter->scsi_host->host_lock, flags);
1665 __shost_for_each_device(sdev, port->adapter->scsi_host)
1666 if (sdev_to_zfcp(sdev)->port == port) {
1667 atomic_andnot(common_mask,
1668 &sdev_to_zfcp(sdev)->status);
1670 atomic_set(&sdev_to_zfcp(sdev)->erp_counter, 0);
1672 spin_unlock_irqrestore(port->adapter->scsi_host->host_lock, flags);
1676 * zfcp_erp_set_lun_status - set lun status bits
1677 * @sdev: SCSI device / lun to set the status bits
1678 * @mask: status bits to change
1680 void zfcp_erp_set_lun_status(struct scsi_device *sdev, u32 mask)
1682 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
1684 atomic_or(mask, &zfcp_sdev->status);
1688 * zfcp_erp_clear_lun_status - clear lun status bits
1689 * @sdev: SCSi device / lun to clear the status bits
1690 * @mask: status bits to change
1692 void zfcp_erp_clear_lun_status(struct scsi_device *sdev, u32 mask)
1694 struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
1696 atomic_andnot(mask, &zfcp_sdev->status);
1698 if (mask & ZFCP_STATUS_COMMON_ERP_FAILED)
1699 atomic_set(&zfcp_sdev->erp_counter, 0);