smartmontools/6006-os_freebsd.cpp-on-error-was-setting-set_nvme_err-to-.patch
2019-09-30 11:17:14 -04:00

47 lines
1.6 KiB
Diff

From 23435e436dca1d54d847df704cd947ef56736e65 Mon Sep 17 00:00:00 2001
From: dpgilbert <authors@smartmontools.org>
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