From 23435e436dca1d54d847df704cd947ef56736e65 Mon Sep 17 00:00:00 2001 From: dpgilbert Date: Wed, 27 Dec 2017 05:50:47 +0000 Subject: [PATCH 073/291] os_freebsd.cpp: on error was setting set_nvme_err() to 1, fix git-svn-id: http://svn.code.sf.net/p/smartmontools/code/trunk@4670 4ea69e1a-61f1-4043-bf83-b5c94c648137 --- smartmontools/ChangeLog | 5 +++++ smartmontools/os_freebsd.cpp | 11 ++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/smartmontools/os_freebsd.cpp b/smartmontools/os_freebsd.cpp index 92e225f8..c0bb3b85 100644 --- a/smartmontools/os_freebsd.cpp +++ b/smartmontools/os_freebsd.cpp @@ -519,6 +519,7 @@ bool freebsd_nvme_device::nvme_pass_through(const nvme_cmd_in & in, nvme_cmd_out { // nvme_passthru_cmd pt; struct nvme_pt_command pt; + struct nvme_completion *cp_p; memset(&pt, 0, sizeof(pt)); pt.cmd.opc = in.opcode; @@ -538,10 +539,14 @@ bool freebsd_nvme_device::nvme_pass_through(const nvme_cmd_in & in, nvme_cmd_out if (status < 0) return set_err(errno, "NVME_PASSTHROUGH_CMD: %s", strerror(errno)); - out.result=pt.cpl.cdw0; // Command specific result (DW0) + cp_p = &pt.cpl; + out.result=cp_p->cdw0; // Command specific result (DW0) - if (nvme_completion_is_error(&pt.cpl)) - return set_nvme_err(out, nvme_completion_is_error(&pt.cpl)); + if (nvme_completion_is_error(cp_p)) { /* ignore DNR and More bits */ + uint16_t nvme_status = ((cp_p->status.sct << 8) | cp_p->status.sc) & 0x3ff; + + return set_nvme_err(out, nvme_status); + } return true; } -- 2.19.1