Commit 94795b61e84994a3b058f92d041d1fb3d869c7d5
Committed by
James Bottomley
1 parent
c07d444407
Exists in
master
and in
7 other branches
[SCSI] iscsi: bidi support for iscsi_tcp
access the right scsi_in() and/or scsi_out() side of things. also for resid Signed-off-by: Boaz Harrosh <bharrosh@panasas.com> Reviewed-by: Pete Wyckoff <pw@osc.edu> Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Showing 1 changed file with 17 additions and 14 deletions Side-by-side Diff
drivers/scsi/iscsi_tcp.c
... | ... | @@ -528,6 +528,7 @@ |
528 | 528 | struct iscsi_session *session = conn->session; |
529 | 529 | struct scsi_cmnd *sc = ctask->sc; |
530 | 530 | int datasn = be32_to_cpu(rhdr->datasn); |
531 | + unsigned total_in_length = scsi_in(sc)->length; | |
531 | 532 | |
532 | 533 | iscsi_update_cmdsn(session, (struct iscsi_nopin*)rhdr); |
533 | 534 | if (tcp_conn->in.datalen == 0) |
534 | 535 | |
... | ... | @@ -542,10 +543,10 @@ |
542 | 543 | tcp_ctask->exp_datasn++; |
543 | 544 | |
544 | 545 | tcp_ctask->data_offset = be32_to_cpu(rhdr->offset); |
545 | - if (tcp_ctask->data_offset + tcp_conn->in.datalen > scsi_bufflen(sc)) { | |
546 | + if (tcp_ctask->data_offset + tcp_conn->in.datalen > total_in_length) { | |
546 | 547 | debug_tcp("%s: data_offset(%d) + data_len(%d) > total_length_in(%d)\n", |
547 | 548 | __FUNCTION__, tcp_ctask->data_offset, |
548 | - tcp_conn->in.datalen, scsi_bufflen(sc)); | |
549 | + tcp_conn->in.datalen, total_in_length); | |
549 | 550 | return ISCSI_ERR_DATA_OFFSET; |
550 | 551 | } |
551 | 552 | |
... | ... | @@ -558,8 +559,8 @@ |
558 | 559 | |
559 | 560 | if (res_count > 0 && |
560 | 561 | (rhdr->flags & ISCSI_FLAG_CMD_OVERFLOW || |
561 | - res_count <= scsi_bufflen(sc))) | |
562 | - scsi_set_resid(sc, res_count); | |
562 | + res_count <= total_in_length)) | |
563 | + scsi_in(sc)->resid = res_count; | |
563 | 564 | else |
564 | 565 | sc->result = (DID_BAD_TARGET << 16) | |
565 | 566 | rhdr->cmd_status; |
566 | 567 | |
... | ... | @@ -670,11 +671,11 @@ |
670 | 671 | r2t->data_length, session->max_burst); |
671 | 672 | |
672 | 673 | r2t->data_offset = be32_to_cpu(rhdr->data_offset); |
673 | - if (r2t->data_offset + r2t->data_length > scsi_bufflen(ctask->sc)) { | |
674 | + if (r2t->data_offset + r2t->data_length > scsi_out(ctask->sc)->length) { | |
674 | 675 | iscsi_conn_printk(KERN_ERR, conn, |
675 | 676 | "invalid R2T with data len %u at offset %u " |
676 | 677 | "and total length %d\n", r2t->data_length, |
677 | - r2t->data_offset, scsi_bufflen(ctask->sc)); | |
678 | + r2t->data_offset, scsi_out(ctask->sc)->length); | |
678 | 679 | __kfifo_put(tcp_ctask->r2tpool.queue, (void*)&r2t, |
679 | 680 | sizeof(void*)); |
680 | 681 | return ISCSI_ERR_DATALEN; |
... | ... | @@ -771,6 +772,7 @@ |
771 | 772 | if (tcp_conn->in.datalen) { |
772 | 773 | struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; |
773 | 774 | struct hash_desc *rx_hash = NULL; |
775 | + struct scsi_data_buffer *sdb = scsi_in(ctask->sc); | |
774 | 776 | |
775 | 777 | /* |
776 | 778 | * Setup copy of Data-In into the Scsi_Cmnd |
... | ... | @@ -788,8 +790,8 @@ |
788 | 790 | tcp_ctask->data_offset, |
789 | 791 | tcp_conn->in.datalen); |
790 | 792 | return iscsi_segment_seek_sg(&tcp_conn->in.segment, |
791 | - scsi_sglist(ctask->sc), | |
792 | - scsi_sg_count(ctask->sc), | |
793 | + sdb->table.sgl, | |
794 | + sdb->table.nents, | |
793 | 795 | tcp_ctask->data_offset, |
794 | 796 | tcp_conn->in.datalen, |
795 | 797 | iscsi_tcp_process_data_in, |
... | ... | @@ -1332,7 +1334,8 @@ |
1332 | 1334 | return 0; |
1333 | 1335 | |
1334 | 1336 | /* If we have immediate data, attach a payload */ |
1335 | - err = iscsi_tcp_send_data_prep(conn, scsi_sglist(sc), scsi_sg_count(sc), | |
1337 | + err = iscsi_tcp_send_data_prep(conn, scsi_out(sc)->table.sgl, | |
1338 | + scsi_out(sc)->table.nents, | |
1336 | 1339 | 0, ctask->imm_count); |
1337 | 1340 | if (err) |
1338 | 1341 | return err; |
... | ... | @@ -1386,6 +1389,7 @@ |
1386 | 1389 | { |
1387 | 1390 | struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; |
1388 | 1391 | struct scsi_cmnd *sc = ctask->sc; |
1392 | + struct scsi_data_buffer *sdb = scsi_out(sc); | |
1389 | 1393 | int rc = 0; |
1390 | 1394 | |
1391 | 1395 | flush: |
... | ... | @@ -1412,9 +1416,8 @@ |
1412 | 1416 | ctask->itt, tcp_ctask->sent, ctask->data_count); |
1413 | 1417 | |
1414 | 1418 | iscsi_tcp_send_hdr_prep(conn, hdr, sizeof(*hdr)); |
1415 | - rc = iscsi_tcp_send_data_prep(conn, scsi_sglist(sc), | |
1416 | - scsi_sg_count(sc), | |
1417 | - tcp_ctask->sent, | |
1419 | + rc = iscsi_tcp_send_data_prep(conn, sdb->table.sgl, | |
1420 | + sdb->table.nents, tcp_ctask->sent, | |
1418 | 1421 | ctask->data_count); |
1419 | 1422 | if (rc) |
1420 | 1423 | goto fail; |
... | ... | @@ -1460,8 +1463,8 @@ |
1460 | 1463 | iscsi_tcp_send_hdr_prep(conn, &r2t->dtask.hdr, |
1461 | 1464 | sizeof(struct iscsi_hdr)); |
1462 | 1465 | |
1463 | - rc = iscsi_tcp_send_data_prep(conn, scsi_sglist(sc), | |
1464 | - scsi_sg_count(sc), | |
1466 | + rc = iscsi_tcp_send_data_prep(conn, sdb->table.sgl, | |
1467 | + sdb->table.nents, | |
1465 | 1468 | r2t->data_offset + r2t->sent, |
1466 | 1469 | r2t->data_count); |
1467 | 1470 | if (rc) |