svn commit: r368603 - in stable/12/sbin/nvmecontrol: . modules/wdc
Alexander Motin
mav at FreeBSD.org
Sun Dec 13 02:21:55 UTC 2020
Author: mav
Date: Sun Dec 13 02:21:54 2020
New Revision: 368603
URL: https://svnweb.freebsd.org/changeset/base/368603
Log:
MFC r367768: Stop using NVME_MAX_XFER_SIZE constant.
This constant depends on MAXPHYS and does not respect device capabilities.
Use proper dynamic ioctl(NVME_GET_MAX_XFER_SIZE) instead.
Modified:
stable/12/sbin/nvmecontrol/firmware.c
stable/12/sbin/nvmecontrol/modules/wdc/wdc.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sbin/nvmecontrol/firmware.c
==============================================================================
--- stable/12/sbin/nvmecontrol/firmware.c Sun Dec 13 02:19:18 2020 (r368602)
+++ stable/12/sbin/nvmecontrol/firmware.c Sun Dec 13 02:21:54 2020 (r368603)
@@ -166,12 +166,10 @@ update_firmware(int fd, uint8_t *payload, int32_t payl
off = 0;
resid = payload_size;
- if (fwug != 0 && fwug != 0xFF)
- max_xfer_size = ((uint64_t)fwug << 12);
- else if (ioctl(fd, NVME_GET_MAX_XFER_SIZE, &max_xfer_size) < 0)
+ if (ioctl(fd, NVME_GET_MAX_XFER_SIZE, &max_xfer_size) < 0)
err(EX_IOERR, "query max transfer size failed");
- if (max_xfer_size > NVME_MAX_XFER_SIZE)
- max_xfer_size = NVME_MAX_XFER_SIZE;
+ if (fwug != 0 && fwug != 0xFF)
+ max_xfer_size = MIN(max_xfer_size, (uint64_t)fwug << 12);
if ((chunk = aligned_alloc(PAGE_SIZE, max_xfer_size)) == NULL)
errx(EX_OSERR, "unable to malloc %zd bytes", (size_t)max_xfer_size);
Modified: stable/12/sbin/nvmecontrol/modules/wdc/wdc.c
==============================================================================
--- stable/12/sbin/nvmecontrol/modules/wdc/wdc.c Sun Dec 13 02:19:18 2020 (r368602)
+++ stable/12/sbin/nvmecontrol/modules/wdc/wdc.c Sun Dec 13 02:21:54 2020 (r368603)
@@ -165,6 +165,7 @@ wdc_do_dump_e6(int fd, char *tmpl, const char *suffix,
int first;
int fd2;
uint8_t *buf, *hdr;
+ uint64_t max_xfer_size;
uint32_t len, offset;
size_t resid;
bool e6lg_flag = false;
@@ -186,15 +187,17 @@ wdc_do_dump_e6(int fd, char *tmpl, const char *suffix,
fd2 = open(tmpl, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd2 < 0)
err(EX_CANTCREAT, "open %s", tmpl);
- buf = aligned_alloc(PAGE_SIZE, NVME_MAX_XFER_SIZE);
+ if (ioctl(fd, NVME_GET_MAX_XFER_SIZE, &max_xfer_size) < 0)
+ err(EX_IOERR, "query max transfer size failed");
+ buf = aligned_alloc(PAGE_SIZE, max_xfer_size);
if (buf == NULL)
errx(EX_OSERR, "Can't get buffer to read dump");
offset = 0;
- len = NVME_MAX_XFER_SIZE;
+ len = max_xfer_size;
first = 1;
do {
- resid = len > NVME_MAX_XFER_SIZE ? NVME_MAX_XFER_SIZE : len;
+ resid = MIN(len, max_xfer_size);
wdc_get_data(fd, opcode, resid, offset, cmd, buf, resid, e6lg_flag);
if (first) {
@@ -321,6 +324,7 @@ wdc_do_dump_dui(int fd, char *tmpl, uint8_t data_area,
{
int fd2, first;
uint8_t *buf;
+ uint64_t max_xfer_size;
uint16_t hdr_ver;
uint64_t log_len, offset;
size_t resid;
@@ -332,14 +336,16 @@ wdc_do_dump_dui(int fd, char *tmpl, uint8_t data_area,
fd2 = open(tmpl, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd2 < 0)
err(EX_CANTCREAT, "open %s", tmpl);
- buf = aligned_alloc(PAGE_SIZE, NVME_MAX_XFER_SIZE);
+ if (ioctl(fd, NVME_GET_MAX_XFER_SIZE, &max_xfer_size) < 0)
+ err(EX_IOERR, "query max transfer size failed");
+ buf = aligned_alloc(PAGE_SIZE, max_xfer_size);
if (buf == NULL)
errx(EX_OSERR, "Can't get buffer to read dump");
offset = 0;
first = 1;
while (log_len > 0) {
- resid = log_len > NVME_MAX_XFER_SIZE ? NVME_MAX_XFER_SIZE : log_len;
+ resid = MIN(log_len, max_xfer_size);
wdc_get_data_dui(fd, opcode, resid, offset, buf, resid);
if (first) {
hdr_ver = ((buf[len_off] & 0xF) != 0) ?
More information about the svn-src-stable-12
mailing list