mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
[SCSI] attempt to complete r2t with data len greater than max burst
A couple targets like string bean and MDS, send r2ts with a data len greater than the max burst we agreed to. We were being strict in our enforcing of the iscsi rfc in that code path, but there is no driver limitation that prevents us from fullfilling the request. To allow those targets to work we will ignore the max_burst length and send as much data as the target asks for assuming it has consciously decided to override its max burst length. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
60ecebf5a1
commit
98a9416af0
1 changed files with 14 additions and 3 deletions
|
@ -358,8 +358,11 @@ iscsi_r2t_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
|
|||
int r2tsn = be32_to_cpu(rhdr->r2tsn);
|
||||
int rc;
|
||||
|
||||
if (tcp_conn->in.datalen)
|
||||
if (tcp_conn->in.datalen) {
|
||||
printk(KERN_ERR "iscsi_tcp: invalid R2t with datalen %d\n",
|
||||
tcp_conn->in.datalen);
|
||||
return ISCSI_ERR_DATALEN;
|
||||
}
|
||||
|
||||
if (tcp_ctask->exp_r2tsn && tcp_ctask->exp_r2tsn != r2tsn)
|
||||
return ISCSI_ERR_R2TSN;
|
||||
|
@ -385,15 +388,23 @@ iscsi_r2t_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
|
|||
|
||||
r2t->exp_statsn = rhdr->statsn;
|
||||
r2t->data_length = be32_to_cpu(rhdr->data_length);
|
||||
if (r2t->data_length == 0 ||
|
||||
r2t->data_length > session->max_burst) {
|
||||
if (r2t->data_length == 0) {
|
||||
printk(KERN_ERR "iscsi_tcp: invalid R2T with zero data len\n");
|
||||
spin_unlock(&session->lock);
|
||||
return ISCSI_ERR_DATALEN;
|
||||
}
|
||||
|
||||
if (r2t->data_length > session->max_burst)
|
||||
debug_scsi("invalid R2T with data len %u and max burst %u."
|
||||
"Attempting to execute request.\n",
|
||||
r2t->data_length, session->max_burst);
|
||||
|
||||
r2t->data_offset = be32_to_cpu(rhdr->data_offset);
|
||||
if (r2t->data_offset + r2t->data_length > ctask->total_length) {
|
||||
spin_unlock(&session->lock);
|
||||
printk(KERN_ERR "iscsi_tcp: invalid R2T with data len %u at "
|
||||
"offset %u and total length %d\n", r2t->data_length,
|
||||
r2t->data_offset, ctask->total_length);
|
||||
return ISCSI_ERR_DATALEN;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue