zfcp_erp.c 49 KB

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