svn commit: r312951 - stable/10/sbin/camcontrol
Alexander Motin
mav at FreeBSD.org
Sun Jan 29 14:29:03 UTC 2017
Author: mav
Date: Sun Jan 29 14:29:02 2017
New Revision: 312951
URL: https://svnweb.freebsd.org/changeset/base/312951
Log:
MFC r312228: Make `camcontrol cmd ... -i ...` return only valid bytes.
Previously code ignored resid field and returned extra zeroes in case of
data underflow. Now it returns only real bytes received from target.
Modified:
stable/10/sbin/camcontrol/camcontrol.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sbin/camcontrol/camcontrol.c
==============================================================================
--- stable/10/sbin/camcontrol/camcontrol.c Sun Jan 29 14:28:29 2017 (r312950)
+++ stable/10/sbin/camcontrol/camcontrol.c Sun Jan 29 14:29:02 2017 (r312951)
@@ -4145,7 +4145,7 @@ scsicmd(struct cam_device *device, int a
u_int8_t cdb[20];
u_int8_t atacmd[12];
struct get_hook hook;
- int c, data_bytes = 0;
+ int c, data_bytes = 0, valid_bytes;
int cdb_len = 0;
int atacmd_len = 0;
int dmacmd = 0;
@@ -4449,16 +4449,20 @@ scsicmd(struct cam_device *device, int a
}
}
+ if (cdb_len)
+ valid_bytes = ccb->csio.dxfer_len - ccb->csio.resid;
+ else
+ valid_bytes = ccb->ataio.dxfer_len - ccb->ataio.resid;
if (((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP)
&& (arglist & CAM_ARG_CMD_IN)
- && (data_bytes > 0)) {
+ && (valid_bytes > 0)) {
if (fd_data == 0) {
- buff_decode_visit(data_ptr, data_bytes, datastr,
+ buff_decode_visit(data_ptr, valid_bytes, datastr,
arg_put, NULL);
fprintf(stdout, "\n");
} else {
ssize_t amt_written;
- int amt_to_write = data_bytes;
+ int amt_to_write = valid_bytes;
u_int8_t *buf_ptr = data_ptr;
for (amt_written = 0; (amt_to_write > 0) &&
@@ -4473,7 +4477,7 @@ scsicmd(struct cam_device *device, int a
} else if ((amt_written == 0)
&& (amt_to_write > 0)) {
warnx("only wrote %u bytes out of %u",
- data_bytes - amt_to_write, data_bytes);
+ valid_bytes - amt_to_write, valid_bytes);
}
}
}
More information about the svn-src-stable
mailing list