nvme: Add spdk_nvme_ns_cmd_comparev_with_md function
Signed-off-by: Maciej Szwed <maciej.szwed@intel.com> Change-Id: I7eb89412673e01d9c84cb258f5152a31253d7a7f Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/477025 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Paul Luse <paul.e.luse@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
parent
334aeff9e1
commit
c7092e2b3a
@ -2506,6 +2506,43 @@ int spdk_nvme_ns_cmd_comparev(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *q
|
||||
spdk_nvme_req_reset_sgl_cb reset_sgl_fn,
|
||||
spdk_nvme_req_next_sge_cb next_sge_fn);
|
||||
|
||||
/**
|
||||
* Submit a compare I/O to the specified NVMe namespace.
|
||||
*
|
||||
* The command is submitted to a qpair allocated by spdk_nvme_ctrlr_alloc_io_qpair().
|
||||
* The user must ensure that only one thread submits I/O on a given qpair at any
|
||||
* given time.
|
||||
*
|
||||
* \param ns NVMe namespace to submit the compare I/O.
|
||||
* \param qpair I/O queue pair to submit the request.
|
||||
* \param lba Starting LBA to compare the data.
|
||||
* \param lba_count Length (in sectors) for the compare operation.
|
||||
* \param cb_fn Callback function to invoke when the I/O is completed.
|
||||
* \param cb_arg Argument to pass to the callback function.
|
||||
* \param io_flags Set flags, defined in nvme_spec.h, for this I/O.
|
||||
* \param reset_sgl_fn Callback function to reset scattered payload.
|
||||
* \param next_sge_fn Callback function to iterate each scattered payload memory
|
||||
* segment.
|
||||
* \param metadata Virtual address pointer to the metadata payload, the length
|
||||
* of metadata is specified by spdk_nvme_ns_get_md_size()
|
||||
* \param apptag_mask Application tag mask.
|
||||
* \param apptag Application tag to use end-to-end protection information.
|
||||
*
|
||||
* \return 0 if successfully submitted, negated errnos on the following error conditions:
|
||||
* -EINVAL: The request is malformed.
|
||||
* -ENOMEM: The request cannot be allocated.
|
||||
* -ENXIO: The qpair is failed at the transport level.
|
||||
* -EFAULT: Invalid address was specified as part of payload. cb_fn is also called
|
||||
* with error status including dnr=1 in this case.
|
||||
*/
|
||||
int
|
||||
spdk_nvme_ns_cmd_comparev_with_md(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
|
||||
uint64_t lba, uint32_t lba_count,
|
||||
spdk_nvme_cmd_cb cb_fn, void *cb_arg, uint32_t io_flags,
|
||||
spdk_nvme_req_reset_sgl_cb reset_sgl_fn,
|
||||
spdk_nvme_req_next_sge_cb next_sge_fn, void *metadata,
|
||||
uint16_t apptag_mask, uint16_t apptag);
|
||||
|
||||
/**
|
||||
* Submit a compare I/O to the specified NVMe namespace.
|
||||
*
|
||||
|
@ -543,6 +543,41 @@ spdk_nvme_ns_cmd_comparev(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
spdk_nvme_ns_cmd_comparev_with_md(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair,
|
||||
uint64_t lba, uint32_t lba_count,
|
||||
spdk_nvme_cmd_cb cb_fn, void *cb_arg, uint32_t io_flags,
|
||||
spdk_nvme_req_reset_sgl_cb reset_sgl_fn,
|
||||
spdk_nvme_req_next_sge_cb next_sge_fn, void *metadata,
|
||||
uint16_t apptag_mask, uint16_t apptag)
|
||||
{
|
||||
struct nvme_request *req;
|
||||
struct nvme_payload payload;
|
||||
|
||||
if (!_is_io_flags_valid(io_flags)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (reset_sgl_fn == NULL || next_sge_fn == NULL) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
payload = NVME_PAYLOAD_SGL(reset_sgl_fn, next_sge_fn, cb_arg, metadata);
|
||||
|
||||
req = _nvme_ns_cmd_rw(ns, qpair, &payload, 0, 0, lba, lba_count, cb_fn, cb_arg,
|
||||
SPDK_NVME_OPC_COMPARE, io_flags, apptag_mask, apptag, true);
|
||||
if (req != NULL) {
|
||||
return nvme_qpair_submit_request(qpair, req);
|
||||
} else if (spdk_nvme_ns_check_request_length(lba_count,
|
||||
ns->sectors_per_max_io,
|
||||
ns->sectors_per_stripe,
|
||||
qpair->ctrlr->opts.io_queue_requests)) {
|
||||
return -EINVAL;
|
||||
} else {
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
spdk_nvme_ns_cmd_read(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, void *buffer,
|
||||
uint64_t lba,
|
||||
|
Loading…
x
Reference in New Issue
Block a user