zfcp_erp.c 46 KB

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