nvmf: Add spdk_nvmf_bdev_ctrlr_compare_and_write_cmd function
This patch introduces new function that is a part of upcoming support for fused commands. Signed-off-by: Maciej Szwed <maciej.szwed@intel.com> Change-Id: I019c587bee7fd0f745ec17c141baf4cb7bf86645 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/476611 Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
67c9c1c5d8
commit
05e7f56c3a
@ -344,6 +344,61 @@ spdk_nvmf_bdev_ctrlr_write_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *de
|
|||||||
return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS;
|
return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
spdk_nvmf_bdev_ctrlr_compare_and_write_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||||
|
struct spdk_io_channel *ch, struct spdk_nvmf_request *cmp_req, struct spdk_nvmf_request *write_req)
|
||||||
|
{
|
||||||
|
uint64_t bdev_num_blocks = spdk_bdev_get_num_blocks(bdev);
|
||||||
|
uint32_t block_size = spdk_bdev_get_block_size(bdev);
|
||||||
|
struct spdk_nvme_cmd *cmp_cmd = &cmp_req->cmd->nvme_cmd;
|
||||||
|
struct spdk_nvme_cmd *write_cmd = &write_req->cmd->nvme_cmd;
|
||||||
|
struct spdk_nvme_cpl *rsp = &write_req->rsp->nvme_cpl;
|
||||||
|
uint64_t write_start_lba, cmp_start_lba;
|
||||||
|
uint64_t write_num_blocks, cmp_num_blocks;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
nvmf_bdev_ctrlr_get_rw_params(cmp_cmd, &cmp_start_lba, &cmp_num_blocks);
|
||||||
|
nvmf_bdev_ctrlr_get_rw_params(write_cmd, &write_start_lba, &write_num_blocks);
|
||||||
|
|
||||||
|
if (spdk_unlikely(write_start_lba != cmp_start_lba || write_num_blocks != cmp_num_blocks)) {
|
||||||
|
SPDK_ERRLOG("Fused command start lba / num blocks mismatch\n");
|
||||||
|
rsp->status.sct = SPDK_NVME_SCT_GENERIC;
|
||||||
|
rsp->status.sc = SPDK_NVME_SC_INVALID_FIELD;
|
||||||
|
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spdk_unlikely(!nvmf_bdev_ctrlr_lba_in_range(bdev_num_blocks, write_start_lba,
|
||||||
|
write_num_blocks))) {
|
||||||
|
SPDK_ERRLOG("end of media\n");
|
||||||
|
rsp->status.sct = SPDK_NVME_SCT_GENERIC;
|
||||||
|
rsp->status.sc = SPDK_NVME_SC_LBA_OUT_OF_RANGE;
|
||||||
|
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spdk_unlikely(write_num_blocks * block_size > write_req->length)) {
|
||||||
|
SPDK_ERRLOG("Write NLB %" PRIu64 " * block size %" PRIu32 " > SGL length %" PRIu32 "\n",
|
||||||
|
write_num_blocks, block_size, write_req->length);
|
||||||
|
rsp->status.sct = SPDK_NVME_SCT_GENERIC;
|
||||||
|
rsp->status.sc = SPDK_NVME_SC_DATA_SGL_LENGTH_INVALID;
|
||||||
|
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = spdk_bdev_comparev_and_writev_blocks(desc, ch, cmp_req->iov, cmp_req->iovcnt, write_req->iov,
|
||||||
|
write_req->iovcnt, write_start_lba, write_num_blocks, nvmf_bdev_ctrlr_complete_cmd, write_req);
|
||||||
|
if (spdk_unlikely(rc)) {
|
||||||
|
if (rc == -ENOMEM) {
|
||||||
|
nvmf_bdev_ctrl_queue_io(cmp_req, bdev, ch, spdk_nvmf_ctrlr_process_io_cmd_resubmit, cmp_req);
|
||||||
|
nvmf_bdev_ctrl_queue_io(write_req, bdev, ch, spdk_nvmf_ctrlr_process_io_cmd_resubmit, write_req);
|
||||||
|
return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS;
|
||||||
|
}
|
||||||
|
rsp->status.sct = SPDK_NVME_SCT_GENERIC;
|
||||||
|
rsp->status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR;
|
||||||
|
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
spdk_nvmf_bdev_ctrlr_write_zeroes_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
spdk_nvmf_bdev_ctrlr_write_zeroes_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req)
|
struct spdk_io_channel *ch, struct spdk_nvmf_request *req)
|
||||||
|
@ -422,6 +422,8 @@ int spdk_nvmf_bdev_ctrlr_read_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc
|
|||||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req);
|
struct spdk_io_channel *ch, struct spdk_nvmf_request *req);
|
||||||
int spdk_nvmf_bdev_ctrlr_write_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
int spdk_nvmf_bdev_ctrlr_write_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req);
|
struct spdk_io_channel *ch, struct spdk_nvmf_request *req);
|
||||||
|
int spdk_nvmf_bdev_ctrlr_compare_and_write_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||||
|
struct spdk_io_channel *ch, struct spdk_nvmf_request *cmp_req, struct spdk_nvmf_request *write_req);
|
||||||
int spdk_nvmf_bdev_ctrlr_write_zeroes_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
int spdk_nvmf_bdev_ctrlr_write_zeroes_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||||
struct spdk_io_channel *ch, struct spdk_nvmf_request *req);
|
struct spdk_io_channel *ch, struct spdk_nvmf_request *req);
|
||||||
int spdk_nvmf_bdev_ctrlr_flush_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
int spdk_nvmf_bdev_ctrlr_flush_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
|
||||||
|
Loading…
Reference in New Issue
Block a user