iscsi: fix the large read handling logic
My previous pdu leak fixing patch breaks the large logic for large read, and this patch fixes this. Change-Id: Ic3f654527f7addd4ee45aad53a752de72a84edfd Signed-off-by: Ziye Yang <ziye.yang@intel.com>
This commit is contained in:
parent
ac6e76991d
commit
f5794d088e
@ -828,7 +828,11 @@ process_read_task_completion(struct spdk_iscsi_conn *conn,
|
|||||||
|
|
||||||
primary->scsi.bytes_completed += task->scsi.length;
|
primary->scsi.bytes_completed += task->scsi.length;
|
||||||
spdk_iscsi_task_response(conn, task);
|
spdk_iscsi_task_response(conn, task);
|
||||||
spdk_iscsi_task_put(task);
|
|
||||||
|
if ((task != primary) ||
|
||||||
|
(task->scsi.transfer_len == task->scsi.length)) {
|
||||||
|
spdk_iscsi_task_put(task);
|
||||||
|
}
|
||||||
process_completed_read_subtask_list(conn, primary);
|
process_completed_read_subtask_list(conn, primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1030,14 +1034,18 @@ spdk_iscsi_conn_flush_pdus_internal(struct spdk_iscsi_conn *conn)
|
|||||||
tailq);
|
tailq);
|
||||||
} else {
|
} else {
|
||||||
if (pdu->task) {
|
if (pdu->task) {
|
||||||
uint64_t offset = pdu->task->scsi.offset;
|
if (pdu->bhs.opcode == ISCSI_OP_SCSI_DATAIN) {
|
||||||
spdk_iscsi_task_put(pdu->task);
|
if (pdu->task->scsi.offset > 0) {
|
||||||
|
conn->data_in_cnt--;
|
||||||
|
if (pdu->bhs.flags & ISCSI_DATAIN_STATUS) {
|
||||||
|
spdk_iscsi_task_put(spdk_iscsi_task_get_primary(pdu->task));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((pdu->bhs.opcode == ISCSI_OP_SCSI_DATAIN) &&
|
|
||||||
(offset > 0)) {
|
|
||||||
conn->data_in_cnt--;
|
|
||||||
spdk_iscsi_conn_handle_queued_datain(conn);
|
spdk_iscsi_conn_handle_queued_datain(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spdk_iscsi_task_put(pdu->task);
|
||||||
}
|
}
|
||||||
spdk_put_pdu(pdu);
|
spdk_put_pdu(pdu);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user