bdev/nvme: Fix compare and write command completion
Signed-off-by: Maciej Szwed <maciej.szwed@intel.com> Change-Id: I16f6842703eead32318d2aca53cbf1e2b5b15bce Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/481976 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
parent
058ec60eab
commit
34bac0bad6
@ -2029,19 +2029,26 @@ bdev_nvme_comparev_and_writev_done(void *ref, const struct spdk_nvme_cpl *cpl)
|
|||||||
struct nvme_bdev_io *bio = ref;
|
struct nvme_bdev_io *bio = ref;
|
||||||
struct spdk_bdev_io *bdev_io = spdk_bdev_io_from_ctx(bio);
|
struct spdk_bdev_io *bdev_io = spdk_bdev_io_from_ctx(bio);
|
||||||
|
|
||||||
/* We need to check if compare operation failed to make sure that in such case
|
/* Compare operation completion */
|
||||||
* write operation failed as well. We don't need to know if we are in compare
|
if ((cpl->cdw0 & 0xFF) == SPDK_NVME_OPC_COMPARE) {
|
||||||
* or write callback because for compare callback below check will always result
|
/* Save compare result for write callback */
|
||||||
* as false. */
|
bio->cpl = *cpl;
|
||||||
if (spdk_nvme_cpl_is_error(&bio->cpl)) {
|
return;
|
||||||
assert(spdk_nvme_cpl_is_error(cpl));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save compare result for write callback. In case this is write callback this
|
/* Write operation completion */
|
||||||
* line does not matter */
|
if (spdk_nvme_cpl_is_error(&bio->cpl)) {
|
||||||
bio->cpl = *cpl;
|
/* If bio->cpl is already an error, it means the compare operation failed. In that case,
|
||||||
|
* complete the IO with the compare operation's status.
|
||||||
|
*/
|
||||||
|
if (!spdk_nvme_cpl_is_error(cpl)) {
|
||||||
|
SPDK_ERRLOG("Unexpected write success after compare failure.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
spdk_bdev_io_complete_nvme_status(bdev_io, bio->cpl.cdw0, bio->cpl.status.sct, bio->cpl.status.sc);
|
||||||
|
} else {
|
||||||
spdk_bdev_io_complete_nvme_status(bdev_io, cpl->cdw0, cpl->status.sct, cpl->status.sc);
|
spdk_bdev_io_complete_nvme_status(bdev_io, cpl->cdw0, cpl->status.sct, cpl->status.sc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user