From b3a3e78a86677d2591d16f8d0177d75da65ed7bc Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Mon, 22 Feb 2021 13:06:21 +0900 Subject: [PATCH] lib/iscsi: Track current offset of large write I/O to submit subtasks using current_data_offset Use current_data_offset of task to track the current offset of large write I/O by following the last patch. Signed-off-by: Shuhei Matsumoto Change-Id: Iec3a371c6050fe11478b6f158259d8f4013f5238 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6424 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Changpeng Liu --- lib/iscsi/iscsi.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/iscsi/iscsi.c b/lib/iscsi/iscsi.c index 0ab60a6a2..9b8fa1e46 100644 --- a/lib/iscsi/iscsi.c +++ b/lib/iscsi/iscsi.c @@ -2764,6 +2764,7 @@ add_transfer_task(struct spdk_iscsi_conn *conn, struct spdk_iscsi_task *task) conn->pending_r2t++; task->next_expected_r2t_offset = data_len; + task->current_data_offset = data_len; task->current_r2t_length = 0; task->R2TSN = 0; /* According to RFC3720 10.8.5, 0xffffffff is @@ -2853,6 +2854,7 @@ void iscsi_clear_all_transfer_task(struct spdk_iscsi_conn *conn, task->outstanding_r2t = 0; task->next_r2t_offset = 0; task->next_expected_r2t_offset = 0; + task->current_data_offset = 0; assert(conn->data_out_cnt >= task->data_out_cnt); conn->data_out_cnt -= task->data_out_cnt; assert(conn->pending_r2t > 0); @@ -4275,11 +4277,9 @@ iscsi_pdu_payload_op_data(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *p struct iscsi_bhs_data_out *reqh; struct spdk_mobj *mobj; uint32_t transfer_tag; - uint32_t buffer_offset; reqh = (struct iscsi_bhs_data_out *)&pdu->bhs; transfer_tag = from_be32(&reqh->ttt); - buffer_offset = from_be32(&reqh->buffer_offset); task = get_transfer_task(conn, transfer_tag); if (spdk_unlikely(task == NULL)) { @@ -4301,10 +4301,12 @@ iscsi_pdu_payload_op_data(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu *p SPDK_ERRLOG("Unable to acquire subtask\n"); return SPDK_ISCSI_CONNECTION_FATAL; } - subtask->scsi.offset = buffer_offset; + subtask->scsi.offset = task->current_data_offset; subtask->scsi.length = mobj->data_len; iscsi_task_associate_pdu(subtask, pdu); + task->current_data_offset += mobj->data_len; + if (spdk_likely(!pdu->dif_insert_or_strip)) { spdk_scsi_task_set_data(&subtask->scsi, mobj->buf, mobj->data_len); } else {