iscsi: move iSCSI-specific SenseLength into PDU
This removes the 2 bytes of SenseLength from the beginning of the SCSI sense_data buffer, so now the offsets within sense.data match up to the expected values from the SCSI spec. Change-Id: I9188560096a9ec5a8fcf83bec95201521b127494 Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
fcb00f3780
commit
cc1146a8b5
@ -914,6 +914,7 @@ void process_task_completion(spdk_event_t event)
|
|||||||
(task->scsi.status != SPDK_SCSI_STATUS_GOOD)) {
|
(task->scsi.status != SPDK_SCSI_STATUS_GOOD)) {
|
||||||
memcpy(primary->scsi.sense_data, task->scsi.sense_data,
|
memcpy(primary->scsi.sense_data, task->scsi.sense_data,
|
||||||
task->scsi.sense_data_len);
|
task->scsi.sense_data_len);
|
||||||
|
primary->scsi.sense_data_len = task->scsi.sense_data_len;
|
||||||
primary->scsi.status = task->scsi.status;
|
primary->scsi.status = task->scsi.status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3131,7 +3131,10 @@ void spdk_iscsi_task_response(struct spdk_iscsi_conn *conn,
|
|||||||
/* response PDU */
|
/* response PDU */
|
||||||
rsp_pdu = spdk_get_pdu();
|
rsp_pdu = spdk_get_pdu();
|
||||||
rsph = (struct iscsi_bhs_scsi_resp *)&rsp_pdu->bhs;
|
rsph = (struct iscsi_bhs_scsi_resp *)&rsp_pdu->bhs;
|
||||||
rsp_pdu->data = task->scsi.sense_data;
|
assert(task->scsi.sense_data_len <= sizeof(rsp_pdu->sense.data));
|
||||||
|
memcpy(rsp_pdu->sense.data, task->scsi.sense_data, task->scsi.sense_data_len);
|
||||||
|
to_be16(&rsp_pdu->sense.length, task->scsi.sense_data_len);
|
||||||
|
rsp_pdu->data = (uint8_t *)&rsp_pdu->sense;
|
||||||
rsp_pdu->data_from_mempool = true;
|
rsp_pdu->data_from_mempool = true;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -3157,7 +3160,10 @@ void spdk_iscsi_task_response(struct spdk_iscsi_conn *conn,
|
|||||||
rsph->flags |= ISCSI_SCSI_UNDERFLOW;
|
rsph->flags |= ISCSI_SCSI_UNDERFLOW;
|
||||||
|
|
||||||
rsph->status = task->scsi.status;
|
rsph->status = task->scsi.status;
|
||||||
DSET24(rsph->data_segment_len, task->scsi.sense_data_len);
|
if (task->scsi.sense_data_len) {
|
||||||
|
/* SenseLength (2 bytes) + SenseData */
|
||||||
|
DSET24(rsph->data_segment_len, 2 + task->scsi.sense_data_len);
|
||||||
|
}
|
||||||
to_be32(&rsph->itt, task_tag);
|
to_be32(&rsph->itt, task_tag);
|
||||||
|
|
||||||
to_be32(&rsph->stat_sn, conn->StatSN);
|
to_be32(&rsph->stat_sn, conn->StatSN);
|
||||||
|
@ -183,6 +183,11 @@ struct spdk_iscsi_pdu {
|
|||||||
* we need to not zero this out when doing memory clear.
|
* we need to not zero this out when doing memory clear.
|
||||||
*/
|
*/
|
||||||
uint8_t ahs_data[ISCSI_AHS_LEN];
|
uint8_t ahs_data[ISCSI_AHS_LEN];
|
||||||
|
|
||||||
|
struct {
|
||||||
|
uint16_t length; /* iSCSI SenseLength (big-endian) */
|
||||||
|
uint8_t data[32];
|
||||||
|
} sense;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum iscsi_connection_state {
|
enum iscsi_connection_state {
|
||||||
|
@ -515,7 +515,7 @@ struct spdk_iscsi_pdu *spdk_get_pdu(void)
|
|||||||
rte_panic("no memory\n");
|
rte_panic("no memory\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we do not want to zero out the last 60 bytes reserved for AHS */
|
/* we do not want to zero out the last part of the structure reserved for AHS and sense data */
|
||||||
memset(pdu, 0, offsetof(struct spdk_iscsi_pdu, ahs_data));
|
memset(pdu, 0, offsetof(struct spdk_iscsi_pdu, ahs_data));
|
||||||
pdu->ref = 1;
|
pdu->ref = 1;
|
||||||
|
|
||||||
|
@ -1841,9 +1841,8 @@ spdk_bdev_scsi_process_primary(struct spdk_bdev *bdev,
|
|||||||
|
|
||||||
spdk_scsi_task_build_sense_data(task, sk, asc, ascq);
|
spdk_scsi_task_build_sense_data(task, sk, asc, ascq);
|
||||||
|
|
||||||
/* omit SenseLength */
|
data_len = task->sense_data_len;
|
||||||
data_len = task->sense_data_len - 2;
|
memcpy(data, task->sense_data, data_len);
|
||||||
memcpy(data, &task->sense_data[2], data_len);
|
|
||||||
task->data_transferred = (uint64_t)data_len;
|
task->data_transferred = (uint64_t)data_len;
|
||||||
task->status = SPDK_SCSI_STATUS_GOOD;
|
task->status = SPDK_SCSI_STATUS_GOOD;
|
||||||
break;
|
break;
|
||||||
|
@ -133,18 +133,13 @@ spdk_scsi_task_alloc_data(struct spdk_scsi_task *task, uint32_t alloc_len,
|
|||||||
void
|
void
|
||||||
spdk_scsi_task_build_sense_data(struct spdk_scsi_task *task, int sk, int asc, int ascq)
|
spdk_scsi_task_build_sense_data(struct spdk_scsi_task *task, int sk, int asc, int ascq)
|
||||||
{
|
{
|
||||||
uint8_t *data;
|
|
||||||
uint8_t *cp;
|
uint8_t *cp;
|
||||||
int resp_code;
|
int resp_code;
|
||||||
|
|
||||||
data = task->sense_data;
|
|
||||||
resp_code = 0x70; /* Current + Fixed format */
|
resp_code = 0x70; /* Current + Fixed format */
|
||||||
|
|
||||||
/* SenseLength */
|
|
||||||
memset(data, 0, 2);
|
|
||||||
|
|
||||||
/* Sense Data */
|
/* Sense Data */
|
||||||
cp = &data[2];
|
cp = task->sense_data;
|
||||||
|
|
||||||
/* VALID(7) RESPONSE CODE(6-0) */
|
/* VALID(7) RESPONSE CODE(6-0) */
|
||||||
cp[0] = 0x80 | resp_code;
|
cp[0] = 0x80 | resp_code;
|
||||||
@ -173,8 +168,7 @@ spdk_scsi_task_build_sense_data(struct spdk_scsi_task *task, int sk, int asc, in
|
|||||||
cp[17] = 0;
|
cp[17] = 0;
|
||||||
|
|
||||||
/* SenseLength */
|
/* SenseLength */
|
||||||
to_be16(data, 18);
|
task->sense_data_len = 18;
|
||||||
task->sense_data_len = 20;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -76,18 +76,13 @@ spdk_scsi_task_alloc_data(struct spdk_scsi_task *task, uint32_t alloc_len,
|
|||||||
void
|
void
|
||||||
spdk_scsi_task_build_sense_data(struct spdk_scsi_task *task, int sk, int asc, int ascq)
|
spdk_scsi_task_build_sense_data(struct spdk_scsi_task *task, int sk, int asc, int ascq)
|
||||||
{
|
{
|
||||||
uint8_t *data;
|
|
||||||
uint8_t *cp;
|
uint8_t *cp;
|
||||||
int resp_code;
|
int resp_code;
|
||||||
|
|
||||||
data = task->sense_data;
|
|
||||||
resp_code = 0x70; /* Current + Fixed format */
|
resp_code = 0x70; /* Current + Fixed format */
|
||||||
|
|
||||||
/* SenseLength */
|
|
||||||
memset(data, 0, 2);
|
|
||||||
|
|
||||||
/* Sense Data */
|
/* Sense Data */
|
||||||
cp = &data[2];
|
cp = task->sense_data;
|
||||||
|
|
||||||
/* VALID(7) RESPONSE CODE(6-0) */
|
/* VALID(7) RESPONSE CODE(6-0) */
|
||||||
cp[0] = 0x80 | resp_code;
|
cp[0] = 0x80 | resp_code;
|
||||||
@ -116,8 +111,7 @@ spdk_scsi_task_build_sense_data(struct spdk_scsi_task *task, int sk, int asc, in
|
|||||||
cp[17] = 0;
|
cp[17] = 0;
|
||||||
|
|
||||||
/* SenseLength */
|
/* SenseLength */
|
||||||
to_be16(data, 18);
|
task->sense_data_len = 18;
|
||||||
task->sense_data_len = 20;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -370,9 +364,9 @@ inquiry_evpd_test(void)
|
|||||||
rc = spdk_bdev_scsi_execute(&bdev, &task);
|
rc = spdk_bdev_scsi_execute(&bdev, &task);
|
||||||
|
|
||||||
CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_CHECK_CONDITION);
|
CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_CHECK_CONDITION);
|
||||||
CU_ASSERT_EQUAL(task.sense_data[4], (SPDK_SCSI_SENSE_ILLEGAL_REQUEST & 0xf));
|
CU_ASSERT_EQUAL(task.sense_data[2] & 0xf, SPDK_SCSI_SENSE_ILLEGAL_REQUEST);
|
||||||
CU_ASSERT_EQUAL(task.sense_data[14], 0x24);
|
CU_ASSERT_EQUAL(task.sense_data[12], 0x24);
|
||||||
CU_ASSERT_EQUAL(task.sense_data[15], 0x0);
|
CU_ASSERT_EQUAL(task.sense_data[13], 0x0);
|
||||||
CU_ASSERT_EQUAL(rc, 0);
|
CU_ASSERT_EQUAL(rc, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -492,9 +486,9 @@ task_complete_test(void)
|
|||||||
bdev_io.status = SPDK_BDEV_IO_STATUS_FAILED;
|
bdev_io.status = SPDK_BDEV_IO_STATUS_FAILED;
|
||||||
spdk_bdev_scsi_task_complete(&event);
|
spdk_bdev_scsi_task_complete(&event);
|
||||||
CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_CHECK_CONDITION);
|
CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_CHECK_CONDITION);
|
||||||
CU_ASSERT_EQUAL(task.sense_data[4], SPDK_SCSI_SENSE_ABORTED_COMMAND);
|
CU_ASSERT_EQUAL(task.sense_data[2], SPDK_SCSI_SENSE_ABORTED_COMMAND);
|
||||||
CU_ASSERT_EQUAL(task.sense_data[14], SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE);
|
CU_ASSERT_EQUAL(task.sense_data[12], SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE);
|
||||||
CU_ASSERT_EQUAL(task.sense_data[15], SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
|
CU_ASSERT_EQUAL(task.sense_data[13], SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
Loading…
Reference in New Issue
Block a user