diff options
author | mw <mw@FreeBSD.org> | 2018-03-09 02:43:41 +0800 |
---|---|---|
committer | mw <mw@FreeBSD.org> | 2018-03-09 02:43:41 +0800 |
commit | db05cd9353da2b12326ae817c2f8f047e1b10c08 (patch) | |
tree | b47f8acb4714052e9f8ee764f61f2512b534138f /sysutils | |
parent | 87e1b8f8c3212932b2e1a7dff04a96bbc16feb2c (diff) | |
download | freebsd-ports-gnome-db05cd9353da2b12326ae817c2f8f047e1b10c08.tar.gz freebsd-ports-gnome-db05cd9353da2b12326ae817c2f8f047e1b10c08.tar.zst freebsd-ports-gnome-db05cd9353da2b12326ae817c2f8f047e1b10c08.zip |
Display NVMe data properly on Big Endian hosts with sysutils/smartmontools
smartctl can now be used with NVMe drives on BE hosts.
Submitted by: Michal Stanek <mst@semihalf.com>
Reviewed by: cy
Obtained from: Semihalf
Sponsored by: IBM, QCM Technologies
Differential Revision: https://reviews.freebsd.org/D14543
Diffstat (limited to 'sysutils')
-rw-r--r-- | sysutils/smartmontools/files/patch-os__freebsd.cpp | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/sysutils/smartmontools/files/patch-os__freebsd.cpp b/sysutils/smartmontools/files/patch-os__freebsd.cpp index d174a536668a..87e960a3f22b 100644 --- a/sysutils/smartmontools/files/patch-os__freebsd.cpp +++ b/sysutils/smartmontools/files/patch-os__freebsd.cpp @@ -1,14 +1,15 @@ --- os_freebsd.cpp.orig 2017-04-24 09:34:16.000000000 -0700 -+++ os_freebsd.cpp 2018-02-22 23:01:44.118712000 -0800 -@@ -15,6 +15,7 @@ - * ++++ os_freebsd.cpp 2018-02-27 19:15:54.338861000 +0000 +@@ -16,6 +16,8 @@ */ -+#include <sys/param.h> #include <stdio.h> ++#include <sys/endian.h> ++#include <sys/param.h> #include <sys/types.h> #include <dirent.h> -@@ -484,7 +485,7 @@ + #include <fcntl.h> +@@ -484,7 +486,7 @@ } nsid = 0xFFFFFFFF; // broadcast id } @@ -17,16 +18,41 @@ &ctrlid, &nsid, &tmp) == 2) { if(ctrlid < 0 || nsid < 0) { -@@ -521,7 +522,11 @@ +@@ -521,16 +523,20 @@ struct nvme_pt_command pt; memset(&pt, 0, sizeof(pt)); -- pt.cmd.opc = in.opcode; +#if __FreeBSD_version >= 1200058 + pt.cmd.opc_fuse = NVME_CMD_SET_OPC(in.opcode); +#else -+ pt.cmd.opc = in.opcode; + pt.cmd.opc = in.opcode; +#endif - pt.cmd.nsid = in.nsid; +- pt.cmd.nsid = in.nsid; ++ pt.cmd.nsid = htole32(in.nsid); pt.buf = in.buffer; pt.len = in.size; +- pt.cmd.cdw10 = in.cdw10; +- pt.cmd.cdw11 = in.cdw11; +- pt.cmd.cdw12 = in.cdw12; +- pt.cmd.cdw13 = in.cdw13; +- pt.cmd.cdw14 = in.cdw14; +- pt.cmd.cdw15 = in.cdw15; ++ pt.cmd.cdw10 = htole32(in.cdw10); ++ pt.cmd.cdw11 = htole32(in.cdw11); ++ pt.cmd.cdw12 = htole32(in.cdw12); ++ pt.cmd.cdw13 = htole32(in.cdw13); ++ pt.cmd.cdw14 = htole32(in.cdw14); ++ pt.cmd.cdw15 = htole32(in.cdw15); + pt.is_read = 1; // should we use in.direction()? + + int status = ioctl(get_fd(), NVME_PASSTHROUGH_CMD, &pt); +@@ -538,6 +544,9 @@ + if (status < 0) + return set_err(errno, "NVME_PASSTHROUGH_CMD: %s", strerror(errno)); + ++#if __FreeBSD_version >= 1200058 ++ nvme_completion_swapbytes(&pt.cpl); ++#endif + out.result=pt.cpl.cdw0; // Command specific result (DW0) + + if (nvme_completion_is_error(&pt.cpl)) |