zfcp_erp.c 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644
  1. /*
  2. * zfcp device driver
  3. *
  4. * Error Recovery Procedures (ERP).
  5. *
  6. * Copyright IBM Corporation 2002, 2009
  7. */
  8. #define KMSG_COMPONENT "zfcp"
  9. #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
  10. #include "zfcp_ext.h"
  11. #define ZFCP_MAX_ERPS 3
  12. enum zfcp_erp_act_flags {
  13. ZFCP_STATUS_ERP_TIMEDOUT = 0x10000000,
  14. ZFCP_STATUS_ERP_CLOSE_ONLY = 0x01000000,
  15. ZFCP_STATUS_ERP_DISMISSING = 0x00100000,
  16. ZFCP_STATUS_ERP_DISMISSED = 0x00200000,
  17. ZFCP_STATUS_ERP_LOWMEM = 0x00400000,
  18. };
  19. enum zfcp_erp_steps {
  20. ZFCP_ERP_STEP_UNINITIALIZED = 0x0000,
  21. ZFCP_ERP_STEP_FSF_XCONFIG = 0x0001,
  22. ZFCP_ERP_STEP_PHYS_PORT_CLOSING = 0x0010,
  23. ZFCP_ERP_STEP_PORT_CLOSING = 0x0100,
  24. ZFCP_ERP_STEP_NAMESERVER_LOOKUP = 0x0400,
  25. ZFCP_ERP_STEP_PORT_OPENING = 0x0800,
  26. ZFCP_ERP_STEP_UNIT_CLOSING = 0x1000,
  27. ZFCP_ERP_STEP_UNIT_OPENING = 0x2000,
  28. };
  29. enum zfcp_erp_act_type {
  30. ZFCP_ERP_ACTION_REOPEN_UNIT = 1,
  31. ZFCP_ERP_ACTION_REOPEN_PORT = 2,
  32. ZFCP_ERP_ACTION_REOPEN_PORT_FORCED = 3,
  33. ZFCP_ERP_ACTION_REOPEN_ADAPTER = 4,
  34. };
  35. enum zfcp_erp_act_state {
  36. ZFCP_ERP_ACTION_RUNNING = 1,
  37. ZFCP_ERP_ACTION_READY = 2,
  38. };
  39. enum zfcp_erp_act_result {
  40. ZFCP_ERP_SUCCEEDED = 0,
  41. ZFCP_ERP_FAILED = 1,
  42. ZFCP_ERP_CONTINUES = 2,
  43. ZFCP_ERP_EXIT = 3,
  44. ZFCP_ERP_DISMISSED = 4,
  45. ZFCP_ERP_NOMEM = 5,
  46. };
  47. static void zfcp_erp_adapter_block(struct zfcp_adapter *adapter, int mask)
  48. {
  49. zfcp_erp_modify_adapter_status(adapter, "erablk1", NULL,
  50. ZFCP_STATUS_COMMON_UNBLOCKED | mask,
  51. ZFCP_CLEAR);
  52. }
  53. static int zfcp_erp_action_exists(struct zfcp_erp_action *act)
  54. {
  55. struct zfcp_erp_action *curr_act;
  56. list_for_each_entry(curr_act, &act->adapter->erp_running_head, list)
  57. if (act == curr_act)
  58. return ZFCP_ERP_ACTION_RUNNING;
  59. return 0;
  60. }
  61. static void zfcp_erp_action_ready(struct zfcp_erp_action *act)
  62. {
  63. struct zfcp_adapter *adapter = act->adapter;
  64. list_move(&act->list, &act->adapter->erp_ready_head);
  65. zfcp_rec_dbf_event_action("erardy1", act);
  66. up(&adapter->erp_ready_sem);
  67. zfcp_rec_dbf_event_thread("erardy2", adapter);
  68. }
  69. static void zfcp_erp_action_dismiss(struct zfcp_erp_action *act)
  70. {
  71. act->status |= ZFCP_STATUS_ERP_DISMISSED;
  72. if (zfcp_erp_action_exists(act) == ZFCP_ERP_ACTION_RUNNING)
  73. zfcp_erp_action_ready(act);
  74. }
  75. static void zfcp_erp_action_dismiss_unit(struct zfcp_unit *unit)
  76. {
  77. if (atomic_read(&unit->status) & ZFCP_STATUS_COMMON_ERP_INUSE)
  78. zfcp_erp_action_dismiss(&unit->erp_action);
  79. }
  80. static void zfcp_erp_action_dismiss_port(struct zfcp_port *port)
  81. {
  82. struct zfcp_unit *unit;
  83. if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_INUSE)
  84. zfcp_erp_action_dismiss(&port->erp_action);
  85. else
  86. list_for_each_entry(unit, &port->unit_list_head, list)
  87. zfcp_erp_action_dismiss_unit(unit);
  88. }
  89. static void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter)
  90. {
  91. struct zfcp_port *port;
  92. if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_ERP_INUSE)
  93. zfcp_erp_action_dismiss(&adapter->erp_action);
  94. else
  95. list_for_each_entry(port, &adapter->port_list_head, list)
  96. zfcp_erp_action_dismiss_port(port);
  97. }
  98. static int zfcp_erp_required_act(int want, struct zfcp_adapter *adapter,
  99. struct zfcp_port *port,
  100. struct zfcp_unit *unit)
  101. {
  102. int need = want;
  103. int u_status, p_status, a_status;
  104. switch (want) {
  105. case ZFCP_ERP_ACTION_REOPEN_UNIT:
  106. u_status = atomic_read(&unit->status);
  107. if (u_status & ZFCP_STATUS_COMMON_ERP_INUSE)
  108. return 0;
  109. p_status = atomic_read(&port->status);
  110. if (!(p_status & ZFCP_STATUS_COMMON_RUNNING) ||
  111. p_status & ZFCP_STATUS_COMMON_ERP_FAILED)
  112. return 0;
  113. if (!(p_status & ZFCP_STATUS_COMMON_UNBLOCKED))
  114. need = ZFCP_ERP_ACTION_REOPEN_PORT;
  115. /* fall through */
  116. case ZFCP_ERP_ACTION_REOPEN_PORT:
  117. case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
  118. p_status = atomic_read(&port->status);
  119. if (p_status & ZFCP_STATUS_COMMON_ERP_INUSE)
  120. return 0;
  121. a_status = atomic_read(&adapter->status);
  122. if (!(a_status & ZFCP_STATUS_COMMON_RUNNING) ||
  123. a_status & ZFCP_STATUS_COMMON_ERP_FAILED)
  124. return 0;
  125. if (!(a_status & ZFCP_STATUS_COMMON_UNBLOCKED))
  126. need = ZFCP_ERP_ACTION_REOPEN_ADAPTER;
  127. /* fall through */
  128. case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
  129. a_status = atomic_read(&adapter->status);
  130. if (a_status & ZFCP_STATUS_COMMON_ERP_INUSE)
  131. return 0;
  132. }
  133. return need;
  134. }
  135. static struct zfcp_erp_action *zfcp_erp_setup_act(int need,
  136. struct zfcp_adapter *adapter,
  137. struct zfcp_port *port,
  138. struct zfcp_unit *unit)
  139. {
  140. struct zfcp_erp_action *erp_action;
  141. u32 status = 0;
  142. switch (need) {
  143. case ZFCP_ERP_ACTION_REOPEN_UNIT:
  144. zfcp_unit_get(unit);
  145. atomic_set_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &unit->status);
  146. erp_action = &unit->erp_action;
  147. if (!(atomic_read(&unit->status) & ZFCP_STATUS_COMMON_RUNNING))
  148. status = ZFCP_STATUS_ERP_CLOSE_ONLY;
  149. break;
  150. case ZFCP_ERP_ACTION_REOPEN_PORT:
  151. case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
  152. zfcp_port_get(port);
  153. zfcp_erp_action_dismiss_port(port);
  154. atomic_set_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &port->status);
  155. erp_action = &port->erp_action;
  156. if (!(atomic_read(&port->status) & ZFCP_STATUS_COMMON_RUNNING))
  157. status = ZFCP_STATUS_ERP_CLOSE_ONLY;
  158. break;
  159. case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
  160. zfcp_adapter_get(adapter);
  161. zfcp_erp_action_dismiss_adapter(adapter);
  162. atomic_set_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &adapter->status);
  163. erp_action = &adapter->erp_action;
  164. if (!(atomic_read(&adapter->status) &
  165. ZFCP_STATUS_COMMON_RUNNING))
  166. status = ZFCP_STATUS_ERP_CLOSE_ONLY;
  167. break;
  168. default:
  169. return NULL;
  170. }
  171. memset(erp_action, 0, sizeof(struct zfcp_erp_action));
  172. erp_action->adapter = adapter;
  173. erp_action->port = port;
  174. erp_action->unit = unit;
  175. erp_action->action = need;
  176. erp_action->status = status;
  177. return erp_action;
  178. }
  179. static int zfcp_erp_action_enqueue(int want, struct zfcp_adapter *adapter,
  180. struct zfcp_port *port,
  181. struct zfcp_unit *unit, char *id, void *ref)
  182. {
  183. int retval = 1, need;
  184. struct zfcp_erp_action *act = NULL;
  185. if (!(atomic_read(&adapter->status) &
  186. ZFCP_STATUS_ADAPTER_ERP_THREAD_UP))
  187. return -EIO;
  188. need = zfcp_erp_required_act(want, adapter, port, unit);
  189. if (!need)
  190. goto out;
  191. atomic_set_mask(ZFCP_STATUS_ADAPTER_ERP_PENDING, &adapter->status);
  192. act = zfcp_erp_setup_act(need, adapter, port, unit);
  193. if (!act)
  194. goto out;
  195. ++adapter->erp_total_count;
  196. list_add_tail(&act->list, &adapter->erp_ready_head);
  197. up(&adapter->erp_ready_sem);
  198. zfcp_rec_dbf_event_thread("eracte1", adapter);
  199. retval = 0;
  200. out:
  201. zfcp_rec_dbf_event_trigger(id, ref, want, need, act,
  202. adapter, port, unit);
  203. return retval;
  204. }
  205. static int _zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter,
  206. int clear_mask, char *id, void *ref)
  207. {
  208. zfcp_erp_adapter_block(adapter, clear_mask);
  209. zfcp_scsi_schedule_rports_block(adapter);
  210. /* ensure propagation of failed status to new devices */
  211. if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_ERP_FAILED) {
  212. zfcp_erp_adapter_failed(adapter, "erareo1", NULL);
  213. return -EIO;
  214. }
  215. return zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_ADAPTER,
  216. adapter, NULL, NULL, id, ref);
  217. }
  218. /**
  219. * zfcp_erp_adapter_reopen - Reopen adapter.
  220. * @adapter: Adapter to reopen.
  221. * @clear: Status flags to clear.
  222. * @id: Id for debug trace event.
  223. * @ref: Reference for debug trace event.
  224. */
  225. void zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter, int clear,
  226. char *id, void *ref)
  227. {
  228. unsigned long flags;
  229. read_lock_irqsave(&zfcp_data.config_lock, flags);
  230. write_lock(&adapter->erp_lock);
  231. _zfcp_erp_adapter_reopen(adapter, clear, id, ref);
  232. write_unlock(&adapter->erp_lock);
  233. read_unlock_irqrestore(&zfcp_data.config_lock, flags);
  234. }
  235. /**
  236. * zfcp_erp_adapter_shutdown - Shutdown adapter.
  237. * @adapter: Adapter to shut down.
  238. * @clear: Status flags to clear.
  239. * @id: Id for debug trace event.
  240. * @ref: Reference for debug trace event.
  241. */
  242. void zfcp_erp_adapter_shutdown(struct zfcp_adapter *adapter, int clear,
  243. char *id, void *ref)
  244. {
  245. int flags = ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED;
  246. zfcp_erp_adapter_reopen(adapter, clear | flags, id, ref);
  247. }
  248. /**
  249. * zfcp_erp_port_shutdown - Shutdown port
  250. * @port: Port to shut down.
  251. * @clear: Status flags to clear.
  252. * @id: Id for debug trace event.
  253. * @ref: Reference for debug trace event.
  254. */
  255. void zfcp_erp_port_shutdown(struct zfcp_port *port, int clear, char *id,
  256. void *ref)
  257. {
  258. int flags = ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED;
  259. zfcp_erp_port_reopen(port, clear | flags, id, ref);
  260. }
  261. /**
  262. * zfcp_erp_unit_shutdown - Shutdown unit
  263. * @unit: Unit to shut down.
  264. * @clear: Status flags to clear.
  265. * @id: Id for debug trace event.
  266. * @ref: Reference for debug trace event.
  267. */
  268. void zfcp_erp_unit_shutdown(struct zfcp_unit *unit, int clear, char *id,
  269. void *ref)
  270. {
  271. int flags = ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED;
  272. zfcp_erp_unit_reopen(unit, clear | flags, id, ref);
  273. }
  274. static void zfcp_erp_port_block(struct zfcp_port *port, int clear)
  275. {
  276. zfcp_erp_modify_port_status(port, "erpblk1", NULL,
  277. ZFCP_STATUS_COMMON_UNBLOCKED | clear,
  278. ZFCP_CLEAR);
  279. }
  280. static void _zfcp_erp_port_forced_reopen(struct zfcp_port *port,
  281. int clear, char *id, void *ref)
  282. {
  283. zfcp_erp_port_block(port, clear);
  284. zfcp_scsi_schedule_rport_block(port);
  285. if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_FAILED)
  286. return;
  287. zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT_FORCED,
  288. port->adapter, port, NULL, id, ref);
  289. }
  290. /**
  291. * zfcp_erp_port_forced_reopen - Forced close of port and open again
  292. * @port: Port to force close and to reopen.
  293. * @id: Id for debug trace event.
  294. * @ref: Reference for debug trace event.
  295. */
  296. void zfcp_erp_port_forced_reopen(struct zfcp_port *port, int clear, char *id,
  297. void *ref)
  298. {
  299. unsigned long flags;
  300. struct zfcp_adapter *adapter = port->adapter;
  301. read_lock_irqsave(&zfcp_data.config_lock, flags);
  302. write_lock(&adapter->erp_lock);
  303. _zfcp_erp_port_forced_reopen(port, clear, id, ref);
  304. write_unlock(&adapter->erp_lock);
  305. read_unlock_irqrestore(&zfcp_data.config_lock, flags);
  306. }
  307. static int _zfcp_erp_port_reopen(struct zfcp_port *port, int clear, char *id,
  308. void *ref)
  309. {
  310. zfcp_erp_port_block(port, clear);
  311. zfcp_scsi_schedule_rport_block(port);
  312. if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_FAILED) {
  313. /* ensure propagation of failed status to new devices */
  314. zfcp_erp_port_failed(port, "erpreo1", NULL);
  315. return -EIO;
  316. }
  317. return zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT,
  318. port->adapter, port, NULL, id, ref);
  319. }
  320. /**
  321. * zfcp_erp_port_reopen - trigger remote port recovery
  322. * @port: port to recover
  323. * @clear_mask: flags in port status to be cleared
  324. *
  325. * Returns 0 if recovery has been triggered, < 0 if not.
  326. */
  327. int zfcp_erp_port_reopen(struct zfcp_port *port, int clear, char *id, void *ref)
  328. {
  329. unsigned long flags;
  330. int retval;
  331. struct zfcp_adapter *adapter = port->adapter;
  332. read_lock_irqsave(&zfcp_data.config_lock, flags);
  333. write_lock(&adapter->erp_lock);
  334. retval = _zfcp_erp_port_reopen(port, clear, id, ref);
  335. write_unlock(&adapter->erp_lock);
  336. read_unlock_irqrestore(&zfcp_data.config_lock, flags);
  337. return retval;
  338. }
  339. static void zfcp_erp_unit_block(struct zfcp_unit *unit, int clear_mask)
  340. {
  341. zfcp_erp_modify_unit_status(unit, "erublk1", NULL,
  342. ZFCP_STATUS_COMMON_UNBLOCKED | clear_mask,
  343. ZFCP_CLEAR);
  344. }
  345. static void _zfcp_erp_unit_reopen(struct zfcp_unit *unit, int clear, char *id,
  346. void *ref)
  347. {
  348. struct zfcp_adapter *adapter = unit->port->adapter;
  349. zfcp_erp_unit_block(unit, clear);
  350. if (atomic_read(&unit->status) & ZFCP_STATUS_COMMON_ERP_FAILED)
  351. return;
  352. zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_UNIT,
  353. adapter, unit->port, unit, id, ref);
  354. }
  355. /**
  356. * zfcp_erp_unit_reopen - initiate reopen of a unit
  357. * @unit: unit to be reopened
  358. * @clear_mask: specifies flags in unit status to be cleared
  359. * Return: 0 on success, < 0 on error
  360. */
  361. void zfcp_erp_unit_reopen(struct zfcp_unit *unit, int clear, char *id,
  362. void *ref)
  363. {
  364. unsigned long flags;
  365. struct zfcp_port *port = unit->port;
  366. struct zfcp_adapter *adapter = port->adapter;
  367. read_lock_irqsave(&zfcp_data.config_lock, flags);
  368. write_lock(&adapter->erp_lock);
  369. _zfcp_erp_unit_reopen(unit, clear, id, ref);
  370. write_unlock(&adapter->erp_lock);
  371. read_unlock_irqrestore(&zfcp_data.config_lock, flags);
  372. }
  373. static int status_change_set(unsigned long mask, atomic_t *status)
  374. {
  375. return (atomic_read(status) ^ mask) & mask;
  376. }
  377. static int status_change_clear(unsigned long mask, atomic_t *status)
  378. {
  379. return atomic_read(status) & mask;
  380. }
  381. static void zfcp_erp_adapter_unblock(struct zfcp_adapter *adapter)
  382. {
  383. if (status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status))
  384. zfcp_rec_dbf_event_adapter("eraubl1", NULL, adapter);
  385. atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status);
  386. }
  387. static void zfcp_erp_port_unblock(struct zfcp_port *port)
  388. {
  389. if (status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED, &port->status))
  390. zfcp_rec_dbf_event_port("erpubl1", NULL, port);
  391. atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &port->status);
  392. }
  393. static void zfcp_erp_unit_unblock(struct zfcp_unit *unit)
  394. {
  395. if (status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED, &unit->status))
  396. zfcp_rec_dbf_event_unit("eruubl1", NULL, unit);
  397. atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &unit->status);
  398. }
  399. static void zfcp_erp_action_to_running(struct zfcp_erp_action *erp_action)
  400. {
  401. list_move(&erp_action->list, &erp_action->adapter->erp_running_head);
  402. zfcp_rec_dbf_event_action("erator1", erp_action);
  403. }
  404. static void zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *act)
  405. {
  406. struct zfcp_adapter *adapter = act->adapter;
  407. if (!act->fsf_req)
  408. return;
  409. spin_lock(&adapter->req_list_lock);
  410. if (zfcp_reqlist_find_safe(adapter, act->fsf_req) &&
  411. act->fsf_req->erp_action == act) {
  412. if (act->status & (ZFCP_STATUS_ERP_DISMISSED |
  413. ZFCP_STATUS_ERP_TIMEDOUT)) {
  414. act->fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED;
  415. zfcp_rec_dbf_event_action("erscf_1", act);
  416. act->fsf_req->erp_action = NULL;
  417. }
  418. if (act->status & ZFCP_STATUS_ERP_TIMEDOUT)
  419. zfcp_rec_dbf_event_action("erscf_2", act);
  420. if (act->fsf_req->status & ZFCP_STATUS_FSFREQ_DISMISSED)
  421. act->fsf_req = NULL;
  422. } else
  423. act->fsf_req = NULL;
  424. spin_unlock(&adapter->req_list_lock);
  425. }
  426. /**
  427. * zfcp_erp_notify - Trigger ERP action.
  428. * @erp_action: ERP action to continue.
  429. * @set_mask: ERP action status flags to set.
  430. */
  431. void zfcp_erp_notify(struct zfcp_erp_action *erp_action, unsigned long set_mask)
  432. {
  433. struct zfcp_adapter *adapter = erp_action->adapter;
  434. unsigned long flags;
  435. write_lock_irqsave(&adapter->erp_lock, flags);
  436. if (zfcp_erp_action_exists(erp_action) == ZFCP_ERP_ACTION_RUNNING) {
  437. erp_action->status |= set_mask;
  438. zfcp_erp_action_ready(erp_action);
  439. }
  440. write_unlock_irqrestore(&adapter->erp_lock, flags);
  441. }
  442. /**
  443. * zfcp_erp_timeout_handler - Trigger ERP action from timed out ERP request
  444. * @data: ERP action (from timer data)
  445. */
  446. void zfcp_erp_timeout_handler(unsigned long data)
  447. {
  448. struct zfcp_erp_action *act = (struct zfcp_erp_action *) data;
  449. zfcp_erp_notify(act, ZFCP_STATUS_ERP_TIMEDOUT);
  450. }
  451. static void zfcp_erp_memwait_handler(unsigned long data)
  452. {
  453. zfcp_erp_notify((struct zfcp_erp_action *)data, 0);
  454. }
  455. static void zfcp_erp_strategy_memwait(struct zfcp_erp_action *erp_action)
  456. {
  457. init_timer(&erp_action->timer);
  458. erp_action->timer.function = zfcp_erp_memwait_handler;
  459. erp_action->timer.data = (unsigned long) erp_action;
  460. erp_action->timer.expires = jiffies + HZ;
  461. add_timer(&erp_action->timer);
  462. }
  463. static void _zfcp_erp_port_reopen_all(struct zfcp_adapter *adapter,
  464. int clear, char *id, void *ref)
  465. {
  466. struct zfcp_port *port;
  467. list_for_each_entry(port, &adapter->port_list_head, list)
  468. _zfcp_erp_port_reopen(port, clear, id, ref);
  469. }
  470. static void _zfcp_erp_unit_reopen_all(struct zfcp_port *port, int clear,
  471. char *id, void *ref)
  472. {
  473. struct zfcp_unit *unit;
  474. list_for_each_entry(unit, &port->unit_list_head, list)
  475. _zfcp_erp_unit_reopen(unit, clear, id, ref);
  476. }
  477. static void zfcp_erp_strategy_followup_failed(struct zfcp_erp_action *act)
  478. {
  479. switch (act->action) {
  480. case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
  481. _zfcp_erp_adapter_reopen(act->adapter, 0, "ersff_1", NULL);
  482. break;
  483. case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
  484. _zfcp_erp_port_forced_reopen(act->port, 0, "ersff_2", NULL);
  485. break;
  486. case ZFCP_ERP_ACTION_REOPEN_PORT:
  487. _zfcp_erp_port_reopen(act->port, 0, "ersff_3", NULL);
  488. break;
  489. case ZFCP_ERP_ACTION_REOPEN_UNIT:
  490. _zfcp_erp_unit_reopen(act->unit, 0, "ersff_4", NULL);
  491. break;
  492. }
  493. }
  494. static void zfcp_erp_strategy_followup_success(struct zfcp_erp_action *act)
  495. {
  496. switch (act->action) {
  497. case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
  498. _zfcp_erp_port_reopen_all(act->adapter, 0, "ersfs_1", NULL);
  499. break;
  500. case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
  501. _zfcp_erp_port_reopen(act->port, 0, "ersfs_2", NULL);
  502. break;
  503. case ZFCP_ERP_ACTION_REOPEN_PORT:
  504. _zfcp_erp_unit_reopen_all(act->port, 0, "ersfs_3", NULL);
  505. break;
  506. }
  507. }
  508. static void zfcp_erp_wakeup(struct zfcp_adapter *adapter)
  509. {
  510. unsigned long flags;
  511. read_lock_irqsave(&zfcp_data.config_lock, flags);
  512. read_lock(&adapter->erp_lock);
  513. if (list_empty(&adapter->erp_ready_head) &&
  514. list_empty(&adapter->erp_running_head)) {
  515. atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_PENDING,
  516. &adapter->status);
  517. wake_up(&adapter->erp_done_wqh);
  518. }
  519. read_unlock(&adapter->erp_lock);
  520. read_unlock_irqrestore(&zfcp_data.config_lock, flags);
  521. }
  522. static int zfcp_erp_adapter_strategy_open_qdio(struct zfcp_erp_action *act)
  523. {
  524. if (zfcp_qdio_open(act->adapter))
  525. return ZFCP_ERP_FAILED;
  526. init_waitqueue_head(&act->adapter->request_wq);
  527. atomic_set_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &act->adapter->status);
  528. return ZFCP_ERP_SUCCEEDED;
  529. }
  530. static void zfcp_erp_enqueue_ptp_port(struct zfcp_adapter *adapter)
  531. {
  532. struct zfcp_port *port;
  533. port = zfcp_port_enqueue(adapter, adapter->peer_wwpn, 0,
  534. adapter->peer_d_id);
  535. if (IS_ERR(port)) /* error or port already attached */
  536. return;
  537. _zfcp_erp_port_reopen(port, 0, "ereptp1", NULL);
  538. }
  539. static int zfcp_erp_adapter_strat_fsf_xconf(struct zfcp_erp_action *erp_action)
  540. {
  541. int retries;
  542. int sleep = 1;
  543. struct zfcp_adapter *adapter = erp_action->adapter;
  544. atomic_clear_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK, &adapter->status);
  545. for (retries = 7; retries; retries--) {
  546. atomic_clear_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT,
  547. &adapter->status);
  548. write_lock_irq(&adapter->erp_lock);
  549. zfcp_erp_action_to_running(erp_action);
  550. write_unlock_irq(&adapter->erp_lock);
  551. if (zfcp_fsf_exchange_config_data(erp_action)) {
  552. atomic_clear_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT,
  553. &adapter->status);
  554. return ZFCP_ERP_FAILED;
  555. }
  556. zfcp_rec_dbf_event_thread_lock("erasfx1", adapter);
  557. down(&adapter->erp_ready_sem);
  558. zfcp_rec_dbf_event_thread_lock("erasfx2", adapter);
  559. if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT)
  560. break;
  561. if (!(atomic_read(&adapter->status) &
  562. ZFCP_STATUS_ADAPTER_HOST_CON_INIT))
  563. break;
  564. ssleep(sleep);
  565. sleep *= 2;
  566. }
  567. atomic_clear_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT,
  568. &adapter->status);
  569. if (!(atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_XCONFIG_OK))
  570. return ZFCP_ERP_FAILED;
  571. if (fc_host_port_type(adapter->scsi_host) == FC_PORTTYPE_PTP)
  572. zfcp_erp_enqueue_ptp_port(adapter);
  573. return ZFCP_ERP_SUCCEEDED;
  574. }
  575. static int zfcp_erp_adapter_strategy_open_fsf_xport(struct zfcp_erp_action *act)
  576. {
  577. int ret;
  578. struct zfcp_adapter *adapter = act->adapter;
  579. write_lock_irq(&adapter->erp_lock);
  580. zfcp_erp_action_to_running(act);
  581. write_unlock_irq(&adapter->erp_lock);
  582. ret = zfcp_fsf_exchange_port_data(act);
  583. if (ret == -EOPNOTSUPP)
  584. return ZFCP_ERP_SUCCEEDED;
  585. if (ret)
  586. return ZFCP_ERP_FAILED;
  587. zfcp_rec_dbf_event_thread_lock("erasox1", adapter);
  588. down(&adapter->erp_ready_sem);
  589. zfcp_rec_dbf_event_thread_lock("erasox2", adapter);
  590. if (act->status & ZFCP_STATUS_ERP_TIMEDOUT)
  591. return ZFCP_ERP_FAILED;
  592. return ZFCP_ERP_SUCCEEDED;
  593. }
  594. static int zfcp_erp_adapter_strategy_open_fsf(struct zfcp_erp_action *act)
  595. {
  596. if (zfcp_erp_adapter_strat_fsf_xconf(act) == ZFCP_ERP_FAILED)
  597. return ZFCP_ERP_FAILED;
  598. if (zfcp_erp_adapter_strategy_open_fsf_xport(act) == ZFCP_ERP_FAILED)
  599. return ZFCP_ERP_FAILED;
  600. atomic_set(&act->adapter->stat_miss, 16);
  601. if (zfcp_status_read_refill(act->adapter))
  602. return ZFCP_ERP_FAILED;
  603. return ZFCP_ERP_SUCCEEDED;
  604. }
  605. static void zfcp_erp_adapter_strategy_close(struct zfcp_erp_action *act)
  606. {
  607. struct zfcp_adapter *adapter = act->adapter;
  608. /* close queues to ensure that buffers are not accessed by adapter */
  609. zfcp_qdio_close(adapter);
  610. zfcp_fsf_req_dismiss_all(adapter);
  611. adapter->fsf_req_seq_no = 0;
  612. zfcp_fc_wka_ports_force_offline(adapter->gs);
  613. /* all ports and units are closed */
  614. zfcp_erp_modify_adapter_status(adapter, "erascl1", NULL,
  615. ZFCP_STATUS_COMMON_OPEN, ZFCP_CLEAR);
  616. atomic_clear_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK |
  617. ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, &adapter->status);
  618. }
  619. static int zfcp_erp_adapter_strategy_open(struct zfcp_erp_action *act)
  620. {
  621. struct zfcp_adapter *adapter = act->adapter;
  622. if (zfcp_erp_adapter_strategy_open_qdio(act)) {
  623. atomic_clear_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK |
  624. ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED,
  625. &adapter->status);
  626. return ZFCP_ERP_FAILED;
  627. }
  628. if (zfcp_erp_adapter_strategy_open_fsf(act)) {
  629. zfcp_erp_adapter_strategy_close(act);
  630. return ZFCP_ERP_FAILED;
  631. }
  632. atomic_set_mask(ZFCP_STATUS_COMMON_OPEN, &adapter->status);
  633. return ZFCP_ERP_SUCCEEDED;
  634. }
  635. static int zfcp_erp_adapter_strategy(struct zfcp_erp_action *act)
  636. {
  637. struct zfcp_adapter *adapter = act->adapter;
  638. if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_OPEN) {
  639. zfcp_erp_adapter_strategy_close(act);
  640. if (act->status & ZFCP_STATUS_ERP_CLOSE_ONLY)
  641. return ZFCP_ERP_EXIT;
  642. }
  643. if (zfcp_erp_adapter_strategy_open(act)) {
  644. ssleep(8);
  645. return ZFCP_ERP_FAILED;
  646. }
  647. return ZFCP_ERP_SUCCEEDED;
  648. }
  649. static int zfcp_erp_port_forced_strategy_close(struct zfcp_erp_action *act)
  650. {
  651. int retval;
  652. retval = zfcp_fsf_close_physical_port(act);
  653. if (retval == -ENOMEM)
  654. return ZFCP_ERP_NOMEM;
  655. act->step = ZFCP_ERP_STEP_PHYS_PORT_CLOSING;
  656. if (retval)
  657. return ZFCP_ERP_FAILED;
  658. return ZFCP_ERP_CONTINUES;
  659. }
  660. static void zfcp_erp_port_strategy_clearstati(struct zfcp_port *port)
  661. {
  662. atomic_clear_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED, &port->status);
  663. }
  664. static int zfcp_erp_port_forced_strategy(struct zfcp_erp_action *erp_action)
  665. {
  666. struct zfcp_port *port = erp_action->port;
  667. int status = atomic_read(&port->status);
  668. switch (erp_action->step) {
  669. case ZFCP_ERP_STEP_UNINITIALIZED:
  670. zfcp_erp_port_strategy_clearstati(port);
  671. if ((status & ZFCP_STATUS_PORT_PHYS_OPEN) &&
  672. (status & ZFCP_STATUS_COMMON_OPEN))
  673. return zfcp_erp_port_forced_strategy_close(erp_action);
  674. else
  675. return ZFCP_ERP_FAILED;
  676. case ZFCP_ERP_STEP_PHYS_PORT_CLOSING:
  677. if (!(status & ZFCP_STATUS_PORT_PHYS_OPEN))
  678. return ZFCP_ERP_SUCCEEDED;
  679. }
  680. return ZFCP_ERP_FAILED;
  681. }
  682. static int zfcp_erp_port_strategy_close(struct zfcp_erp_action *erp_action)
  683. {
  684. int retval;
  685. retval = zfcp_fsf_close_port(erp_action);
  686. if (retval == -ENOMEM)
  687. return ZFCP_ERP_NOMEM;
  688. erp_action->step = ZFCP_ERP_STEP_PORT_CLOSING;
  689. if (retval)
  690. return ZFCP_ERP_FAILED;
  691. return ZFCP_ERP_CONTINUES;
  692. }
  693. static int zfcp_erp_port_strategy_open_port(struct zfcp_erp_action *erp_action)
  694. {
  695. int retval;
  696. retval = zfcp_fsf_open_port(erp_action);
  697. if (retval == -ENOMEM)
  698. return ZFCP_ERP_NOMEM;
  699. erp_action->step = ZFCP_ERP_STEP_PORT_OPENING;
  700. if (retval)
  701. return ZFCP_ERP_FAILED;
  702. return ZFCP_ERP_CONTINUES;
  703. }
  704. static int zfcp_erp_open_ptp_port(struct zfcp_erp_action *act)
  705. {
  706. struct zfcp_adapter *adapter = act->adapter;
  707. struct zfcp_port *port = act->port;
  708. if (port->wwpn != adapter->peer_wwpn) {
  709. zfcp_erp_port_failed(port, "eroptp1", NULL);
  710. return ZFCP_ERP_FAILED;
  711. }
  712. port->d_id = adapter->peer_d_id;
  713. return zfcp_erp_port_strategy_open_port(act);
  714. }
  715. void zfcp_erp_port_strategy_open_lookup(struct work_struct *work)
  716. {
  717. int retval;
  718. struct zfcp_port *port = container_of(work, struct zfcp_port,
  719. gid_pn_work);
  720. retval = zfcp_fc_ns_gid_pn(&port->erp_action);
  721. if (!retval) {
  722. port->erp_action.step = ZFCP_ERP_STEP_NAMESERVER_LOOKUP;
  723. goto out;
  724. }
  725. if (retval == -ENOMEM) {
  726. zfcp_erp_notify(&port->erp_action, ZFCP_STATUS_ERP_LOWMEM);
  727. goto out;
  728. }
  729. /* all other error condtions */
  730. zfcp_erp_notify(&port->erp_action, 0);
  731. out:
  732. zfcp_port_put(port);
  733. }
  734. static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *act)
  735. {
  736. struct zfcp_adapter *adapter = act->adapter;
  737. struct zfcp_port *port = act->port;
  738. int p_status = atomic_read(&port->status);
  739. switch (act->step) {
  740. case ZFCP_ERP_STEP_UNINITIALIZED:
  741. case ZFCP_ERP_STEP_PHYS_PORT_CLOSING:
  742. case ZFCP_ERP_STEP_PORT_CLOSING:
  743. if (fc_host_port_type(adapter->scsi_host) == FC_PORTTYPE_PTP)
  744. return zfcp_erp_open_ptp_port(act);
  745. if (!port->d_id) {
  746. zfcp_port_get(port);
  747. if (!queue_work(adapter->work_queue,
  748. &port->gid_pn_work))
  749. zfcp_port_put(port);
  750. return ZFCP_ERP_CONTINUES;
  751. }
  752. /* fall through */
  753. case ZFCP_ERP_STEP_NAMESERVER_LOOKUP:
  754. if (!port->d_id)
  755. return ZFCP_ERP_FAILED;
  756. return zfcp_erp_port_strategy_open_port(act);
  757. case ZFCP_ERP_STEP_PORT_OPENING:
  758. /* D_ID might have changed during open */
  759. if (p_status & ZFCP_STATUS_COMMON_OPEN) {
  760. if (port->d_id)
  761. return ZFCP_ERP_SUCCEEDED;
  762. else {
  763. act->step = ZFCP_ERP_STEP_PORT_CLOSING;
  764. return ZFCP_ERP_CONTINUES;
  765. }
  766. }
  767. if (port->d_id && !(p_status & ZFCP_STATUS_COMMON_NOESC)) {
  768. port->d_id = 0;
  769. _zfcp_erp_port_reopen(port, 0, "erpsoc1", NULL);
  770. return ZFCP_ERP_EXIT;
  771. }
  772. /* fall through otherwise */
  773. }
  774. return ZFCP_ERP_FAILED;
  775. }
  776. static int zfcp_erp_port_strategy(struct zfcp_erp_action *erp_action)
  777. {
  778. struct zfcp_port *port = erp_action->port;
  779. if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_NOESC)
  780. goto close_init_done;
  781. switch (erp_action->step) {
  782. case ZFCP_ERP_STEP_UNINITIALIZED:
  783. zfcp_erp_port_strategy_clearstati(port);
  784. if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_OPEN)
  785. return zfcp_erp_port_strategy_close(erp_action);
  786. break;
  787. case ZFCP_ERP_STEP_PORT_CLOSING:
  788. if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_OPEN)
  789. return ZFCP_ERP_FAILED;
  790. break;
  791. }
  792. close_init_done:
  793. if (erp_action->status & ZFCP_STATUS_ERP_CLOSE_ONLY)
  794. return ZFCP_ERP_EXIT;
  795. return zfcp_erp_port_strategy_open_common(erp_action);
  796. }
  797. static void zfcp_erp_unit_strategy_clearstati(struct zfcp_unit *unit)
  798. {
  799. atomic_clear_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED |
  800. ZFCP_STATUS_UNIT_SHARED |
  801. ZFCP_STATUS_UNIT_READONLY,
  802. &unit->status);
  803. }
  804. static int zfcp_erp_unit_strategy_close(struct zfcp_erp_action *erp_action)
  805. {
  806. int retval = zfcp_fsf_close_unit(erp_action);
  807. if (retval == -ENOMEM)
  808. return ZFCP_ERP_NOMEM;
  809. erp_action->step = ZFCP_ERP_STEP_UNIT_CLOSING;
  810. if (retval)
  811. return ZFCP_ERP_FAILED;
  812. return ZFCP_ERP_CONTINUES;
  813. }
  814. static int zfcp_erp_unit_strategy_open(struct zfcp_erp_action *erp_action)
  815. {
  816. int retval = zfcp_fsf_open_unit(erp_action);
  817. if (retval == -ENOMEM)
  818. return ZFCP_ERP_NOMEM;
  819. erp_action->step = ZFCP_ERP_STEP_UNIT_OPENING;
  820. if (retval)
  821. return ZFCP_ERP_FAILED;
  822. return ZFCP_ERP_CONTINUES;
  823. }
  824. static int zfcp_erp_unit_strategy(struct zfcp_erp_action *erp_action)
  825. {
  826. struct zfcp_unit *unit = erp_action->unit;
  827. switch (erp_action->step) {
  828. case ZFCP_ERP_STEP_UNINITIALIZED:
  829. zfcp_erp_unit_strategy_clearstati(unit);
  830. if (atomic_read(&unit->status) & ZFCP_STATUS_COMMON_OPEN)
  831. return zfcp_erp_unit_strategy_close(erp_action);
  832. /* already closed, fall through */
  833. case ZFCP_ERP_STEP_UNIT_CLOSING:
  834. if (atomic_read(&unit->status) & ZFCP_STATUS_COMMON_OPEN)
  835. return ZFCP_ERP_FAILED;
  836. if (erp_action->status & ZFCP_STATUS_ERP_CLOSE_ONLY)
  837. return ZFCP_ERP_EXIT;
  838. return zfcp_erp_unit_strategy_open(erp_action);
  839. case ZFCP_ERP_STEP_UNIT_OPENING:
  840. if (atomic_read(&unit->status) & ZFCP_STATUS_COMMON_OPEN)
  841. return ZFCP_ERP_SUCCEEDED;
  842. }
  843. return ZFCP_ERP_FAILED;
  844. }
  845. static int zfcp_erp_strategy_check_unit(struct zfcp_unit *unit, int result)
  846. {
  847. switch (result) {
  848. case ZFCP_ERP_SUCCEEDED :
  849. atomic_set(&unit->erp_counter, 0);
  850. zfcp_erp_unit_unblock(unit);
  851. break;
  852. case ZFCP_ERP_FAILED :
  853. atomic_inc(&unit->erp_counter);
  854. if (atomic_read(&unit->erp_counter) > ZFCP_MAX_ERPS) {
  855. dev_err(&unit->port->adapter->ccw_device->dev,
  856. "ERP failed for unit 0x%016Lx on "
  857. "port 0x%016Lx\n",
  858. (unsigned long long)unit->fcp_lun,
  859. (unsigned long long)unit->port->wwpn);
  860. zfcp_erp_unit_failed(unit, "erusck1", NULL);
  861. }
  862. break;
  863. }
  864. if (atomic_read(&unit->status) & ZFCP_STATUS_COMMON_ERP_FAILED) {
  865. zfcp_erp_unit_block(unit, 0);
  866. result = ZFCP_ERP_EXIT;
  867. }
  868. return result;
  869. }
  870. static int zfcp_erp_strategy_check_port(struct zfcp_port *port, int result)
  871. {
  872. switch (result) {
  873. case ZFCP_ERP_SUCCEEDED :
  874. atomic_set(&port->erp_counter, 0);
  875. zfcp_erp_port_unblock(port);
  876. break;
  877. case ZFCP_ERP_FAILED :
  878. if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_NOESC) {
  879. zfcp_erp_port_block(port, 0);
  880. result = ZFCP_ERP_EXIT;
  881. }
  882. atomic_inc(&port->erp_counter);
  883. if (atomic_read(&port->erp_counter) > ZFCP_MAX_ERPS) {
  884. dev_err(&port->adapter->ccw_device->dev,
  885. "ERP failed for remote port 0x%016Lx\n",
  886. (unsigned long long)port->wwpn);
  887. zfcp_erp_port_failed(port, "erpsck1", NULL);
  888. }
  889. break;
  890. }
  891. if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_FAILED) {
  892. zfcp_erp_port_block(port, 0);
  893. result = ZFCP_ERP_EXIT;
  894. }
  895. return result;
  896. }
  897. static int zfcp_erp_strategy_check_adapter(struct zfcp_adapter *adapter,
  898. int result)
  899. {
  900. switch (result) {
  901. case ZFCP_ERP_SUCCEEDED :
  902. atomic_set(&adapter->erp_counter, 0);
  903. zfcp_erp_adapter_unblock(adapter);
  904. break;
  905. case ZFCP_ERP_FAILED :
  906. atomic_inc(&adapter->erp_counter);
  907. if (atomic_read(&adapter->erp_counter) > ZFCP_MAX_ERPS) {
  908. dev_err(&adapter->ccw_device->dev,
  909. "ERP cannot recover an error "
  910. "on the FCP device\n");
  911. zfcp_erp_adapter_failed(adapter, "erasck1", NULL);
  912. }
  913. break;
  914. }
  915. if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_ERP_FAILED) {
  916. zfcp_erp_adapter_block(adapter, 0);
  917. result = ZFCP_ERP_EXIT;
  918. }
  919. return result;
  920. }
  921. static int zfcp_erp_strategy_check_target(struct zfcp_erp_action *erp_action,
  922. int result)
  923. {
  924. struct zfcp_adapter *adapter = erp_action->adapter;
  925. struct zfcp_port *port = erp_action->port;
  926. struct zfcp_unit *unit = erp_action->unit;
  927. switch (erp_action->action) {
  928. case ZFCP_ERP_ACTION_REOPEN_UNIT:
  929. result = zfcp_erp_strategy_check_unit(unit, result);
  930. break;
  931. case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
  932. case ZFCP_ERP_ACTION_REOPEN_PORT:
  933. result = zfcp_erp_strategy_check_port(port, result);
  934. break;
  935. case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
  936. result = zfcp_erp_strategy_check_adapter(adapter, result);
  937. break;
  938. }
  939. return result;
  940. }
  941. static int zfcp_erp_strat_change_det(atomic_t *target_status, u32 erp_status)
  942. {
  943. int status = atomic_read(target_status);
  944. if ((status & ZFCP_STATUS_COMMON_RUNNING) &&
  945. (erp_status & ZFCP_STATUS_ERP_CLOSE_ONLY))
  946. return 1; /* take it online */
  947. if (!(status & ZFCP_STATUS_COMMON_RUNNING) &&
  948. !(erp_status & ZFCP_STATUS_ERP_CLOSE_ONLY))
  949. return 1; /* take it offline */
  950. return 0;
  951. }
  952. static int zfcp_erp_strategy_statechange(struct zfcp_erp_action *act, int ret)
  953. {
  954. int action = act->action;
  955. struct zfcp_adapter *adapter = act->adapter;
  956. struct zfcp_port *port = act->port;
  957. struct zfcp_unit *unit = act->unit;
  958. u32 erp_status = act->status;
  959. switch (action) {
  960. case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
  961. if (zfcp_erp_strat_change_det(&adapter->status, erp_status)) {
  962. _zfcp_erp_adapter_reopen(adapter,
  963. ZFCP_STATUS_COMMON_ERP_FAILED,
  964. "ersscg1", NULL);
  965. return ZFCP_ERP_EXIT;
  966. }
  967. break;
  968. case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
  969. case ZFCP_ERP_ACTION_REOPEN_PORT:
  970. if (zfcp_erp_strat_change_det(&port->status, erp_status)) {
  971. _zfcp_erp_port_reopen(port,
  972. ZFCP_STATUS_COMMON_ERP_FAILED,
  973. "ersscg2", NULL);
  974. return ZFCP_ERP_EXIT;
  975. }
  976. break;
  977. case ZFCP_ERP_ACTION_REOPEN_UNIT:
  978. if (zfcp_erp_strat_change_det(&unit->status, erp_status)) {
  979. _zfcp_erp_unit_reopen(unit,
  980. ZFCP_STATUS_COMMON_ERP_FAILED,
  981. "ersscg3", NULL);
  982. return ZFCP_ERP_EXIT;
  983. }
  984. break;
  985. }
  986. return ret;
  987. }
  988. static void zfcp_erp_action_dequeue(struct zfcp_erp_action *erp_action)
  989. {
  990. struct zfcp_adapter *adapter = erp_action->adapter;
  991. adapter->erp_total_count--;
  992. if (erp_action->status & ZFCP_STATUS_ERP_LOWMEM) {
  993. adapter->erp_low_mem_count--;
  994. erp_action->status &= ~ZFCP_STATUS_ERP_LOWMEM;
  995. }
  996. list_del(&erp_action->list);
  997. zfcp_rec_dbf_event_action("eractd1", erp_action);
  998. switch (erp_action->action) {
  999. case ZFCP_ERP_ACTION_REOPEN_UNIT:
  1000. atomic_clear_mask(ZFCP_STATUS_COMMON_ERP_INUSE,
  1001. &erp_action->unit->status);
  1002. break;
  1003. case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
  1004. case ZFCP_ERP_ACTION_REOPEN_PORT:
  1005. atomic_clear_mask(ZFCP_STATUS_COMMON_ERP_INUSE,
  1006. &erp_action->port->status);
  1007. break;
  1008. case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
  1009. atomic_clear_mask(ZFCP_STATUS_COMMON_ERP_INUSE,
  1010. &erp_action->adapter->status);
  1011. break;
  1012. }
  1013. }
  1014. static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result)
  1015. {
  1016. struct zfcp_adapter *adapter = act->adapter;
  1017. struct zfcp_port *port = act->port;
  1018. struct zfcp_unit *unit = act->unit;
  1019. switch (act->action) {
  1020. case ZFCP_ERP_ACTION_REOPEN_UNIT:
  1021. if ((result == ZFCP_ERP_SUCCEEDED) && !unit->device) {
  1022. zfcp_unit_get(unit);
  1023. if (scsi_queue_work(unit->port->adapter->scsi_host,
  1024. &unit->scsi_work) <= 0)
  1025. zfcp_unit_put(unit);
  1026. }
  1027. zfcp_unit_put(unit);
  1028. break;
  1029. case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
  1030. case ZFCP_ERP_ACTION_REOPEN_PORT:
  1031. if (result == ZFCP_ERP_SUCCEEDED)
  1032. zfcp_scsi_schedule_rport_register(port);
  1033. zfcp_port_put(port);
  1034. break;
  1035. case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
  1036. if (result == ZFCP_ERP_SUCCEEDED) {
  1037. register_service_level(&adapter->service_level);
  1038. schedule_work(&adapter->scan_work);
  1039. } else
  1040. unregister_service_level(&adapter->service_level);
  1041. zfcp_adapter_put(adapter);
  1042. break;
  1043. }
  1044. }
  1045. static int zfcp_erp_strategy_do_action(struct zfcp_erp_action *erp_action)
  1046. {
  1047. switch (erp_action->action) {
  1048. case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
  1049. return zfcp_erp_adapter_strategy(erp_action);
  1050. case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
  1051. return zfcp_erp_port_forced_strategy(erp_action);
  1052. case ZFCP_ERP_ACTION_REOPEN_PORT:
  1053. return zfcp_erp_port_strategy(erp_action);
  1054. case ZFCP_ERP_ACTION_REOPEN_UNIT:
  1055. return zfcp_erp_unit_strategy(erp_action);
  1056. }
  1057. return ZFCP_ERP_FAILED;
  1058. }
  1059. static int zfcp_erp_strategy(struct zfcp_erp_action *erp_action)
  1060. {
  1061. int retval;
  1062. struct zfcp_adapter *adapter = erp_action->adapter;
  1063. unsigned long flags;
  1064. read_lock_irqsave(&zfcp_data.config_lock, flags);
  1065. write_lock(&adapter->erp_lock);
  1066. zfcp_erp_strategy_check_fsfreq(erp_action);
  1067. if (erp_action->status & ZFCP_STATUS_ERP_DISMISSED) {
  1068. zfcp_erp_action_dequeue(erp_action);
  1069. retval = ZFCP_ERP_DISMISSED;
  1070. goto unlock;
  1071. }
  1072. zfcp_erp_action_to_running(erp_action);
  1073. /* no lock to allow for blocking operations */
  1074. write_unlock(&adapter->erp_lock);
  1075. read_unlock_irqrestore(&zfcp_data.config_lock, flags);
  1076. retval = zfcp_erp_strategy_do_action(erp_action);
  1077. read_lock_irqsave(&zfcp_data.config_lock, flags);
  1078. write_lock(&adapter->erp_lock);
  1079. if (erp_action->status & ZFCP_STATUS_ERP_DISMISSED)
  1080. retval = ZFCP_ERP_CONTINUES;
  1081. switch (retval) {
  1082. case ZFCP_ERP_NOMEM:
  1083. if (!(erp_action->status & ZFCP_STATUS_ERP_LOWMEM)) {
  1084. ++adapter->erp_low_mem_count;
  1085. erp_action->status |= ZFCP_STATUS_ERP_LOWMEM;
  1086. }
  1087. if (adapter->erp_total_count == adapter->erp_low_mem_count)
  1088. _zfcp_erp_adapter_reopen(adapter, 0, "erstgy1", NULL);
  1089. else {
  1090. zfcp_erp_strategy_memwait(erp_action);
  1091. retval = ZFCP_ERP_CONTINUES;
  1092. }
  1093. goto unlock;
  1094. case ZFCP_ERP_CONTINUES:
  1095. if (erp_action->status & ZFCP_STATUS_ERP_LOWMEM) {
  1096. --adapter->erp_low_mem_count;
  1097. erp_action->status &= ~ZFCP_STATUS_ERP_LOWMEM;
  1098. }
  1099. goto unlock;
  1100. }
  1101. retval = zfcp_erp_strategy_check_target(erp_action, retval);
  1102. zfcp_erp_action_dequeue(erp_action);
  1103. retval = zfcp_erp_strategy_statechange(erp_action, retval);
  1104. if (retval == ZFCP_ERP_EXIT)
  1105. goto unlock;
  1106. if (retval == ZFCP_ERP_SUCCEEDED)
  1107. zfcp_erp_strategy_followup_success(erp_action);
  1108. if (retval == ZFCP_ERP_FAILED)
  1109. zfcp_erp_strategy_followup_failed(erp_action);
  1110. unlock:
  1111. write_unlock(&adapter->erp_lock);
  1112. read_unlock_irqrestore(&zfcp_data.config_lock, flags);
  1113. if (retval != ZFCP_ERP_CONTINUES)
  1114. zfcp_erp_action_cleanup(erp_action, retval);
  1115. return retval;
  1116. }
  1117. static int zfcp_erp_thread(void *data)
  1118. {
  1119. struct zfcp_adapter *adapter = (struct zfcp_adapter *) data;
  1120. struct list_head *next;
  1121. struct zfcp_erp_action *act;
  1122. unsigned long flags;
  1123. int ignore;
  1124. daemonize("zfcperp%s", dev_name(&adapter->ccw_device->dev));
  1125. /* Block all signals */
  1126. siginitsetinv(&current->blocked, 0);
  1127. atomic_set_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status);
  1128. wake_up(&adapter->erp_thread_wqh);
  1129. while (!(atomic_read(&adapter->status) &
  1130. ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL)) {
  1131. zfcp_rec_dbf_event_thread_lock("erthrd1", adapter);
  1132. ignore = down_interruptible(&adapter->erp_ready_sem);
  1133. zfcp_rec_dbf_event_thread_lock("erthrd2", adapter);
  1134. write_lock_irqsave(&adapter->erp_lock, flags);
  1135. next = adapter->erp_ready_head.next;
  1136. write_unlock_irqrestore(&adapter->erp_lock, flags);
  1137. if (next != &adapter->erp_ready_head) {
  1138. act = list_entry(next, struct zfcp_erp_action, list);
  1139. /* there is more to come after dismission, no notify */
  1140. if (zfcp_erp_strategy(act) != ZFCP_ERP_DISMISSED)
  1141. zfcp_erp_wakeup(adapter);
  1142. }
  1143. }
  1144. atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status);
  1145. wake_up(&adapter->erp_thread_wqh);
  1146. return 0;
  1147. }
  1148. /**
  1149. * zfcp_erp_thread_setup - Start ERP thread for adapter
  1150. * @adapter: Adapter to start the ERP thread for
  1151. *
  1152. * Returns 0 on success or error code from kernel_thread()
  1153. */
  1154. int zfcp_erp_thread_setup(struct zfcp_adapter *adapter)
  1155. {
  1156. int retval;
  1157. atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status);
  1158. retval = kernel_thread(zfcp_erp_thread, adapter, SIGCHLD);
  1159. if (retval < 0) {
  1160. dev_err(&adapter->ccw_device->dev,
  1161. "Creating an ERP thread for the FCP device failed.\n");
  1162. return retval;
  1163. }
  1164. wait_event(adapter->erp_thread_wqh,
  1165. atomic_read(&adapter->status) &
  1166. ZFCP_STATUS_ADAPTER_ERP_THREAD_UP);
  1167. return 0;
  1168. }
  1169. /**
  1170. * zfcp_erp_thread_kill - Stop ERP thread.
  1171. * @adapter: Adapter where the ERP thread should be stopped.
  1172. *
  1173. * The caller of this routine ensures that the specified adapter has
  1174. * been shut down and that this operation has been completed. Thus,
  1175. * there are no pending erp_actions which would need to be handled
  1176. * here.
  1177. */
  1178. void zfcp_erp_thread_kill(struct zfcp_adapter *adapter)
  1179. {
  1180. atomic_set_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL, &adapter->status);
  1181. up(&adapter->erp_ready_sem);
  1182. zfcp_rec_dbf_event_thread_lock("erthrk1", adapter);
  1183. wait_event(adapter->erp_thread_wqh,
  1184. !(atomic_read(&adapter->status) &
  1185. ZFCP_STATUS_ADAPTER_ERP_THREAD_UP));
  1186. atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL,
  1187. &adapter->status);
  1188. }
  1189. /**
  1190. * zfcp_erp_adapter_failed - Set adapter status to failed.
  1191. * @adapter: Failed adapter.
  1192. * @id: Event id for debug trace.
  1193. * @ref: Reference for debug trace.
  1194. */
  1195. void zfcp_erp_adapter_failed(struct zfcp_adapter *adapter, char *id, void *ref)
  1196. {
  1197. zfcp_erp_modify_adapter_status(adapter, id, ref,
  1198. ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET);
  1199. }
  1200. /**
  1201. * zfcp_erp_port_failed - Set port status to failed.
  1202. * @port: Failed port.
  1203. * @id: Event id for debug trace.
  1204. * @ref: Reference for debug trace.
  1205. */
  1206. void zfcp_erp_port_failed(struct zfcp_port *port, char *id, void *ref)
  1207. {
  1208. zfcp_erp_modify_port_status(port, id, ref,
  1209. ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET);
  1210. }
  1211. /**
  1212. * zfcp_erp_unit_failed - Set unit status to failed.
  1213. * @unit: Failed unit.
  1214. * @id: Event id for debug trace.
  1215. * @ref: Reference for debug trace.
  1216. */
  1217. void zfcp_erp_unit_failed(struct zfcp_unit *unit, char *id, void *ref)
  1218. {
  1219. zfcp_erp_modify_unit_status(unit, id, ref,
  1220. ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET);
  1221. }
  1222. /**
  1223. * zfcp_erp_wait - wait for completion of error recovery on an adapter
  1224. * @adapter: adapter for which to wait for completion of its error recovery
  1225. */
  1226. void zfcp_erp_wait(struct zfcp_adapter *adapter)
  1227. {
  1228. wait_event(adapter->erp_done_wqh,
  1229. !(atomic_read(&adapter->status) &
  1230. ZFCP_STATUS_ADAPTER_ERP_PENDING));
  1231. }
  1232. /**
  1233. * zfcp_erp_modify_adapter_status - change adapter status bits
  1234. * @adapter: adapter to change the status
  1235. * @id: id for the debug trace
  1236. * @ref: reference for the debug trace
  1237. * @mask: status bits to change
  1238. * @set_or_clear: ZFCP_SET or ZFCP_CLEAR
  1239. *
  1240. * Changes in common status bits are propagated to attached ports and units.
  1241. */
  1242. void zfcp_erp_modify_adapter_status(struct zfcp_adapter *adapter, char *id,
  1243. void *ref, u32 mask, int set_or_clear)
  1244. {
  1245. struct zfcp_port *port;
  1246. u32 common_mask = mask & ZFCP_COMMON_FLAGS;
  1247. if (set_or_clear == ZFCP_SET) {
  1248. if (status_change_set(mask, &adapter->status))
  1249. zfcp_rec_dbf_event_adapter(id, ref, adapter);
  1250. atomic_set_mask(mask, &adapter->status);
  1251. } else {
  1252. if (status_change_clear(mask, &adapter->status))
  1253. zfcp_rec_dbf_event_adapter(id, ref, adapter);
  1254. atomic_clear_mask(mask, &adapter->status);
  1255. if (mask & ZFCP_STATUS_COMMON_ERP_FAILED)
  1256. atomic_set(&adapter->erp_counter, 0);
  1257. }
  1258. if (common_mask)
  1259. list_for_each_entry(port, &adapter->port_list_head, list)
  1260. zfcp_erp_modify_port_status(port, id, ref, common_mask,
  1261. set_or_clear);
  1262. }
  1263. /**
  1264. * zfcp_erp_modify_port_status - change port status bits
  1265. * @port: port to change the status bits
  1266. * @id: id for the debug trace
  1267. * @ref: reference for the debug trace
  1268. * @mask: status bits to change
  1269. * @set_or_clear: ZFCP_SET or ZFCP_CLEAR
  1270. *
  1271. * Changes in common status bits are propagated to attached units.
  1272. */
  1273. void zfcp_erp_modify_port_status(struct zfcp_port *port, char *id, void *ref,
  1274. u32 mask, int set_or_clear)
  1275. {
  1276. struct zfcp_unit *unit;
  1277. u32 common_mask = mask & ZFCP_COMMON_FLAGS;
  1278. if (set_or_clear == ZFCP_SET) {
  1279. if (status_change_set(mask, &port->status))
  1280. zfcp_rec_dbf_event_port(id, ref, port);
  1281. atomic_set_mask(mask, &port->status);
  1282. } else {
  1283. if (status_change_clear(mask, &port->status))
  1284. zfcp_rec_dbf_event_port(id, ref, port);
  1285. atomic_clear_mask(mask, &port->status);
  1286. if (mask & ZFCP_STATUS_COMMON_ERP_FAILED)
  1287. atomic_set(&port->erp_counter, 0);
  1288. }
  1289. if (common_mask)
  1290. list_for_each_entry(unit, &port->unit_list_head, list)
  1291. zfcp_erp_modify_unit_status(unit, id, ref, common_mask,
  1292. set_or_clear);
  1293. }
  1294. /**
  1295. * zfcp_erp_modify_unit_status - change unit status bits
  1296. * @unit: unit to change the status bits
  1297. * @id: id for the debug trace
  1298. * @ref: reference for the debug trace
  1299. * @mask: status bits to change
  1300. * @set_or_clear: ZFCP_SET or ZFCP_CLEAR
  1301. */
  1302. void zfcp_erp_modify_unit_status(struct zfcp_unit *unit, char *id, void *ref,
  1303. u32 mask, int set_or_clear)
  1304. {
  1305. if (set_or_clear == ZFCP_SET) {
  1306. if (status_change_set(mask, &unit->status))
  1307. zfcp_rec_dbf_event_unit(id, ref, unit);
  1308. atomic_set_mask(mask, &unit->status);
  1309. } else {
  1310. if (status_change_clear(mask, &unit->status))
  1311. zfcp_rec_dbf_event_unit(id, ref, unit);
  1312. atomic_clear_mask(mask, &unit->status);
  1313. if (mask & ZFCP_STATUS_COMMON_ERP_FAILED) {
  1314. atomic_set(&unit->erp_counter, 0);
  1315. }
  1316. }
  1317. }
  1318. /**
  1319. * zfcp_erp_port_boxed - Mark port as "boxed" and start ERP
  1320. * @port: The "boxed" port.
  1321. * @id: The debug trace id.
  1322. * @id: Reference for the debug trace.
  1323. */
  1324. void zfcp_erp_port_boxed(struct zfcp_port *port, char *id, void *ref)
  1325. {
  1326. unsigned long flags;
  1327. read_lock_irqsave(&zfcp_data.config_lock, flags);
  1328. zfcp_erp_modify_port_status(port, id, ref,
  1329. ZFCP_STATUS_COMMON_ACCESS_BOXED, ZFCP_SET);
  1330. read_unlock_irqrestore(&zfcp_data.config_lock, flags);
  1331. zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, id, ref);
  1332. }
  1333. /**
  1334. * zfcp_erp_unit_boxed - Mark unit as "boxed" and start ERP
  1335. * @port: The "boxed" unit.
  1336. * @id: The debug trace id.
  1337. * @id: Reference for the debug trace.
  1338. */
  1339. void zfcp_erp_unit_boxed(struct zfcp_unit *unit, char *id, void *ref)
  1340. {
  1341. zfcp_erp_modify_unit_status(unit, id, ref,
  1342. ZFCP_STATUS_COMMON_ACCESS_BOXED, ZFCP_SET);
  1343. zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED, id, ref);
  1344. }
  1345. /**
  1346. * zfcp_erp_port_access_denied - Adapter denied access to port.
  1347. * @port: port where access has been denied
  1348. * @id: id for debug trace
  1349. * @ref: reference for debug trace
  1350. *
  1351. * Since the adapter has denied access, stop using the port and the
  1352. * attached units.
  1353. */
  1354. void zfcp_erp_port_access_denied(struct zfcp_port *port, char *id, void *ref)
  1355. {
  1356. unsigned long flags;
  1357. read_lock_irqsave(&zfcp_data.config_lock, flags);
  1358. zfcp_erp_modify_port_status(port, id, ref,
  1359. ZFCP_STATUS_COMMON_ERP_FAILED |
  1360. ZFCP_STATUS_COMMON_ACCESS_DENIED, ZFCP_SET);
  1361. read_unlock_irqrestore(&zfcp_data.config_lock, flags);
  1362. }
  1363. /**
  1364. * zfcp_erp_unit_access_denied - Adapter denied access to unit.
  1365. * @unit: unit where access has been denied
  1366. * @id: id for debug trace
  1367. * @ref: reference for debug trace
  1368. *
  1369. * Since the adapter has denied access, stop using the unit.
  1370. */
  1371. void zfcp_erp_unit_access_denied(struct zfcp_unit *unit, char *id, void *ref)
  1372. {
  1373. zfcp_erp_modify_unit_status(unit, id, ref,
  1374. ZFCP_STATUS_COMMON_ERP_FAILED |
  1375. ZFCP_STATUS_COMMON_ACCESS_DENIED, ZFCP_SET);
  1376. }
  1377. static void zfcp_erp_unit_access_changed(struct zfcp_unit *unit, char *id,
  1378. void *ref)
  1379. {
  1380. int status = atomic_read(&unit->status);
  1381. if (!(status & (ZFCP_STATUS_COMMON_ACCESS_DENIED |
  1382. ZFCP_STATUS_COMMON_ACCESS_BOXED)))
  1383. return;
  1384. zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED, id, ref);
  1385. }
  1386. static void zfcp_erp_port_access_changed(struct zfcp_port *port, char *id,
  1387. void *ref)
  1388. {
  1389. struct zfcp_unit *unit;
  1390. int status = atomic_read(&port->status);
  1391. if (!(status & (ZFCP_STATUS_COMMON_ACCESS_DENIED |
  1392. ZFCP_STATUS_COMMON_ACCESS_BOXED))) {
  1393. list_for_each_entry(unit, &port->unit_list_head, list)
  1394. zfcp_erp_unit_access_changed(unit, id, ref);
  1395. return;
  1396. }
  1397. zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, id, ref);
  1398. }
  1399. /**
  1400. * zfcp_erp_adapter_access_changed - Process change in adapter ACT
  1401. * @adapter: Adapter where the Access Control Table (ACT) changed
  1402. * @id: Id for debug trace
  1403. * @ref: Reference for debug trace
  1404. */
  1405. void zfcp_erp_adapter_access_changed(struct zfcp_adapter *adapter, char *id,
  1406. void *ref)
  1407. {
  1408. struct zfcp_port *port;
  1409. unsigned long flags;
  1410. if (adapter->connection_features & FSF_FEATURE_NPIV_MODE)
  1411. return;
  1412. read_lock_irqsave(&zfcp_data.config_lock, flags);
  1413. list_for_each_entry(port, &adapter->port_list_head, list)
  1414. zfcp_erp_port_access_changed(port, id, ref);
  1415. read_unlock_irqrestore(&zfcp_data.config_lock, flags);
  1416. }