From 6aa5b10d0c245eef2410e82a02920131f65f83a3 Mon Sep 17 00:00:00 2001 From: Yuri Pankov Date: Mon, 27 Mar 2023 14:11:59 +0200 Subject: [PATCH] nvme: fix resv commands with nda device - passing I/O commands through nda requires nsid field to be set (it was unused when going through nvme_ns_ioctl()) - ccb's status can be OR'ed with the flags, use CAM_STATUS_MASK Reviewed by: imp (cam) Differential Revision: https://reviews.freebsd.org/D37696 --- sbin/nvmecontrol/resv.c | 4 ++++ sys/cam/nvme/nvme_da.c | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/sbin/nvmecontrol/resv.c b/sbin/nvmecontrol/resv.c index adb3b64c9ec3..8649c0da8a91 100644 --- a/sbin/nvmecontrol/resv.c +++ b/sbin/nvmecontrol/resv.c @@ -255,6 +255,7 @@ resvacquire(const struct cmd *f, int argc, char *argv[]) memset(&pt, 0, sizeof(pt)); pt.cmd.opc = NVME_OPC_RESERVATION_ACQUIRE; + pt.cmd.nsid = htole32(nsid); pt.cmd.cdw10 = htole32((acquire_opt.racqa & 7) | (acquire_opt.rtype << 8)); pt.buf = &data; @@ -293,6 +294,7 @@ resvregister(const struct cmd *f, int argc, char *argv[]) memset(&pt, 0, sizeof(pt)); pt.cmd.opc = NVME_OPC_RESERVATION_REGISTER; + pt.cmd.nsid = htole32(nsid); pt.cmd.cdw10 = htole32((register_opt.rrega & 7) | (register_opt.iekey << 3) | (register_opt.cptpl << 30)); pt.buf = &data; @@ -330,6 +332,7 @@ resvrelease(const struct cmd *f, int argc, char *argv[]) memset(&pt, 0, sizeof(pt)); pt.cmd.opc = NVME_OPC_RESERVATION_RELEASE; + pt.cmd.nsid = htole32(nsid); pt.cmd.cdw10 = htole32((release_opt.rrela & 7) | (release_opt.rtype << 8)); pt.buf = &data; @@ -369,6 +372,7 @@ resvreport(const struct cmd *f, int argc, char *argv[]) bzero(data, sizeof(data)); memset(&pt, 0, sizeof(pt)); pt.cmd.opc = NVME_OPC_RESERVATION_REPORT; + pt.cmd.nsid = htole32(nsid); pt.cmd.cdw10 = htole32(sizeof(data) / 4 - 1); pt.cmd.cdw11 = htole32(report_opt.eds); /* EDS */ pt.buf = &data; diff --git a/sys/cam/nvme/nvme_da.c b/sys/cam/nvme/nvme_da.c index 3e37abe0f6e4..51689d0e4a23 100644 --- a/sys/cam/nvme/nvme_da.c +++ b/sys/cam/nvme/nvme_da.c @@ -441,7 +441,8 @@ ndaioctl(struct disk *dp, u_long cmd, void *data, int fflag, */ cam_periph_unlock(periph); cam_periph_unmapmem(ccb, &mapinfo); - error = (ccb->ccb_h.status == CAM_REQ_CMP) ? 0 : EIO; + error = (ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP ? + 0 : EIO; out: cam_periph_lock(periph); xpt_release_ccb(ccb);