Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions usr/iscsi/iscsid.c
Original file line number Diff line number Diff line change
Expand Up @@ -1108,7 +1108,7 @@ static int iscsi_data_rsp_build(struct iscsi_task *task)
{
struct iscsi_connection *conn = task->conn;
struct iscsi_data_rsp *rsp = (struct iscsi_data_rsp *) &conn->rsp.bhs;
int datalen, maxdatalen;
uint32_t datalen, maxdatalen;
int result = scsi_get_result(&task->scmd);

memset(rsp, 0, sizeof(*rsp));
Expand All @@ -1123,7 +1123,7 @@ static int iscsi_data_rsp_build(struct iscsi_task *task)

maxdatalen = conn->tp->rdma ?
conn->session_param[ISCSI_PARAM_MAX_BURST].val :
conn->session_param[ISCSI_PARAM_MAX_XMIT_DLENGTH].val;
min_t(uint32_t, conn->session_param[ISCSI_PARAM_MAX_XMIT_DLENGTH].val, conn->session_param[ISCSI_PARAM_MAX_BURST].val - scsi_get_in_sequence_len(&task->scmd));

dprintf("%d %d %d %" PRIu32 "%x\n", datalen,
scsi_get_in_transfer_len(&task->scmd), task->offset, maxdatalen,
Expand All @@ -1141,8 +1141,18 @@ static int iscsi_data_rsp_build(struct iscsi_task *task)
rsp->statsn = cpu_to_be32(conn->stat_sn++);
iscsi_set_data_rsp_residual(rsp, &task->scmd);
}
} else
}
else
{
datalen = maxdatalen;
scsi_set_in_sequence_len(&task->scmd, scsi_get_in_sequence_len(&task->scmd) + datalen);
if (scsi_get_in_sequence_len(&task->scmd) == conn->session_param[ISCSI_PARAM_MAX_BURST].val)
{
scsi_set_in_sequence_len(&task->scmd, 0);
rsp->flags = ISCSI_FLAG_CMD_FINAL;
}
rsp->statsn = cpu_to_be32(ISCSI_RESERVED_TAG);
}

rsp->exp_cmdsn = cpu_to_be32(conn->session->exp_cmd_sn);
rsp->max_cmdsn = cpu_to_be32(conn->session->exp_cmd_sn +
Expand Down
2 changes: 2 additions & 0 deletions usr/scsi_cmnd.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ struct scsi_data_buffer {
uint64_t buffer;
uint32_t length;
uint32_t transfer_len;
uint32_t sequence_len;
int32_t resid;
};

Expand Down Expand Up @@ -83,6 +84,7 @@ static inline type scsi_get_##dir##_##field(struct scsi_cmd *scmd) \

scsi_data_buffer_accessor(length, uint32_t, ,);
scsi_data_buffer_accessor(transfer_len, uint32_t, ,);
scsi_data_buffer_accessor(sequence_len, uint32_t, , );
scsi_data_buffer_accessor(resid, int32_t, ,);
scsi_data_buffer_accessor(buffer, void *, (unsigned long), (void *)(unsigned long));

Expand Down