summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2015-10-05 10:42:58 +0000
committermav <mav@FreeBSD.org>2015-10-05 10:42:58 +0000
commit3765f5189d03e60ee086bb5a91c702e92951f5f4 (patch)
tree3110816cd312365d2031c6d4c230dc09a4e5fa38
parentd3ccd879b58b58bde1f9df0cd8c91f567ca25ff1 (diff)
downloadFreeBSD-src-3765f5189d03e60ee086bb5a91c702e92951f5f4.zip
FreeBSD-src-3765f5189d03e60ee086bb5a91c702e92951f5f4.tar.gz
MFC r287986: Fix memory corruption when >128K transferred through HA link.
While there, do some cleaning.
-rw-r--r--sys/cam/ctl/ctl.c26
1 files changed, 6 insertions, 20 deletions
diff --git a/sys/cam/ctl/ctl.c b/sys/cam/ctl/ctl.c
index 4af391e..705ca82 100644
--- a/sys/cam/ctl/ctl.c
+++ b/sys/cam/ctl/ctl.c
@@ -1082,7 +1082,7 @@ ctl_isc_event_handler(ctl_ha_channel channel, ctl_ha_event event, int param)
if (msg->dt.sg_sequence == 0) {
i = msg->dt.kern_sg_entries +
- io->scsiio.kern_data_len /
+ msg->dt.kern_data_len /
CTL_HA_DATAMOVE_SEGMENT + 1;
sgl = malloc(sizeof(*sgl) * i, M_CTL,
M_WAITOK | M_ZERO);
@@ -1118,11 +1118,8 @@ ctl_isc_event_handler(ctl_ha_channel channel, ctl_ha_event event, int param)
sgl[i].len = msg->dt.sg_list[j].len;
#if 0
- printf("%s: L: %p,%d -> %p,%d j=%d, i=%d\n",
- __func__,
- msg->dt.sg_list[j].addr,
- msg->dt.sg_list[j].len,
- sgl[i].addr, sgl[i].len, j, i);
+ printf("%s: DATAMOVE: %p,%lu j=%d, i=%d\n",
+ __func__, sgl[i].addr, sgl[i].len, j, i);
#endif
}
@@ -12539,11 +12536,8 @@ ctl_datamove_remote_dm_write_cb(union ctl_io *io)
{
int retval;
- retval = 0;
-
retval = ctl_datamove_remote_xfer(io, CTL_HA_DT_CMD_WRITE,
ctl_datamove_remote_write_cb);
-
return (retval);
}
@@ -12573,11 +12567,7 @@ ctl_datamove_remote_write(union ctl_io *io)
io->scsiio.be_move_done = ctl_datamove_remote_dm_write_cb;
fe_datamove = ctl_io_port(&io->io_hdr)->fe_datamove;
-
fe_datamove(io);
-
- return;
-
}
static int
@@ -12652,14 +12642,13 @@ ctl_datamove_remote_read_cb(struct ctl_ha_dt_req *rq)
/* XXX KDM add checks like the ones in ctl_datamove? */
fe_datamove = ctl_io_port(&io->io_hdr)->fe_datamove;
-
fe_datamove(io);
}
static int
ctl_datamove_remote_sgl_setup(union ctl_io *io)
{
- struct ctl_sg_entry *local_sglist, *remote_sglist;
+ struct ctl_sg_entry *local_sglist;
struct ctl_softc *softc;
uint32_t len_to_go;
int retval;
@@ -12668,7 +12657,6 @@ ctl_datamove_remote_sgl_setup(union ctl_io *io)
retval = 0;
softc = control_softc;
local_sglist = io->io_hdr.local_sglist;
- remote_sglist = io->io_hdr.remote_sglist;
len_to_go = io->scsiio.kern_data_len;
/*
@@ -12694,7 +12682,7 @@ ctl_datamove_remote_sgl_setup(union ctl_io *io)
printf("%s: kern_sg_entries = %d\n", __func__,
io->scsiio.kern_sg_entries);
for (i = 0; i < io->scsiio.kern_sg_entries; i++)
- printf("%s: sg[%d] = %p, %d\n", __func__, i,
+ printf("%s: sg[%d] = %p, %lu\n", __func__, i,
local_sglist[i].addr, local_sglist[i].len);
#endif
@@ -12812,7 +12800,7 @@ ctl_datamove_remote_xfer(union ctl_io *io, unsigned command,
rq->callback = callback;
#if 0
- printf("%s: %s: local %#x remote %#x size %d\n", __func__,
+ printf("%s: %s: local %p remote %p size %d\n", __func__,
(command == CTL_HA_DT_CMD_WRITE) ? "WRITE" : "READ",
rq->local, rq->remote, rq->size);
#endif
@@ -12858,8 +12846,6 @@ ctl_datamove_remote_read(union ctl_io *io)
io->io_hdr.remote_sglist = NULL;
io->io_hdr.local_sglist = NULL;
}
-
- return;
}
/*
OpenPOWER on IntegriCloud