aboutsummaryrefslogtreecommitdiff
path: root/sys/cam/ctl
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2021-05-20 16:59:11 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2021-05-20 16:59:11 +0000
commit0cc7d64a2a37533afe03d2b640dc107be41b5f56 (patch)
tree15ba514d2bd751973545a6114539ed14cf9700f6 /sys/cam/ctl
parent71e3d1b3a0ee4080c53615167bde4d93efe103fe (diff)
downloadsrc-0cc7d64a2a37533afe03d2b640dc107be41b5f56.tar.gz
src-0cc7d64a2a37533afe03d2b640dc107be41b5f56.zip
iscsi: Move the maximum data segment limits into 'struct icl_conn'.
This fixes a few bugs in iSCSI backends where the backends were using the limits they advertised initially during the login phase as the final values instead of the values negotiated with the other end. Reported by: Jithesh Arakkan @ Chelsio Reviewed by: mav Differential Revision: https://reviews.freebsd.org/D30271
Diffstat (limited to 'sys/cam/ctl')
-rw-r--r--sys/cam/ctl/ctl_frontend_iscsi.c23
-rw-r--r--sys/cam/ctl/ctl_frontend_iscsi.h2
2 files changed, 14 insertions, 11 deletions
diff --git a/sys/cam/ctl/ctl_frontend_iscsi.c b/sys/cam/ctl/ctl_frontend_iscsi.c
index a5a80848c763..b3cd8ab79d76 100644
--- a/sys/cam/ctl/ctl_frontend_iscsi.c
+++ b/sys/cam/ctl/ctl_frontend_iscsi.c
@@ -1568,8 +1568,10 @@ cfiscsi_ioctl_handoff(struct ctl_iscsi *ci)
*/
cs->cs_cmdsn = cihp->cmdsn;
cs->cs_statsn = cihp->statsn;
- cs->cs_max_recv_data_segment_length = cihp->max_recv_data_segment_length;
- cs->cs_max_send_data_segment_length = cihp->max_send_data_segment_length;
+ cs->cs_conn->ic_max_recv_data_segment_length =
+ cihp->max_recv_data_segment_length;
+ cs->cs_conn->ic_max_send_data_segment_length =
+ cihp->max_send_data_segment_length;
cs->cs_max_burst_length = cihp->max_burst_length;
cs->cs_first_burst_length = cihp->first_burst_length;
cs->cs_immediate_data = !!cihp->immediate_data;
@@ -1734,8 +1736,8 @@ cfiscsi_ioctl_list(struct ctl_iscsi *ci)
cs->cs_target->ct_tag,
cs->cs_conn->ic_header_crc32c ? "CRC32C" : "None",
cs->cs_conn->ic_data_crc32c ? "CRC32C" : "None",
- cs->cs_max_recv_data_segment_length,
- cs->cs_max_send_data_segment_length,
+ cs->cs_conn->ic_max_recv_data_segment_length,
+ cs->cs_conn->ic_max_send_data_segment_length,
cs->cs_max_burst_length,
cs->cs_first_burst_length,
cs->cs_immediate_data,
@@ -2534,12 +2536,14 @@ cfiscsi_datamove_in(union ctl_io *io)
/*
* Truncate to maximum data segment length.
*/
- KASSERT(response->ip_data_len < cs->cs_max_send_data_segment_length,
+ KASSERT(response->ip_data_len <
+ cs->cs_conn->ic_max_send_data_segment_length,
("ip_data_len %zd >= max_send_data_segment_length %d",
- response->ip_data_len, cs->cs_max_send_data_segment_length));
+ response->ip_data_len,
+ cs->cs_conn->ic_max_send_data_segment_length));
if (response->ip_data_len + len >
- cs->cs_max_send_data_segment_length) {
- len = cs->cs_max_send_data_segment_length -
+ cs->cs_conn->ic_max_send_data_segment_length) {
+ len = cs->cs_conn->ic_max_send_data_segment_length -
response->ip_data_len;
KASSERT(len <= sg_len, ("len %zd > sg_len %zd",
len, sg_len));
@@ -2599,7 +2603,8 @@ cfiscsi_datamove_in(union ctl_io *io)
i++;
}
- if (response->ip_data_len == cs->cs_max_send_data_segment_length) {
+ if (response->ip_data_len ==
+ cs->cs_conn->ic_max_send_data_segment_length) {
/*
* Can't stuff more data into the current PDU;
* queue it. Note that's not enough to check
diff --git a/sys/cam/ctl/ctl_frontend_iscsi.h b/sys/cam/ctl/ctl_frontend_iscsi.h
index a1c857231428..7c7f422a8d1f 100644
--- a/sys/cam/ctl/ctl_frontend_iscsi.h
+++ b/sys/cam/ctl/ctl_frontend_iscsi.h
@@ -86,8 +86,6 @@ struct cfiscsi_session {
bool cs_terminating;
bool cs_handoff_in_progress;
bool cs_tasks_aborted;
- int cs_max_recv_data_segment_length;
- int cs_max_send_data_segment_length;
int cs_max_burst_length;
int cs_first_burst_length;
bool cs_immediate_data;