iscsi_target_erl0.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958
  1. /******************************************************************************
  2. * This file contains error recovery level zero functions used by
  3. * the iSCSI Target driver.
  4. *
  5. * (c) Copyright 2007-2013 Datera, Inc.
  6. *
  7. * Author: Nicholas A. Bellinger <nab@linux-iscsi.org>
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; either version 2 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. ******************************************************************************/
  19. #include <linux/sched/signal.h>
  20. #include <scsi/iscsi_proto.h>
  21. #include <target/target_core_base.h>
  22. #include <target/target_core_fabric.h>
  23. #include <target/iscsi/iscsi_target_core.h>
  24. #include "iscsi_target_seq_pdu_list.h"
  25. #include "iscsi_target_erl0.h"
  26. #include "iscsi_target_erl1.h"
  27. #include "iscsi_target_erl2.h"
  28. #include "iscsi_target_util.h"
  29. #include "iscsi_target.h"
  30. /*
  31. * Used to set values in struct iscsi_cmd that iscsit_dataout_check_sequence()
  32. * checks against to determine a PDU's Offset+Length is within the current
  33. * DataOUT Sequence. Used for DataSequenceInOrder=Yes only.
  34. */
  35. void iscsit_set_dataout_sequence_values(
  36. struct iscsi_cmd *cmd)
  37. {
  38. struct iscsi_conn *conn = cmd->conn;
  39. /*
  40. * Still set seq_start_offset and seq_end_offset for Unsolicited
  41. * DataOUT, even if DataSequenceInOrder=No.
  42. */
  43. if (cmd->unsolicited_data) {
  44. cmd->seq_start_offset = cmd->write_data_done;
  45. cmd->seq_end_offset = min(cmd->se_cmd.data_length,
  46. conn->sess->sess_ops->FirstBurstLength);
  47. return;
  48. }
  49. if (!conn->sess->sess_ops->DataSequenceInOrder)
  50. return;
  51. if (!cmd->seq_start_offset && !cmd->seq_end_offset) {
  52. cmd->seq_start_offset = cmd->write_data_done;
  53. cmd->seq_end_offset = (cmd->se_cmd.data_length >
  54. conn->sess->sess_ops->MaxBurstLength) ?
  55. (cmd->write_data_done +
  56. conn->sess->sess_ops->MaxBurstLength) : cmd->se_cmd.data_length;
  57. } else {
  58. cmd->seq_start_offset = cmd->seq_end_offset;
  59. cmd->seq_end_offset = ((cmd->seq_end_offset +
  60. conn->sess->sess_ops->MaxBurstLength) >=
  61. cmd->se_cmd.data_length) ? cmd->se_cmd.data_length :
  62. (cmd->seq_end_offset +
  63. conn->sess->sess_ops->MaxBurstLength);
  64. }
  65. }
  66. static int iscsit_dataout_within_command_recovery_check(
  67. struct iscsi_cmd *cmd,
  68. unsigned char *buf)
  69. {
  70. struct iscsi_conn *conn = cmd->conn;
  71. struct iscsi_data *hdr = (struct iscsi_data *) buf;
  72. u32 payload_length = ntoh24(hdr->dlength);
  73. /*
  74. * We do the within-command recovery checks here as it is
  75. * the first function called in iscsi_check_pre_dataout().
  76. * Basically, if we are in within-command recovery and
  77. * the PDU does not contain the offset the sequence needs,
  78. * dump the payload.
  79. *
  80. * This only applies to DataPDUInOrder=Yes, for
  81. * DataPDUInOrder=No we only re-request the failed PDU
  82. * and check that all PDUs in a sequence are received
  83. * upon end of sequence.
  84. */
  85. if (conn->sess->sess_ops->DataSequenceInOrder) {
  86. if ((cmd->cmd_flags & ICF_WITHIN_COMMAND_RECOVERY) &&
  87. cmd->write_data_done != be32_to_cpu(hdr->offset))
  88. goto dump;
  89. cmd->cmd_flags &= ~ICF_WITHIN_COMMAND_RECOVERY;
  90. } else {
  91. struct iscsi_seq *seq;
  92. seq = iscsit_get_seq_holder(cmd, be32_to_cpu(hdr->offset),
  93. payload_length);
  94. if (!seq)
  95. return DATAOUT_CANNOT_RECOVER;
  96. /*
  97. * Set the struct iscsi_seq pointer to reuse later.
  98. */
  99. cmd->seq_ptr = seq;
  100. if (conn->sess->sess_ops->DataPDUInOrder) {
  101. if (seq->status ==
  102. DATAOUT_SEQUENCE_WITHIN_COMMAND_RECOVERY &&
  103. (seq->offset != be32_to_cpu(hdr->offset) ||
  104. seq->data_sn != be32_to_cpu(hdr->datasn)))
  105. goto dump;
  106. } else {
  107. if (seq->status ==
  108. DATAOUT_SEQUENCE_WITHIN_COMMAND_RECOVERY &&
  109. seq->data_sn != be32_to_cpu(hdr->datasn))
  110. goto dump;
  111. }
  112. if (seq->status == DATAOUT_SEQUENCE_COMPLETE)
  113. goto dump;
  114. if (seq->status != DATAOUT_SEQUENCE_COMPLETE)
  115. seq->status = 0;
  116. }
  117. return DATAOUT_NORMAL;
  118. dump:
  119. pr_err("Dumping DataOUT PDU Offset: %u Length: %d DataSN:"
  120. " 0x%08x\n", hdr->offset, payload_length, hdr->datasn);
  121. return iscsit_dump_data_payload(conn, payload_length, 1);
  122. }
  123. static int iscsit_dataout_check_unsolicited_sequence(
  124. struct iscsi_cmd *cmd,
  125. unsigned char *buf)
  126. {
  127. u32 first_burst_len;
  128. struct iscsi_conn *conn = cmd->conn;
  129. struct iscsi_data *hdr = (struct iscsi_data *) buf;
  130. u32 payload_length = ntoh24(hdr->dlength);
  131. if ((be32_to_cpu(hdr->offset) < cmd->seq_start_offset) ||
  132. ((be32_to_cpu(hdr->offset) + payload_length) > cmd->seq_end_offset)) {
  133. pr_err("Command ITT: 0x%08x with Offset: %u,"
  134. " Length: %u outside of Unsolicited Sequence %u:%u while"
  135. " DataSequenceInOrder=Yes.\n", cmd->init_task_tag,
  136. be32_to_cpu(hdr->offset), payload_length, cmd->seq_start_offset,
  137. cmd->seq_end_offset);
  138. return DATAOUT_CANNOT_RECOVER;
  139. }
  140. first_burst_len = (cmd->first_burst_len + payload_length);
  141. if (first_burst_len > conn->sess->sess_ops->FirstBurstLength) {
  142. pr_err("Total %u bytes exceeds FirstBurstLength: %u"
  143. " for this Unsolicited DataOut Burst.\n",
  144. first_burst_len, conn->sess->sess_ops->FirstBurstLength);
  145. transport_send_check_condition_and_sense(&cmd->se_cmd,
  146. TCM_INCORRECT_AMOUNT_OF_DATA, 0);
  147. return DATAOUT_CANNOT_RECOVER;
  148. }
  149. /*
  150. * Perform various MaxBurstLength and ISCSI_FLAG_CMD_FINAL sanity
  151. * checks for the current Unsolicited DataOUT Sequence.
  152. */
  153. if (hdr->flags & ISCSI_FLAG_CMD_FINAL) {
  154. /*
  155. * Ignore ISCSI_FLAG_CMD_FINAL checks while DataPDUInOrder=No, end of
  156. * sequence checks are handled in
  157. * iscsit_dataout_datapduinorder_no_fbit().
  158. */
  159. if (!conn->sess->sess_ops->DataPDUInOrder)
  160. goto out;
  161. if ((first_burst_len != cmd->se_cmd.data_length) &&
  162. (first_burst_len != conn->sess->sess_ops->FirstBurstLength)) {
  163. pr_err("Unsolicited non-immediate data"
  164. " received %u does not equal FirstBurstLength: %u, and"
  165. " does not equal ExpXferLen %u.\n", first_burst_len,
  166. conn->sess->sess_ops->FirstBurstLength,
  167. cmd->se_cmd.data_length);
  168. transport_send_check_condition_and_sense(&cmd->se_cmd,
  169. TCM_INCORRECT_AMOUNT_OF_DATA, 0);
  170. return DATAOUT_CANNOT_RECOVER;
  171. }
  172. } else {
  173. if (first_burst_len == conn->sess->sess_ops->FirstBurstLength) {
  174. pr_err("Command ITT: 0x%08x reached"
  175. " FirstBurstLength: %u, but ISCSI_FLAG_CMD_FINAL is not set. protocol"
  176. " error.\n", cmd->init_task_tag,
  177. conn->sess->sess_ops->FirstBurstLength);
  178. return DATAOUT_CANNOT_RECOVER;
  179. }
  180. if (first_burst_len == cmd->se_cmd.data_length) {
  181. pr_err("Command ITT: 0x%08x reached"
  182. " ExpXferLen: %u, but ISCSI_FLAG_CMD_FINAL is not set. protocol"
  183. " error.\n", cmd->init_task_tag, cmd->se_cmd.data_length);
  184. return DATAOUT_CANNOT_RECOVER;
  185. }
  186. }
  187. out:
  188. return DATAOUT_NORMAL;
  189. }
  190. static int iscsit_dataout_check_sequence(
  191. struct iscsi_cmd *cmd,
  192. unsigned char *buf)
  193. {
  194. u32 next_burst_len;
  195. struct iscsi_conn *conn = cmd->conn;
  196. struct iscsi_seq *seq = NULL;
  197. struct iscsi_data *hdr = (struct iscsi_data *) buf;
  198. u32 payload_length = ntoh24(hdr->dlength);
  199. /*
  200. * For DataSequenceInOrder=Yes: Check that the offset and offset+length
  201. * is within range as defined by iscsi_set_dataout_sequence_values().
  202. *
  203. * For DataSequenceInOrder=No: Check that an struct iscsi_seq exists for
  204. * offset+length tuple.
  205. */
  206. if (conn->sess->sess_ops->DataSequenceInOrder) {
  207. /*
  208. * Due to possibility of recovery DataOUT sent by the initiator
  209. * fullfilling an Recovery R2T, it's best to just dump the
  210. * payload here, instead of erroring out.
  211. */
  212. if ((be32_to_cpu(hdr->offset) < cmd->seq_start_offset) ||
  213. ((be32_to_cpu(hdr->offset) + payload_length) > cmd->seq_end_offset)) {
  214. pr_err("Command ITT: 0x%08x with Offset: %u,"
  215. " Length: %u outside of Sequence %u:%u while"
  216. " DataSequenceInOrder=Yes.\n", cmd->init_task_tag,
  217. be32_to_cpu(hdr->offset), payload_length, cmd->seq_start_offset,
  218. cmd->seq_end_offset);
  219. if (iscsit_dump_data_payload(conn, payload_length, 1) < 0)
  220. return DATAOUT_CANNOT_RECOVER;
  221. return DATAOUT_WITHIN_COMMAND_RECOVERY;
  222. }
  223. next_burst_len = (cmd->next_burst_len + payload_length);
  224. } else {
  225. seq = iscsit_get_seq_holder(cmd, be32_to_cpu(hdr->offset),
  226. payload_length);
  227. if (!seq)
  228. return DATAOUT_CANNOT_RECOVER;
  229. /*
  230. * Set the struct iscsi_seq pointer to reuse later.
  231. */
  232. cmd->seq_ptr = seq;
  233. if (seq->status == DATAOUT_SEQUENCE_COMPLETE) {
  234. if (iscsit_dump_data_payload(conn, payload_length, 1) < 0)
  235. return DATAOUT_CANNOT_RECOVER;
  236. return DATAOUT_WITHIN_COMMAND_RECOVERY;
  237. }
  238. next_burst_len = (seq->next_burst_len + payload_length);
  239. }
  240. if (next_burst_len > conn->sess->sess_ops->MaxBurstLength) {
  241. pr_err("Command ITT: 0x%08x, NextBurstLength: %u and"
  242. " Length: %u exceeds MaxBurstLength: %u. protocol"
  243. " error.\n", cmd->init_task_tag,
  244. (next_burst_len - payload_length),
  245. payload_length, conn->sess->sess_ops->MaxBurstLength);
  246. return DATAOUT_CANNOT_RECOVER;
  247. }
  248. /*
  249. * Perform various MaxBurstLength and ISCSI_FLAG_CMD_FINAL sanity
  250. * checks for the current DataOUT Sequence.
  251. */
  252. if (hdr->flags & ISCSI_FLAG_CMD_FINAL) {
  253. /*
  254. * Ignore ISCSI_FLAG_CMD_FINAL checks while DataPDUInOrder=No, end of
  255. * sequence checks are handled in
  256. * iscsit_dataout_datapduinorder_no_fbit().
  257. */
  258. if (!conn->sess->sess_ops->DataPDUInOrder)
  259. goto out;
  260. if (conn->sess->sess_ops->DataSequenceInOrder) {
  261. if ((next_burst_len <
  262. conn->sess->sess_ops->MaxBurstLength) &&
  263. ((cmd->write_data_done + payload_length) <
  264. cmd->se_cmd.data_length)) {
  265. pr_err("Command ITT: 0x%08x set ISCSI_FLAG_CMD_FINAL"
  266. " before end of DataOUT sequence, protocol"
  267. " error.\n", cmd->init_task_tag);
  268. return DATAOUT_CANNOT_RECOVER;
  269. }
  270. } else {
  271. if (next_burst_len < seq->xfer_len) {
  272. pr_err("Command ITT: 0x%08x set ISCSI_FLAG_CMD_FINAL"
  273. " before end of DataOUT sequence, protocol"
  274. " error.\n", cmd->init_task_tag);
  275. return DATAOUT_CANNOT_RECOVER;
  276. }
  277. }
  278. } else {
  279. if (conn->sess->sess_ops->DataSequenceInOrder) {
  280. if (next_burst_len ==
  281. conn->sess->sess_ops->MaxBurstLength) {
  282. pr_err("Command ITT: 0x%08x reached"
  283. " MaxBurstLength: %u, but ISCSI_FLAG_CMD_FINAL is"
  284. " not set, protocol error.", cmd->init_task_tag,
  285. conn->sess->sess_ops->MaxBurstLength);
  286. return DATAOUT_CANNOT_RECOVER;
  287. }
  288. if ((cmd->write_data_done + payload_length) ==
  289. cmd->se_cmd.data_length) {
  290. pr_err("Command ITT: 0x%08x reached"
  291. " last DataOUT PDU in sequence but ISCSI_FLAG_"
  292. "CMD_FINAL is not set, protocol error.\n",
  293. cmd->init_task_tag);
  294. return DATAOUT_CANNOT_RECOVER;
  295. }
  296. } else {
  297. if (next_burst_len == seq->xfer_len) {
  298. pr_err("Command ITT: 0x%08x reached"
  299. " last DataOUT PDU in sequence but ISCSI_FLAG_"
  300. "CMD_FINAL is not set, protocol error.\n",
  301. cmd->init_task_tag);
  302. return DATAOUT_CANNOT_RECOVER;
  303. }
  304. }
  305. }
  306. out:
  307. return DATAOUT_NORMAL;
  308. }
  309. static int iscsit_dataout_check_datasn(
  310. struct iscsi_cmd *cmd,
  311. unsigned char *buf)
  312. {
  313. u32 data_sn = 0;
  314. struct iscsi_conn *conn = cmd->conn;
  315. struct iscsi_data *hdr = (struct iscsi_data *) buf;
  316. u32 payload_length = ntoh24(hdr->dlength);
  317. /*
  318. * Considering the target has no method of re-requesting DataOUT
  319. * by DataSN, if we receieve a greater DataSN than expected we
  320. * assume the functions for DataPDUInOrder=[Yes,No] below will
  321. * handle it.
  322. *
  323. * If the DataSN is less than expected, dump the payload.
  324. */
  325. if (conn->sess->sess_ops->DataSequenceInOrder)
  326. data_sn = cmd->data_sn;
  327. else {
  328. struct iscsi_seq *seq = cmd->seq_ptr;
  329. data_sn = seq->data_sn;
  330. }
  331. if (be32_to_cpu(hdr->datasn) > data_sn) {
  332. pr_err("Command ITT: 0x%08x, received DataSN: 0x%08x"
  333. " higher than expected 0x%08x.\n", cmd->init_task_tag,
  334. be32_to_cpu(hdr->datasn), data_sn);
  335. goto recover;
  336. } else if (be32_to_cpu(hdr->datasn) < data_sn) {
  337. pr_err("Command ITT: 0x%08x, received DataSN: 0x%08x"
  338. " lower than expected 0x%08x, discarding payload.\n",
  339. cmd->init_task_tag, be32_to_cpu(hdr->datasn), data_sn);
  340. goto dump;
  341. }
  342. return DATAOUT_NORMAL;
  343. recover:
  344. if (!conn->sess->sess_ops->ErrorRecoveryLevel) {
  345. pr_err("Unable to perform within-command recovery"
  346. " while ERL=0.\n");
  347. return DATAOUT_CANNOT_RECOVER;
  348. }
  349. dump:
  350. if (iscsit_dump_data_payload(conn, payload_length, 1) < 0)
  351. return DATAOUT_CANNOT_RECOVER;
  352. return DATAOUT_WITHIN_COMMAND_RECOVERY;
  353. }
  354. static int iscsit_dataout_pre_datapduinorder_yes(
  355. struct iscsi_cmd *cmd,
  356. unsigned char *buf)
  357. {
  358. int dump = 0, recovery = 0;
  359. struct iscsi_conn *conn = cmd->conn;
  360. struct iscsi_data *hdr = (struct iscsi_data *) buf;
  361. u32 payload_length = ntoh24(hdr->dlength);
  362. /*
  363. * For DataSequenceInOrder=Yes: If the offset is greater than the global
  364. * DataPDUInOrder=Yes offset counter in struct iscsi_cmd a protcol error has
  365. * occurred and fail the connection.
  366. *
  367. * For DataSequenceInOrder=No: If the offset is greater than the per
  368. * sequence DataPDUInOrder=Yes offset counter in struct iscsi_seq a protocol
  369. * error has occurred and fail the connection.
  370. */
  371. if (conn->sess->sess_ops->DataSequenceInOrder) {
  372. if (be32_to_cpu(hdr->offset) != cmd->write_data_done) {
  373. pr_err("Command ITT: 0x%08x, received offset"
  374. " %u different than expected %u.\n", cmd->init_task_tag,
  375. be32_to_cpu(hdr->offset), cmd->write_data_done);
  376. recovery = 1;
  377. goto recover;
  378. }
  379. } else {
  380. struct iscsi_seq *seq = cmd->seq_ptr;
  381. if (be32_to_cpu(hdr->offset) > seq->offset) {
  382. pr_err("Command ITT: 0x%08x, received offset"
  383. " %u greater than expected %u.\n", cmd->init_task_tag,
  384. be32_to_cpu(hdr->offset), seq->offset);
  385. recovery = 1;
  386. goto recover;
  387. } else if (be32_to_cpu(hdr->offset) < seq->offset) {
  388. pr_err("Command ITT: 0x%08x, received offset"
  389. " %u less than expected %u, discarding payload.\n",
  390. cmd->init_task_tag, be32_to_cpu(hdr->offset),
  391. seq->offset);
  392. dump = 1;
  393. goto dump;
  394. }
  395. }
  396. return DATAOUT_NORMAL;
  397. recover:
  398. if (!conn->sess->sess_ops->ErrorRecoveryLevel) {
  399. pr_err("Unable to perform within-command recovery"
  400. " while ERL=0.\n");
  401. return DATAOUT_CANNOT_RECOVER;
  402. }
  403. dump:
  404. if (iscsit_dump_data_payload(conn, payload_length, 1) < 0)
  405. return DATAOUT_CANNOT_RECOVER;
  406. return (recovery) ? iscsit_recover_dataout_sequence(cmd,
  407. be32_to_cpu(hdr->offset), payload_length) :
  408. (dump) ? DATAOUT_WITHIN_COMMAND_RECOVERY : DATAOUT_NORMAL;
  409. }
  410. static int iscsit_dataout_pre_datapduinorder_no(
  411. struct iscsi_cmd *cmd,
  412. unsigned char *buf)
  413. {
  414. struct iscsi_pdu *pdu;
  415. struct iscsi_data *hdr = (struct iscsi_data *) buf;
  416. u32 payload_length = ntoh24(hdr->dlength);
  417. pdu = iscsit_get_pdu_holder(cmd, be32_to_cpu(hdr->offset),
  418. payload_length);
  419. if (!pdu)
  420. return DATAOUT_CANNOT_RECOVER;
  421. cmd->pdu_ptr = pdu;
  422. switch (pdu->status) {
  423. case ISCSI_PDU_NOT_RECEIVED:
  424. case ISCSI_PDU_CRC_FAILED:
  425. case ISCSI_PDU_TIMED_OUT:
  426. break;
  427. case ISCSI_PDU_RECEIVED_OK:
  428. pr_err("Command ITT: 0x%08x received already gotten"
  429. " Offset: %u, Length: %u\n", cmd->init_task_tag,
  430. be32_to_cpu(hdr->offset), payload_length);
  431. return iscsit_dump_data_payload(cmd->conn, payload_length, 1);
  432. default:
  433. return DATAOUT_CANNOT_RECOVER;
  434. }
  435. return DATAOUT_NORMAL;
  436. }
  437. static int iscsit_dataout_update_r2t(struct iscsi_cmd *cmd, u32 offset, u32 length)
  438. {
  439. struct iscsi_r2t *r2t;
  440. if (cmd->unsolicited_data)
  441. return 0;
  442. r2t = iscsit_get_r2t_for_eos(cmd, offset, length);
  443. if (!r2t)
  444. return -1;
  445. spin_lock_bh(&cmd->r2t_lock);
  446. r2t->seq_complete = 1;
  447. cmd->outstanding_r2ts--;
  448. spin_unlock_bh(&cmd->r2t_lock);
  449. return 0;
  450. }
  451. static int iscsit_dataout_update_datapduinorder_no(
  452. struct iscsi_cmd *cmd,
  453. u32 data_sn,
  454. int f_bit)
  455. {
  456. int ret = 0;
  457. struct iscsi_pdu *pdu = cmd->pdu_ptr;
  458. pdu->data_sn = data_sn;
  459. switch (pdu->status) {
  460. case ISCSI_PDU_NOT_RECEIVED:
  461. pdu->status = ISCSI_PDU_RECEIVED_OK;
  462. break;
  463. case ISCSI_PDU_CRC_FAILED:
  464. pdu->status = ISCSI_PDU_RECEIVED_OK;
  465. break;
  466. case ISCSI_PDU_TIMED_OUT:
  467. pdu->status = ISCSI_PDU_RECEIVED_OK;
  468. break;
  469. default:
  470. return DATAOUT_CANNOT_RECOVER;
  471. }
  472. if (f_bit) {
  473. ret = iscsit_dataout_datapduinorder_no_fbit(cmd, pdu);
  474. if (ret == DATAOUT_CANNOT_RECOVER)
  475. return ret;
  476. }
  477. return DATAOUT_NORMAL;
  478. }
  479. static int iscsit_dataout_post_crc_passed(
  480. struct iscsi_cmd *cmd,
  481. unsigned char *buf)
  482. {
  483. int ret, send_r2t = 0;
  484. struct iscsi_conn *conn = cmd->conn;
  485. struct iscsi_seq *seq = NULL;
  486. struct iscsi_data *hdr = (struct iscsi_data *) buf;
  487. u32 payload_length = ntoh24(hdr->dlength);
  488. if (cmd->unsolicited_data) {
  489. if ((cmd->first_burst_len + payload_length) ==
  490. conn->sess->sess_ops->FirstBurstLength) {
  491. if (iscsit_dataout_update_r2t(cmd, be32_to_cpu(hdr->offset),
  492. payload_length) < 0)
  493. return DATAOUT_CANNOT_RECOVER;
  494. send_r2t = 1;
  495. }
  496. if (!conn->sess->sess_ops->DataPDUInOrder) {
  497. ret = iscsit_dataout_update_datapduinorder_no(cmd,
  498. be32_to_cpu(hdr->datasn),
  499. (hdr->flags & ISCSI_FLAG_CMD_FINAL));
  500. if (ret == DATAOUT_CANNOT_RECOVER)
  501. return ret;
  502. }
  503. cmd->first_burst_len += payload_length;
  504. if (conn->sess->sess_ops->DataSequenceInOrder)
  505. cmd->data_sn++;
  506. else {
  507. seq = cmd->seq_ptr;
  508. seq->data_sn++;
  509. seq->offset += payload_length;
  510. }
  511. if (send_r2t) {
  512. if (seq)
  513. seq->status = DATAOUT_SEQUENCE_COMPLETE;
  514. cmd->first_burst_len = 0;
  515. cmd->unsolicited_data = 0;
  516. }
  517. } else {
  518. if (conn->sess->sess_ops->DataSequenceInOrder) {
  519. if ((cmd->next_burst_len + payload_length) ==
  520. conn->sess->sess_ops->MaxBurstLength) {
  521. if (iscsit_dataout_update_r2t(cmd,
  522. be32_to_cpu(hdr->offset),
  523. payload_length) < 0)
  524. return DATAOUT_CANNOT_RECOVER;
  525. send_r2t = 1;
  526. }
  527. if (!conn->sess->sess_ops->DataPDUInOrder) {
  528. ret = iscsit_dataout_update_datapduinorder_no(
  529. cmd, be32_to_cpu(hdr->datasn),
  530. (hdr->flags & ISCSI_FLAG_CMD_FINAL));
  531. if (ret == DATAOUT_CANNOT_RECOVER)
  532. return ret;
  533. }
  534. cmd->next_burst_len += payload_length;
  535. cmd->data_sn++;
  536. if (send_r2t)
  537. cmd->next_burst_len = 0;
  538. } else {
  539. seq = cmd->seq_ptr;
  540. if ((seq->next_burst_len + payload_length) ==
  541. seq->xfer_len) {
  542. if (iscsit_dataout_update_r2t(cmd,
  543. be32_to_cpu(hdr->offset),
  544. payload_length) < 0)
  545. return DATAOUT_CANNOT_RECOVER;
  546. send_r2t = 1;
  547. }
  548. if (!conn->sess->sess_ops->DataPDUInOrder) {
  549. ret = iscsit_dataout_update_datapduinorder_no(
  550. cmd, be32_to_cpu(hdr->datasn),
  551. (hdr->flags & ISCSI_FLAG_CMD_FINAL));
  552. if (ret == DATAOUT_CANNOT_RECOVER)
  553. return ret;
  554. }
  555. seq->data_sn++;
  556. seq->offset += payload_length;
  557. seq->next_burst_len += payload_length;
  558. if (send_r2t) {
  559. seq->next_burst_len = 0;
  560. seq->status = DATAOUT_SEQUENCE_COMPLETE;
  561. }
  562. }
  563. }
  564. if (send_r2t && conn->sess->sess_ops->DataSequenceInOrder)
  565. cmd->data_sn = 0;
  566. cmd->write_data_done += payload_length;
  567. if (cmd->write_data_done == cmd->se_cmd.data_length)
  568. return DATAOUT_SEND_TO_TRANSPORT;
  569. else if (send_r2t)
  570. return DATAOUT_SEND_R2T;
  571. else
  572. return DATAOUT_NORMAL;
  573. }
  574. static int iscsit_dataout_post_crc_failed(
  575. struct iscsi_cmd *cmd,
  576. unsigned char *buf)
  577. {
  578. struct iscsi_conn *conn = cmd->conn;
  579. struct iscsi_pdu *pdu;
  580. struct iscsi_data *hdr = (struct iscsi_data *) buf;
  581. u32 payload_length = ntoh24(hdr->dlength);
  582. if (conn->sess->sess_ops->DataPDUInOrder)
  583. goto recover;
  584. /*
  585. * The rest of this function is only called when DataPDUInOrder=No.
  586. */
  587. pdu = cmd->pdu_ptr;
  588. switch (pdu->status) {
  589. case ISCSI_PDU_NOT_RECEIVED:
  590. pdu->status = ISCSI_PDU_CRC_FAILED;
  591. break;
  592. case ISCSI_PDU_CRC_FAILED:
  593. break;
  594. case ISCSI_PDU_TIMED_OUT:
  595. pdu->status = ISCSI_PDU_CRC_FAILED;
  596. break;
  597. default:
  598. return DATAOUT_CANNOT_RECOVER;
  599. }
  600. recover:
  601. return iscsit_recover_dataout_sequence(cmd, be32_to_cpu(hdr->offset),
  602. payload_length);
  603. }
  604. /*
  605. * Called from iscsit_handle_data_out() before DataOUT Payload is received
  606. * and CRC computed.
  607. */
  608. int iscsit_check_pre_dataout(
  609. struct iscsi_cmd *cmd,
  610. unsigned char *buf)
  611. {
  612. int ret;
  613. struct iscsi_conn *conn = cmd->conn;
  614. ret = iscsit_dataout_within_command_recovery_check(cmd, buf);
  615. if ((ret == DATAOUT_WITHIN_COMMAND_RECOVERY) ||
  616. (ret == DATAOUT_CANNOT_RECOVER))
  617. return ret;
  618. ret = iscsit_dataout_check_datasn(cmd, buf);
  619. if ((ret == DATAOUT_WITHIN_COMMAND_RECOVERY) ||
  620. (ret == DATAOUT_CANNOT_RECOVER))
  621. return ret;
  622. if (cmd->unsolicited_data) {
  623. ret = iscsit_dataout_check_unsolicited_sequence(cmd, buf);
  624. if ((ret == DATAOUT_WITHIN_COMMAND_RECOVERY) ||
  625. (ret == DATAOUT_CANNOT_RECOVER))
  626. return ret;
  627. } else {
  628. ret = iscsit_dataout_check_sequence(cmd, buf);
  629. if ((ret == DATAOUT_WITHIN_COMMAND_RECOVERY) ||
  630. (ret == DATAOUT_CANNOT_RECOVER))
  631. return ret;
  632. }
  633. return (conn->sess->sess_ops->DataPDUInOrder) ?
  634. iscsit_dataout_pre_datapduinorder_yes(cmd, buf) :
  635. iscsit_dataout_pre_datapduinorder_no(cmd, buf);
  636. }
  637. /*
  638. * Called from iscsit_handle_data_out() after DataOUT Payload is received
  639. * and CRC computed.
  640. */
  641. int iscsit_check_post_dataout(
  642. struct iscsi_cmd *cmd,
  643. unsigned char *buf,
  644. u8 data_crc_failed)
  645. {
  646. struct iscsi_conn *conn = cmd->conn;
  647. cmd->dataout_timeout_retries = 0;
  648. if (!data_crc_failed)
  649. return iscsit_dataout_post_crc_passed(cmd, buf);
  650. else {
  651. if (!conn->sess->sess_ops->ErrorRecoveryLevel) {
  652. pr_err("Unable to recover from DataOUT CRC"
  653. " failure while ERL=0, closing session.\n");
  654. iscsit_reject_cmd(cmd, ISCSI_REASON_DATA_DIGEST_ERROR,
  655. buf);
  656. return DATAOUT_CANNOT_RECOVER;
  657. }
  658. iscsit_reject_cmd(cmd, ISCSI_REASON_DATA_DIGEST_ERROR, buf);
  659. return iscsit_dataout_post_crc_failed(cmd, buf);
  660. }
  661. }
  662. void iscsit_handle_time2retain_timeout(struct timer_list *t)
  663. {
  664. struct iscsi_session *sess = from_timer(sess, t, time2retain_timer);
  665. struct iscsi_portal_group *tpg = sess->tpg;
  666. struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
  667. spin_lock_bh(&se_tpg->session_lock);
  668. if (sess->time2retain_timer_flags & ISCSI_TF_STOP) {
  669. spin_unlock_bh(&se_tpg->session_lock);
  670. return;
  671. }
  672. if (atomic_read(&sess->session_reinstatement)) {
  673. pr_err("Exiting Time2Retain handler because"
  674. " session_reinstatement=1\n");
  675. spin_unlock_bh(&se_tpg->session_lock);
  676. return;
  677. }
  678. sess->time2retain_timer_flags |= ISCSI_TF_EXPIRED;
  679. pr_err("Time2Retain timer expired for SID: %u, cleaning up"
  680. " iSCSI session.\n", sess->sid);
  681. {
  682. struct iscsi_tiqn *tiqn = tpg->tpg_tiqn;
  683. if (tiqn) {
  684. spin_lock(&tiqn->sess_err_stats.lock);
  685. strcpy(tiqn->sess_err_stats.last_sess_fail_rem_name,
  686. (void *)sess->sess_ops->InitiatorName);
  687. tiqn->sess_err_stats.last_sess_failure_type =
  688. ISCSI_SESS_ERR_CXN_TIMEOUT;
  689. tiqn->sess_err_stats.cxn_timeout_errors++;
  690. atomic_long_inc(&sess->conn_timeout_errors);
  691. spin_unlock(&tiqn->sess_err_stats.lock);
  692. }
  693. }
  694. spin_unlock_bh(&se_tpg->session_lock);
  695. iscsit_close_session(sess);
  696. }
  697. void iscsit_start_time2retain_handler(struct iscsi_session *sess)
  698. {
  699. int tpg_active;
  700. /*
  701. * Only start Time2Retain timer when the associated TPG is still in
  702. * an ACTIVE (eg: not disabled or shutdown) state.
  703. */
  704. spin_lock(&sess->tpg->tpg_state_lock);
  705. tpg_active = (sess->tpg->tpg_state == TPG_STATE_ACTIVE);
  706. spin_unlock(&sess->tpg->tpg_state_lock);
  707. if (!tpg_active)
  708. return;
  709. if (sess->time2retain_timer_flags & ISCSI_TF_RUNNING)
  710. return;
  711. pr_debug("Starting Time2Retain timer for %u seconds on"
  712. " SID: %u\n", sess->sess_ops->DefaultTime2Retain, sess->sid);
  713. sess->time2retain_timer_flags &= ~ISCSI_TF_STOP;
  714. sess->time2retain_timer_flags |= ISCSI_TF_RUNNING;
  715. mod_timer(&sess->time2retain_timer,
  716. jiffies + sess->sess_ops->DefaultTime2Retain * HZ);
  717. }
  718. /*
  719. * Called with spin_lock_bh(&struct se_portal_group->session_lock) held
  720. */
  721. int iscsit_stop_time2retain_timer(struct iscsi_session *sess)
  722. {
  723. struct iscsi_portal_group *tpg = sess->tpg;
  724. struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
  725. if (sess->time2retain_timer_flags & ISCSI_TF_EXPIRED)
  726. return -1;
  727. if (!(sess->time2retain_timer_flags & ISCSI_TF_RUNNING))
  728. return 0;
  729. sess->time2retain_timer_flags |= ISCSI_TF_STOP;
  730. spin_unlock(&se_tpg->session_lock);
  731. del_timer_sync(&sess->time2retain_timer);
  732. spin_lock(&se_tpg->session_lock);
  733. sess->time2retain_timer_flags &= ~ISCSI_TF_RUNNING;
  734. pr_debug("Stopped Time2Retain Timer for SID: %u\n",
  735. sess->sid);
  736. return 0;
  737. }
  738. void iscsit_connection_reinstatement_rcfr(struct iscsi_conn *conn)
  739. {
  740. spin_lock_bh(&conn->state_lock);
  741. if (atomic_read(&conn->connection_exit)) {
  742. spin_unlock_bh(&conn->state_lock);
  743. goto sleep;
  744. }
  745. if (atomic_read(&conn->transport_failed)) {
  746. spin_unlock_bh(&conn->state_lock);
  747. goto sleep;
  748. }
  749. spin_unlock_bh(&conn->state_lock);
  750. if (conn->tx_thread && conn->tx_thread_active)
  751. send_sig(SIGINT, conn->tx_thread, 1);
  752. if (conn->rx_thread && conn->rx_thread_active)
  753. send_sig(SIGINT, conn->rx_thread, 1);
  754. sleep:
  755. wait_for_completion(&conn->conn_wait_rcfr_comp);
  756. complete(&conn->conn_post_wait_comp);
  757. }
  758. void iscsit_cause_connection_reinstatement(struct iscsi_conn *conn, int sleep)
  759. {
  760. spin_lock_bh(&conn->state_lock);
  761. if (atomic_read(&conn->connection_exit)) {
  762. spin_unlock_bh(&conn->state_lock);
  763. return;
  764. }
  765. if (atomic_read(&conn->transport_failed)) {
  766. spin_unlock_bh(&conn->state_lock);
  767. return;
  768. }
  769. if (atomic_read(&conn->connection_reinstatement)) {
  770. spin_unlock_bh(&conn->state_lock);
  771. return;
  772. }
  773. if (conn->tx_thread && conn->tx_thread_active)
  774. send_sig(SIGINT, conn->tx_thread, 1);
  775. if (conn->rx_thread && conn->rx_thread_active)
  776. send_sig(SIGINT, conn->rx_thread, 1);
  777. atomic_set(&conn->connection_reinstatement, 1);
  778. if (!sleep) {
  779. spin_unlock_bh(&conn->state_lock);
  780. return;
  781. }
  782. atomic_set(&conn->sleep_on_conn_wait_comp, 1);
  783. spin_unlock_bh(&conn->state_lock);
  784. wait_for_completion(&conn->conn_wait_comp);
  785. complete(&conn->conn_post_wait_comp);
  786. }
  787. EXPORT_SYMBOL(iscsit_cause_connection_reinstatement);
  788. void iscsit_fall_back_to_erl0(struct iscsi_session *sess)
  789. {
  790. pr_debug("Falling back to ErrorRecoveryLevel=0 for SID:"
  791. " %u\n", sess->sid);
  792. atomic_set(&sess->session_fall_back_to_erl0, 1);
  793. }
  794. static void iscsit_handle_connection_cleanup(struct iscsi_conn *conn)
  795. {
  796. struct iscsi_session *sess = conn->sess;
  797. if ((sess->sess_ops->ErrorRecoveryLevel == 2) &&
  798. !atomic_read(&sess->session_reinstatement) &&
  799. !atomic_read(&sess->session_fall_back_to_erl0))
  800. iscsit_connection_recovery_transport_reset(conn);
  801. else {
  802. pr_debug("Performing cleanup for failed iSCSI"
  803. " Connection ID: %hu from %s\n", conn->cid,
  804. sess->sess_ops->InitiatorName);
  805. iscsit_close_connection(conn);
  806. }
  807. }
  808. void iscsit_take_action_for_connection_exit(struct iscsi_conn *conn, bool *conn_freed)
  809. {
  810. *conn_freed = false;
  811. spin_lock_bh(&conn->state_lock);
  812. if (atomic_read(&conn->connection_exit)) {
  813. spin_unlock_bh(&conn->state_lock);
  814. return;
  815. }
  816. atomic_set(&conn->connection_exit, 1);
  817. if (conn->conn_state == TARG_CONN_STATE_IN_LOGOUT) {
  818. spin_unlock_bh(&conn->state_lock);
  819. iscsit_close_connection(conn);
  820. *conn_freed = true;
  821. return;
  822. }
  823. if (conn->conn_state == TARG_CONN_STATE_CLEANUP_WAIT) {
  824. spin_unlock_bh(&conn->state_lock);
  825. return;
  826. }
  827. pr_debug("Moving to TARG_CONN_STATE_CLEANUP_WAIT.\n");
  828. conn->conn_state = TARG_CONN_STATE_CLEANUP_WAIT;
  829. spin_unlock_bh(&conn->state_lock);
  830. iscsit_handle_connection_cleanup(conn);
  831. *conn_freed = true;
  832. }