This source file includes following definitions.
- iscsit_tmr_abort_task
- iscsit_tmr_task_warm_reset
- iscsit_tmr_task_cold_reset
- iscsit_tmr_task_reassign
- iscsit_task_reassign_remove_cmd
- iscsit_task_reassign_complete_nop_out
- iscsit_task_reassign_complete_write
- iscsit_task_reassign_complete_read
- iscsit_task_reassign_complete_none
- iscsit_task_reassign_complete_scsi_cmnd
- iscsit_task_reassign_complete
- iscsit_tmr_post_handler
- iscsit_task_reassign_prepare_read
- iscsit_task_reassign_prepare_unsolicited_dataout
- iscsit_task_reassign_prepare_write
- iscsit_check_task_reassign_expdatasn
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 #include <asm/unaligned.h>
  12 #include <scsi/scsi_proto.h>
  13 #include <scsi/iscsi_proto.h>
  14 #include <target/target_core_base.h>
  15 #include <target/target_core_fabric.h>
  16 #include <target/iscsi/iscsi_transport.h>
  17 
  18 #include <target/iscsi/iscsi_target_core.h>
  19 #include "iscsi_target_seq_pdu_list.h"
  20 #include "iscsi_target_datain_values.h"
  21 #include "iscsi_target_device.h"
  22 #include "iscsi_target_erl0.h"
  23 #include "iscsi_target_erl1.h"
  24 #include "iscsi_target_erl2.h"
  25 #include "iscsi_target_tmr.h"
  26 #include "iscsi_target_tpg.h"
  27 #include "iscsi_target_util.h"
  28 #include "iscsi_target.h"
  29 
  30 u8 iscsit_tmr_abort_task(
  31         struct iscsi_cmd *cmd,
  32         unsigned char *buf)
  33 {
  34         struct iscsi_cmd *ref_cmd;
  35         struct iscsi_conn *conn = cmd->conn;
  36         struct iscsi_tmr_req *tmr_req = cmd->tmr_req;
  37         struct se_tmr_req *se_tmr = cmd->se_cmd.se_tmr_req;
  38         struct iscsi_tm *hdr = (struct iscsi_tm *) buf;
  39 
  40         ref_cmd = iscsit_find_cmd_from_itt(conn, hdr->rtt);
  41         if (!ref_cmd) {
  42                 pr_err("Unable to locate RefTaskTag: 0x%08x on CID:"
  43                         " %hu.\n", hdr->rtt, conn->cid);
  44                 return (iscsi_sna_gte(be32_to_cpu(hdr->refcmdsn), conn->sess->exp_cmd_sn) &&
  45                         iscsi_sna_lte(be32_to_cpu(hdr->refcmdsn), (u32) atomic_read(&conn->sess->max_cmd_sn))) ?
  46                         ISCSI_TMF_RSP_COMPLETE : ISCSI_TMF_RSP_NO_TASK;
  47         }
  48         if (ref_cmd->cmd_sn != be32_to_cpu(hdr->refcmdsn)) {
  49                 pr_err("RefCmdSN 0x%08x does not equal"
  50                         " task's CmdSN 0x%08x. Rejecting ABORT_TASK.\n",
  51                         hdr->refcmdsn, ref_cmd->cmd_sn);
  52                 return ISCSI_TMF_RSP_REJECTED;
  53         }
  54 
  55         se_tmr->ref_task_tag            = (__force u32)hdr->rtt;
  56         tmr_req->ref_cmd                = ref_cmd;
  57         tmr_req->exp_data_sn            = be32_to_cpu(hdr->exp_datasn);
  58 
  59         return ISCSI_TMF_RSP_COMPLETE;
  60 }
  61 
  62 
  63 
  64 
  65 int iscsit_tmr_task_warm_reset(
  66         struct iscsi_conn *conn,
  67         struct iscsi_tmr_req *tmr_req,
  68         unsigned char *buf)
  69 {
  70         struct iscsi_session *sess = conn->sess;
  71         struct iscsi_node_attrib *na = iscsit_tpg_get_node_attrib(sess);
  72 
  73         if (!na->tmr_warm_reset) {
  74                 pr_err("TMR Opcode TARGET_WARM_RESET authorization"
  75                         " failed for Initiator Node: %s\n",
  76                         sess->se_sess->se_node_acl->initiatorname);
  77                 return -1;
  78         }
  79         
  80 
  81 
  82         return 0;
  83 }
  84 
  85 int iscsit_tmr_task_cold_reset(
  86         struct iscsi_conn *conn,
  87         struct iscsi_tmr_req *tmr_req,
  88         unsigned char *buf)
  89 {
  90         struct iscsi_session *sess = conn->sess;
  91         struct iscsi_node_attrib *na = iscsit_tpg_get_node_attrib(sess);
  92 
  93         if (!na->tmr_cold_reset) {
  94                 pr_err("TMR Opcode TARGET_COLD_RESET authorization"
  95                         " failed for Initiator Node: %s\n",
  96                         sess->se_sess->se_node_acl->initiatorname);
  97                 return -1;
  98         }
  99         
 100 
 101 
 102         return 0;
 103 }
 104 
 105 u8 iscsit_tmr_task_reassign(
 106         struct iscsi_cmd *cmd,
 107         unsigned char *buf)
 108 {
 109         struct iscsi_cmd *ref_cmd = NULL;
 110         struct iscsi_conn *conn = cmd->conn;
 111         struct iscsi_conn_recovery *cr = NULL;
 112         struct iscsi_tmr_req *tmr_req = cmd->tmr_req;
 113         struct se_tmr_req *se_tmr = cmd->se_cmd.se_tmr_req;
 114         struct iscsi_tm *hdr = (struct iscsi_tm *) buf;
 115         u64 ret, ref_lun;
 116 
 117         pr_debug("Got TASK_REASSIGN TMR ITT: 0x%08x,"
 118                 " RefTaskTag: 0x%08x, ExpDataSN: 0x%08x, CID: %hu\n",
 119                 hdr->itt, hdr->rtt, hdr->exp_datasn, conn->cid);
 120 
 121         if (conn->sess->sess_ops->ErrorRecoveryLevel != 2) {
 122                 pr_err("TMR TASK_REASSIGN not supported in ERL<2,"
 123                                 " ignoring request.\n");
 124                 return ISCSI_TMF_RSP_NOT_SUPPORTED;
 125         }
 126 
 127         ret = iscsit_find_cmd_for_recovery(conn->sess, &ref_cmd, &cr, hdr->rtt);
 128         if (ret == -2) {
 129                 pr_err("Command ITT: 0x%08x is still alligent to CID:"
 130                         " %hu\n", ref_cmd->init_task_tag, cr->cid);
 131                 return ISCSI_TMF_RSP_TASK_ALLEGIANT;
 132         } else if (ret == -1) {
 133                 pr_err("Unable to locate RefTaskTag: 0x%08x in"
 134                         " connection recovery command list.\n", hdr->rtt);
 135                 return ISCSI_TMF_RSP_NO_TASK;
 136         }
 137         
 138 
 139 
 140 
 141         if (cr->maxrecvdatasegmentlength !=
 142             conn->conn_ops->MaxRecvDataSegmentLength) {
 143                 pr_err("Unable to perform connection recovery for"
 144                         " differing MaxRecvDataSegmentLength, rejecting"
 145                         " TMR TASK_REASSIGN.\n");
 146                 return ISCSI_TMF_RSP_REJECTED;
 147         }
 148         if (cr->maxxmitdatasegmentlength !=
 149             conn->conn_ops->MaxXmitDataSegmentLength) {
 150                 pr_err("Unable to perform connection recovery for"
 151                         " differing MaxXmitDataSegmentLength, rejecting"
 152                         " TMR TASK_REASSIGN.\n");
 153                 return ISCSI_TMF_RSP_REJECTED;
 154         }
 155 
 156         ref_lun = scsilun_to_int(&hdr->lun);
 157         if (ref_lun != ref_cmd->se_cmd.orig_fe_lun) {
 158                 pr_err("Unable to perform connection recovery for"
 159                         " differing ref_lun: %llu ref_cmd orig_fe_lun: %llu\n",
 160                         ref_lun, ref_cmd->se_cmd.orig_fe_lun);
 161                 return ISCSI_TMF_RSP_REJECTED;
 162         }
 163 
 164         se_tmr->ref_task_tag            = (__force u32)hdr->rtt;
 165         tmr_req->ref_cmd                = ref_cmd;
 166         tmr_req->exp_data_sn            = be32_to_cpu(hdr->exp_datasn);
 167         tmr_req->conn_recovery          = cr;
 168         tmr_req->task_reassign          = 1;
 169         
 170 
 171 
 172 
 173 
 174         return ISCSI_TMF_RSP_COMPLETE;
 175 }
 176 
 177 static void iscsit_task_reassign_remove_cmd(
 178         struct iscsi_cmd *cmd,
 179         struct iscsi_conn_recovery *cr,
 180         struct iscsi_session *sess)
 181 {
 182         int ret;
 183 
 184         spin_lock(&cr->conn_recovery_cmd_lock);
 185         ret = iscsit_remove_cmd_from_connection_recovery(cmd, sess);
 186         spin_unlock(&cr->conn_recovery_cmd_lock);
 187         if (!ret) {
 188                 pr_debug("iSCSI connection recovery successful for CID:"
 189                         " %hu on SID: %u\n", cr->cid, sess->sid);
 190                 iscsit_remove_active_connection_recovery_entry(cr, sess);
 191         }
 192 }
 193 
 194 static int iscsit_task_reassign_complete_nop_out(
 195         struct iscsi_tmr_req *tmr_req,
 196         struct iscsi_conn *conn)
 197 {
 198         struct iscsi_cmd *cmd = tmr_req->ref_cmd;
 199         struct iscsi_conn_recovery *cr;
 200 
 201         if (!cmd->cr) {
 202                 pr_err("struct iscsi_conn_recovery pointer for ITT: 0x%08x"
 203                         " is NULL!\n", cmd->init_task_tag);
 204                 return -1;
 205         }
 206         cr = cmd->cr;
 207 
 208         
 209 
 210 
 211 
 212 
 213         cmd->stat_sn = cmd->exp_stat_sn = 0;
 214 
 215         iscsit_task_reassign_remove_cmd(cmd, cr, conn->sess);
 216 
 217         spin_lock_bh(&conn->cmd_lock);
 218         list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list);
 219         spin_unlock_bh(&conn->cmd_lock);
 220 
 221         cmd->i_state = ISTATE_SEND_NOPIN;
 222         iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
 223         return 0;
 224 }
 225 
 226 static int iscsit_task_reassign_complete_write(
 227         struct iscsi_cmd *cmd,
 228         struct iscsi_tmr_req *tmr_req)
 229 {
 230         int no_build_r2ts = 0;
 231         u32 length = 0, offset = 0;
 232         struct iscsi_conn *conn = cmd->conn;
 233         struct se_cmd *se_cmd = &cmd->se_cmd;
 234         
 235 
 236 
 237 
 238         if (!tmr_req->exp_data_sn) {
 239                 cmd->cmd_flags &= ~ICF_GOT_DATACK_SNACK;
 240                 cmd->acked_data_sn = 0;
 241         } else {
 242                 cmd->cmd_flags |= ICF_GOT_DATACK_SNACK;
 243                 cmd->acked_data_sn = (tmr_req->exp_data_sn - 1);
 244         }
 245 
 246         
 247 
 248 
 249 
 250 
 251         if (cmd->cmd_flags & ICF_GOT_LAST_DATAOUT) {
 252                 if (!(cmd->se_cmd.transport_state & CMD_T_SENT)) {
 253                         pr_debug("WRITE ITT: 0x%08x: t_state: %d"
 254                                 " never sent to transport\n",
 255                                 cmd->init_task_tag, cmd->se_cmd.t_state);
 256                         target_execute_cmd(se_cmd);
 257                         return 0;
 258                 }
 259 
 260                 cmd->i_state = ISTATE_SEND_STATUS;
 261                 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
 262                 return 0;
 263         }
 264 
 265         
 266 
 267 
 268 
 269         if (cmd->unsolicited_data) {
 270                 cmd->unsolicited_data = 0;
 271 
 272                 offset = cmd->next_burst_len = cmd->write_data_done;
 273 
 274                 if ((conn->sess->sess_ops->FirstBurstLength - offset) >=
 275                      cmd->se_cmd.data_length) {
 276                         no_build_r2ts = 1;
 277                         length = (cmd->se_cmd.data_length - offset);
 278                 } else
 279                         length = (conn->sess->sess_ops->FirstBurstLength - offset);
 280 
 281                 spin_lock_bh(&cmd->r2t_lock);
 282                 if (iscsit_add_r2t_to_list(cmd, offset, length, 0, 0) < 0) {
 283                         spin_unlock_bh(&cmd->r2t_lock);
 284                         return -1;
 285                 }
 286                 cmd->outstanding_r2ts++;
 287                 spin_unlock_bh(&cmd->r2t_lock);
 288 
 289                 if (no_build_r2ts)
 290                         return 0;
 291         }
 292         
 293 
 294 
 295         return conn->conn_transport->iscsit_get_dataout(conn, cmd, true);
 296 }
 297 
 298 static int iscsit_task_reassign_complete_read(
 299         struct iscsi_cmd *cmd,
 300         struct iscsi_tmr_req *tmr_req)
 301 {
 302         struct iscsi_conn *conn = cmd->conn;
 303         struct iscsi_datain_req *dr;
 304         struct se_cmd *se_cmd = &cmd->se_cmd;
 305         
 306 
 307 
 308 
 309         if (!tmr_req->exp_data_sn) {
 310                 cmd->cmd_flags &= ~ICF_GOT_DATACK_SNACK;
 311                 cmd->acked_data_sn = 0;
 312         } else {
 313                 cmd->cmd_flags |= ICF_GOT_DATACK_SNACK;
 314                 cmd->acked_data_sn = (tmr_req->exp_data_sn - 1);
 315         }
 316 
 317         if (!(cmd->se_cmd.transport_state & CMD_T_SENT)) {
 318                 pr_debug("READ ITT: 0x%08x: t_state: %d never sent to"
 319                         " transport\n", cmd->init_task_tag,
 320                         cmd->se_cmd.t_state);
 321                 transport_handle_cdb_direct(se_cmd);
 322                 return 0;
 323         }
 324 
 325         if (!(se_cmd->transport_state & CMD_T_COMPLETE)) {
 326                 pr_err("READ ITT: 0x%08x: t_state: %d, never returned"
 327                         " from transport\n", cmd->init_task_tag,
 328                         cmd->se_cmd.t_state);
 329                 return -1;
 330         }
 331 
 332         dr = iscsit_allocate_datain_req();
 333         if (!dr)
 334                 return -1;
 335         
 336 
 337 
 338 
 339         dr->data_sn = dr->begrun = tmr_req->exp_data_sn;
 340         dr->runlength = 0;
 341         dr->generate_recovery_values = 1;
 342         dr->recovery = DATAIN_CONNECTION_RECOVERY;
 343 
 344         iscsit_attach_datain_req(cmd, dr);
 345 
 346         cmd->i_state = ISTATE_SEND_DATAIN;
 347         iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
 348         return 0;
 349 }
 350 
 351 static int iscsit_task_reassign_complete_none(
 352         struct iscsi_cmd *cmd,
 353         struct iscsi_tmr_req *tmr_req)
 354 {
 355         struct iscsi_conn *conn = cmd->conn;
 356 
 357         cmd->i_state = ISTATE_SEND_STATUS;
 358         iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
 359         return 0;
 360 }
 361 
 362 static int iscsit_task_reassign_complete_scsi_cmnd(
 363         struct iscsi_tmr_req *tmr_req,
 364         struct iscsi_conn *conn)
 365 {
 366         struct iscsi_cmd *cmd = tmr_req->ref_cmd;
 367         struct iscsi_conn_recovery *cr;
 368 
 369         if (!cmd->cr) {
 370                 pr_err("struct iscsi_conn_recovery pointer for ITT: 0x%08x"
 371                         " is NULL!\n", cmd->init_task_tag);
 372                 return -1;
 373         }
 374         cr = cmd->cr;
 375 
 376         
 377 
 378 
 379 
 380 
 381         cmd->stat_sn = cmd->exp_stat_sn = 0;
 382 
 383         iscsit_task_reassign_remove_cmd(cmd, cr, conn->sess);
 384 
 385         spin_lock_bh(&conn->cmd_lock);
 386         list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list);
 387         spin_unlock_bh(&conn->cmd_lock);
 388 
 389         if (cmd->se_cmd.se_cmd_flags & SCF_SENT_CHECK_CONDITION) {
 390                 cmd->i_state = ISTATE_SEND_STATUS;
 391                 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
 392                 return 0;
 393         }
 394 
 395         switch (cmd->data_direction) {
 396         case DMA_TO_DEVICE:
 397                 return iscsit_task_reassign_complete_write(cmd, tmr_req);
 398         case DMA_FROM_DEVICE:
 399                 return iscsit_task_reassign_complete_read(cmd, tmr_req);
 400         case DMA_NONE:
 401                 return iscsit_task_reassign_complete_none(cmd, tmr_req);
 402         default:
 403                 pr_err("Unknown cmd->data_direction: 0x%02x\n",
 404                                 cmd->data_direction);
 405                 return -1;
 406         }
 407 
 408         return 0;
 409 }
 410 
 411 static int iscsit_task_reassign_complete(
 412         struct iscsi_tmr_req *tmr_req,
 413         struct iscsi_conn *conn)
 414 {
 415         struct iscsi_cmd *cmd;
 416         int ret = 0;
 417 
 418         if (!tmr_req->ref_cmd) {
 419                 pr_err("TMR Request is missing a RefCmd struct iscsi_cmd.\n");
 420                 return -1;
 421         }
 422         cmd = tmr_req->ref_cmd;
 423 
 424         cmd->conn = conn;
 425 
 426         switch (cmd->iscsi_opcode) {
 427         case ISCSI_OP_NOOP_OUT:
 428                 ret = iscsit_task_reassign_complete_nop_out(tmr_req, conn);
 429                 break;
 430         case ISCSI_OP_SCSI_CMD:
 431                 ret = iscsit_task_reassign_complete_scsi_cmnd(tmr_req, conn);
 432                 break;
 433         default:
 434                  pr_err("Illegal iSCSI Opcode 0x%02x during"
 435                         " command reallegiance\n", cmd->iscsi_opcode);
 436                 return -1;
 437         }
 438 
 439         if (ret != 0)
 440                 return ret;
 441 
 442         pr_debug("Completed connection reallegiance for Opcode: 0x%02x,"
 443                 " ITT: 0x%08x to CID: %hu.\n", cmd->iscsi_opcode,
 444                         cmd->init_task_tag, conn->cid);
 445 
 446         return 0;
 447 }
 448 
 449 
 450 
 451 
 452 
 453 
 454 int iscsit_tmr_post_handler(struct iscsi_cmd *cmd, struct iscsi_conn *conn)
 455 {
 456         struct iscsi_tmr_req *tmr_req = cmd->tmr_req;
 457         struct se_tmr_req *se_tmr = cmd->se_cmd.se_tmr_req;
 458 
 459         if (tmr_req->task_reassign &&
 460            (se_tmr->response == ISCSI_TMF_RSP_COMPLETE))
 461                 return iscsit_task_reassign_complete(tmr_req, conn);
 462 
 463         return 0;
 464 }
 465 EXPORT_SYMBOL(iscsit_tmr_post_handler);
 466 
 467 
 468 
 469 
 470 static int iscsit_task_reassign_prepare_read(
 471         struct iscsi_tmr_req *tmr_req,
 472         struct iscsi_conn *conn)
 473 {
 474         return 0;
 475 }
 476 
 477 static void iscsit_task_reassign_prepare_unsolicited_dataout(
 478         struct iscsi_cmd *cmd,
 479         struct iscsi_conn *conn)
 480 {
 481         int i, j;
 482         struct iscsi_pdu *pdu = NULL;
 483         struct iscsi_seq *seq = NULL;
 484 
 485         if (conn->sess->sess_ops->DataSequenceInOrder) {
 486                 cmd->data_sn = 0;
 487 
 488                 if (cmd->immediate_data)
 489                         cmd->r2t_offset += (cmd->first_burst_len -
 490                                 cmd->seq_start_offset);
 491 
 492                 if (conn->sess->sess_ops->DataPDUInOrder) {
 493                         cmd->write_data_done -= (cmd->immediate_data) ?
 494                                                 (cmd->first_burst_len -
 495                                                  cmd->seq_start_offset) :
 496                                                  cmd->first_burst_len;
 497                         cmd->first_burst_len = 0;
 498                         return;
 499                 }
 500 
 501                 for (i = 0; i < cmd->pdu_count; i++) {
 502                         pdu = &cmd->pdu_list[i];
 503 
 504                         if (pdu->status != ISCSI_PDU_RECEIVED_OK)
 505                                 continue;
 506 
 507                         if ((pdu->offset >= cmd->seq_start_offset) &&
 508                            ((pdu->offset + pdu->length) <=
 509                              cmd->seq_end_offset)) {
 510                                 cmd->first_burst_len -= pdu->length;
 511                                 cmd->write_data_done -= pdu->length;
 512                                 pdu->status = ISCSI_PDU_NOT_RECEIVED;
 513                         }
 514                 }
 515         } else {
 516                 for (i = 0; i < cmd->seq_count; i++) {
 517                         seq = &cmd->seq_list[i];
 518 
 519                         if (seq->type != SEQTYPE_UNSOLICITED)
 520                                 continue;
 521 
 522                         cmd->write_data_done -=
 523                                         (seq->offset - seq->orig_offset);
 524                         cmd->first_burst_len = 0;
 525                         seq->data_sn = 0;
 526                         seq->offset = seq->orig_offset;
 527                         seq->next_burst_len = 0;
 528                         seq->status = DATAOUT_SEQUENCE_WITHIN_COMMAND_RECOVERY;
 529 
 530                         if (conn->sess->sess_ops->DataPDUInOrder)
 531                                 continue;
 532 
 533                         for (j = 0; j < seq->pdu_count; j++) {
 534                                 pdu = &cmd->pdu_list[j+seq->pdu_start];
 535 
 536                                 if (pdu->status != ISCSI_PDU_RECEIVED_OK)
 537                                         continue;
 538 
 539                                 pdu->status = ISCSI_PDU_NOT_RECEIVED;
 540                         }
 541                 }
 542         }
 543 }
 544 
 545 static int iscsit_task_reassign_prepare_write(
 546         struct iscsi_tmr_req *tmr_req,
 547         struct iscsi_conn *conn)
 548 {
 549         struct iscsi_cmd *cmd = tmr_req->ref_cmd;
 550         struct iscsi_pdu *pdu = NULL;
 551         struct iscsi_r2t *r2t = NULL, *r2t_tmp;
 552         int first_incomplete_r2t = 1, i = 0;
 553 
 554         
 555 
 556 
 557 
 558         if (cmd->unsolicited_data)
 559                 iscsit_task_reassign_prepare_unsolicited_dataout(cmd, conn);
 560 
 561         
 562 
 563 
 564 
 565 
 566         if (!tmr_req->exp_data_sn)
 567                 goto drop_unacknowledged_r2ts;
 568 
 569         
 570 
 571 
 572 
 573 
 574 
 575 
 576 
 577 
 578 
 579 
 580 
 581 
 582         spin_lock_bh(&cmd->r2t_lock);
 583         if (list_empty(&cmd->cmd_r2t_list)) {
 584                 spin_unlock_bh(&cmd->r2t_lock);
 585                 return -1;
 586         }
 587 
 588         list_for_each_entry(r2t, &cmd->cmd_r2t_list, r2t_list) {
 589 
 590                 if (r2t->r2t_sn >= tmr_req->exp_data_sn)
 591                         continue;
 592                 
 593 
 594 
 595 
 596                 if (r2t->seq_complete)
 597                         continue;
 598 
 599                 if (r2t->recovery_r2t)
 600                         continue;
 601 
 602                 
 603 
 604 
 605 
 606 
 607 
 608 
 609 
 610 
 611 
 612 
 613 
 614 
 615 
 616 
 617 
 618 
 619 
 620 
 621 
 622 
 623 
 624 
 625 
 626 
 627 
 628 
 629 
 630 
 631 
 632 
 633 
 634 
 635                 if (conn->sess->sess_ops->DataSequenceInOrder) {
 636                         if (!first_incomplete_r2t) {
 637                                 cmd->r2t_offset -= r2t->xfer_len;
 638                                 goto next;
 639                         }
 640 
 641                         if (conn->sess->sess_ops->DataPDUInOrder) {
 642                                 cmd->data_sn = 0;
 643                                 cmd->r2t_offset -= (r2t->xfer_len -
 644                                         cmd->next_burst_len);
 645                                 first_incomplete_r2t = 0;
 646                                 goto next;
 647                         }
 648 
 649                         cmd->data_sn = 0;
 650                         cmd->r2t_offset -= r2t->xfer_len;
 651 
 652                         for (i = 0; i < cmd->pdu_count; i++) {
 653                                 pdu = &cmd->pdu_list[i];
 654 
 655                                 if (pdu->status != ISCSI_PDU_RECEIVED_OK)
 656                                         continue;
 657 
 658                                 if ((pdu->offset >= r2t->offset) &&
 659                                     (pdu->offset < (r2t->offset +
 660                                                 r2t->xfer_len))) {
 661                                         cmd->next_burst_len -= pdu->length;
 662                                         cmd->write_data_done -= pdu->length;
 663                                         pdu->status = ISCSI_PDU_NOT_RECEIVED;
 664                                 }
 665                         }
 666 
 667                         first_incomplete_r2t = 0;
 668                 } else {
 669                         struct iscsi_seq *seq;
 670 
 671                         seq = iscsit_get_seq_holder(cmd, r2t->offset,
 672                                         r2t->xfer_len);
 673                         if (!seq) {
 674                                 spin_unlock_bh(&cmd->r2t_lock);
 675                                 return -1;
 676                         }
 677 
 678                         cmd->write_data_done -=
 679                                         (seq->offset - seq->orig_offset);
 680                         seq->data_sn = 0;
 681                         seq->offset = seq->orig_offset;
 682                         seq->next_burst_len = 0;
 683                         seq->status = DATAOUT_SEQUENCE_WITHIN_COMMAND_RECOVERY;
 684 
 685                         cmd->seq_send_order--;
 686 
 687                         if (conn->sess->sess_ops->DataPDUInOrder)
 688                                 goto next;
 689 
 690                         for (i = 0; i < seq->pdu_count; i++) {
 691                                 pdu = &cmd->pdu_list[i+seq->pdu_start];
 692 
 693                                 if (pdu->status != ISCSI_PDU_RECEIVED_OK)
 694                                         continue;
 695 
 696                                 pdu->status = ISCSI_PDU_NOT_RECEIVED;
 697                         }
 698                 }
 699 
 700 next:
 701                 cmd->outstanding_r2ts--;
 702         }
 703         spin_unlock_bh(&cmd->r2t_lock);
 704 
 705         
 706 
 707 
 708 
 709 
 710 
 711 
 712 
 713 
 714 
 715 drop_unacknowledged_r2ts:
 716 
 717         cmd->cmd_flags &= ~ICF_SENT_LAST_R2T;
 718         cmd->r2t_sn = tmr_req->exp_data_sn;
 719 
 720         spin_lock_bh(&cmd->r2t_lock);
 721         list_for_each_entry_safe(r2t, r2t_tmp, &cmd->cmd_r2t_list, r2t_list) {
 722                 
 723 
 724 
 725 
 726                 if (r2t->r2t_sn < tmr_req->exp_data_sn)
 727                         continue;
 728 
 729                 if (r2t->seq_complete) {
 730                         pr_err("Initiator is requesting R2Ts from"
 731                                 " R2TSN: 0x%08x, but R2TSN: 0x%08x, Offset: %u,"
 732                                 " Length: %u is already complete."
 733                                 "   BAD INITIATOR ERL=2 IMPLEMENTATION!\n",
 734                                 tmr_req->exp_data_sn, r2t->r2t_sn,
 735                                 r2t->offset, r2t->xfer_len);
 736                         spin_unlock_bh(&cmd->r2t_lock);
 737                         return -1;
 738                 }
 739 
 740                 if (r2t->recovery_r2t) {
 741                         iscsit_free_r2t(r2t, cmd);
 742                         continue;
 743                 }
 744 
 745                 
 746 
 747 
 748 
 749 
 750 
 751 
 752 
 753 
 754 
 755 
 756 
 757 
 758 
 759 
 760 
 761                 if (conn->sess->sess_ops->DataSequenceInOrder)
 762                         cmd->r2t_offset -= r2t->xfer_len;
 763                 else
 764                         cmd->seq_send_order--;
 765 
 766                 cmd->outstanding_r2ts--;
 767                 iscsit_free_r2t(r2t, cmd);
 768         }
 769         spin_unlock_bh(&cmd->r2t_lock);
 770 
 771         return 0;
 772 }
 773 
 774 
 775 
 776 
 777 
 778 int iscsit_check_task_reassign_expdatasn(
 779         struct iscsi_tmr_req *tmr_req,
 780         struct iscsi_conn *conn)
 781 {
 782         struct iscsi_cmd *ref_cmd = tmr_req->ref_cmd;
 783 
 784         if (ref_cmd->iscsi_opcode != ISCSI_OP_SCSI_CMD)
 785                 return 0;
 786 
 787         if (ref_cmd->se_cmd.se_cmd_flags & SCF_SENT_CHECK_CONDITION)
 788                 return 0;
 789 
 790         if (ref_cmd->data_direction == DMA_NONE)
 791                 return 0;
 792 
 793         
 794 
 795 
 796 
 797 
 798 
 799 
 800         if (ref_cmd->data_direction == DMA_FROM_DEVICE) {
 801                 if (tmr_req->exp_data_sn > ref_cmd->data_sn) {
 802                         pr_err("Received ExpDataSN: 0x%08x for READ"
 803                                 " in TMR TASK_REASSIGN greater than command's"
 804                                 " DataSN: 0x%08x.\n", tmr_req->exp_data_sn,
 805                                 ref_cmd->data_sn);
 806                         return -1;
 807                 }
 808                 if ((ref_cmd->cmd_flags & ICF_GOT_DATACK_SNACK) &&
 809                     (tmr_req->exp_data_sn <= ref_cmd->acked_data_sn)) {
 810                         pr_err("Received ExpDataSN: 0x%08x for READ"
 811                                 " in TMR TASK_REASSIGN for previously"
 812                                 " acknowledged DataIN: 0x%08x,"
 813                                 " protocol error\n", tmr_req->exp_data_sn,
 814                                 ref_cmd->acked_data_sn);
 815                         return -1;
 816                 }
 817                 return iscsit_task_reassign_prepare_read(tmr_req, conn);
 818         }
 819 
 820         
 821 
 822 
 823 
 824 
 825 
 826         if (ref_cmd->data_direction == DMA_TO_DEVICE) {
 827                 if (tmr_req->exp_data_sn > ref_cmd->r2t_sn) {
 828                         pr_err("Received ExpDataSN: 0x%08x for WRITE"
 829                                 " in TMR TASK_REASSIGN greater than command's"
 830                                 " R2TSN: 0x%08x.\n", tmr_req->exp_data_sn,
 831                                         ref_cmd->r2t_sn);
 832                         return -1;
 833                 }
 834                 return iscsit_task_reassign_prepare_write(tmr_req, conn);
 835         }
 836 
 837         pr_err("Unknown iSCSI data_direction: 0x%02x\n",
 838                         ref_cmd->data_direction);
 839 
 840         return -1;
 841 }