nvme/opal: don't use ComPacket header to check level 0 discovery response

According to the TCG Storage Core Architecture V2.0, the level 0 discovery
response should use level 0 discovery header and feature descriptors to
retrieve the response data buffer.  ComPacket header should be used in upper
layer.

Change-Id: I61e3e206801994b276608f9afbda800eccb2cffa
Signed-off-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1124
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Changpeng Liu 2020-03-04 17:50:42 +08:00 committed by Tomasz Zawadzki
parent c61b70c3d5
commit fbfb3aca28

View File

@ -81,6 +81,13 @@ opal_send_cmd(struct spdk_opal_dev *dev)
static int
opal_recv_cmd(struct spdk_opal_dev *dev)
{
return spdk_nvme_ctrlr_security_receive(dev->ctrlr, SPDK_SCSI_SECP_TCG, dev->comid,
0, dev->resp, IO_BUFFER_LENGTH);
}
static int
opal_recv_check(struct spdk_opal_dev *dev)
{
void *response = dev->resp;
struct spdk_opal_compacket *header = response;
@ -89,12 +96,6 @@ opal_recv_cmd(struct spdk_opal_dev *dev)
uint64_t now;
do {
ret = spdk_nvme_ctrlr_security_receive(dev->ctrlr, SPDK_SCSI_SECP_TCG, dev->comid,
0, dev->resp, IO_BUFFER_LENGTH);
if (ret) {
SPDK_ERRLOG("Security Receive Error on dev = %p\n", dev);
return ret;
}
SPDK_DEBUGLOG(SPDK_LOG_OPAL, "outstanding_data=%d, minTransfer=%d\n",
header->outstanding_data,
header->min_transfer);
@ -111,6 +112,12 @@ opal_recv_cmd(struct spdk_opal_dev *dev)
}
memset(response, 0, IO_BUFFER_LENGTH);
ret = spdk_nvme_ctrlr_security_receive(dev->ctrlr, SPDK_SCSI_SECP_TCG, dev->comid,
0, dev->resp, IO_BUFFER_LENGTH);
if (ret) {
SPDK_ERRLOG("Security Receive Error on dev = %p\n", dev);
return ret;
}
} while (!ret);
return ret;
@ -130,10 +137,17 @@ opal_send_recv(struct spdk_opal_dev *dev, spdk_opal_cb cb, void *data)
if (ret) {
return ret;
}
ret = opal_recv_cmd(dev);
if (ret) {
return ret;
}
ret = opal_recv_check(dev);
if (ret) {
return ret;
}
return cb(dev, data);
}