diff options
Diffstat (limited to 'drivers/scsi/libiscsi_tcp.c')
-rw-r--r-- | drivers/scsi/libiscsi_tcp.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/drivers/scsi/libiscsi_tcp.c b/drivers/scsi/libiscsi_tcp.c index b579ca9f4836..2e0746d70303 100644 --- a/drivers/scsi/libiscsi_tcp.c +++ b/drivers/scsi/libiscsi_tcp.c | |||
@@ -440,8 +440,8 @@ void iscsi_tcp_cleanup_task(struct iscsi_task *task) | |||
440 | struct iscsi_tcp_task *tcp_task = task->dd_data; | 440 | struct iscsi_tcp_task *tcp_task = task->dd_data; |
441 | struct iscsi_r2t_info *r2t; | 441 | struct iscsi_r2t_info *r2t; |
442 | 442 | ||
443 | /* nothing to do for mgmt or pending tasks */ | 443 | /* nothing to do for mgmt */ |
444 | if (!task->sc || task->state == ISCSI_TASK_PENDING) | 444 | if (!task->sc) |
445 | return; | 445 | return; |
446 | 446 | ||
447 | /* flush task's r2t queues */ | 447 | /* flush task's r2t queues */ |
@@ -473,7 +473,13 @@ static int iscsi_tcp_data_in(struct iscsi_conn *conn, struct iscsi_task *task) | |||
473 | int datasn = be32_to_cpu(rhdr->datasn); | 473 | int datasn = be32_to_cpu(rhdr->datasn); |
474 | unsigned total_in_length = scsi_in(task->sc)->length; | 474 | unsigned total_in_length = scsi_in(task->sc)->length; |
475 | 475 | ||
476 | iscsi_update_cmdsn(conn->session, (struct iscsi_nopin*)rhdr); | 476 | /* |
477 | * lib iscsi will update this in the completion handling if there | ||
478 | * is status. | ||
479 | */ | ||
480 | if (!(rhdr->flags & ISCSI_FLAG_DATA_STATUS)) | ||
481 | iscsi_update_cmdsn(conn->session, (struct iscsi_nopin*)rhdr); | ||
482 | |||
477 | if (tcp_conn->in.datalen == 0) | 483 | if (tcp_conn->in.datalen == 0) |
478 | return 0; | 484 | return 0; |
479 | 485 | ||
@@ -680,6 +686,7 @@ iscsi_tcp_hdr_dissect(struct iscsi_conn *conn, struct iscsi_hdr *hdr) | |||
680 | "offset=%d, datalen=%d)\n", | 686 | "offset=%d, datalen=%d)\n", |
681 | tcp_task->data_offset, | 687 | tcp_task->data_offset, |
682 | tcp_conn->in.datalen); | 688 | tcp_conn->in.datalen); |
689 | task->last_xfer = jiffies; | ||
683 | rc = iscsi_segment_seek_sg(&tcp_conn->in.segment, | 690 | rc = iscsi_segment_seek_sg(&tcp_conn->in.segment, |
684 | sdb->table.sgl, | 691 | sdb->table.sgl, |
685 | sdb->table.nents, | 692 | sdb->table.nents, |
@@ -707,9 +714,10 @@ iscsi_tcp_hdr_dissect(struct iscsi_conn *conn, struct iscsi_hdr *hdr) | |||
707 | rc = ISCSI_ERR_BAD_ITT; | 714 | rc = ISCSI_ERR_BAD_ITT; |
708 | else if (ahslen) | 715 | else if (ahslen) |
709 | rc = ISCSI_ERR_AHSLEN; | 716 | rc = ISCSI_ERR_AHSLEN; |
710 | else if (task->sc->sc_data_direction == DMA_TO_DEVICE) | 717 | else if (task->sc->sc_data_direction == DMA_TO_DEVICE) { |
718 | task->last_xfer = jiffies; | ||
711 | rc = iscsi_tcp_r2t_rsp(conn, task); | 719 | rc = iscsi_tcp_r2t_rsp(conn, task); |
712 | else | 720 | } else |
713 | rc = ISCSI_ERR_PROTO; | 721 | rc = ISCSI_ERR_PROTO; |
714 | spin_unlock(&conn->session->lock); | 722 | spin_unlock(&conn->session->lock); |
715 | break; | 723 | break; |
@@ -857,6 +865,12 @@ int iscsi_tcp_recv_skb(struct iscsi_conn *conn, struct sk_buff *skb, | |||
857 | int rc = 0; | 865 | int rc = 0; |
858 | 866 | ||
859 | ISCSI_DBG_TCP(conn, "in %d bytes\n", skb->len - offset); | 867 | ISCSI_DBG_TCP(conn, "in %d bytes\n", skb->len - offset); |
868 | /* | ||
869 | * Update for each skb instead of pdu, because over slow networks a | ||
870 | * data_in's data could take a while to read in. We also want to | ||
871 | * account for r2ts. | ||
872 | */ | ||
873 | conn->last_recv = jiffies; | ||
860 | 874 | ||
861 | if (unlikely(conn->suspend_rx)) { | 875 | if (unlikely(conn->suspend_rx)) { |
862 | ISCSI_DBG_TCP(conn, "Rx suspended!\n"); | 876 | ISCSI_DBG_TCP(conn, "Rx suspended!\n"); |