Commit 658c3122 authored by Bart Van Assche's avatar Bart Van Assche Committed by Martin K. Petersen

scsi: target/iscsi: Simplify iscsit_dump_data_payload()

Use a single loop to dump immediate data, padding and digest instead of
using separate rx_data() calls for each type of data.

Cc: Nicholas Bellinger <nab@linux-iscsi.org>
Cc: Mike Christie <mchristi@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Hannes Reinecke <hare@suse.de>
Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 32e36bfb
......@@ -48,14 +48,20 @@ int iscsit_dump_data_payload(
u32 buf_len,
int dump_padding_digest)
{
char *buf, pad_bytes[4];
char *buf;
int ret = DATAOUT_WITHIN_COMMAND_RECOVERY, rx_got;
u32 length, padding, offset = 0, size;
u32 length, offset = 0, size;
struct kvec iov;
if (conn->sess->sess_ops->RDMAExtensions)
return 0;
if (dump_padding_digest) {
buf_len = ALIGN(buf_len, 4);
if (conn->conn_ops->DataDigest)
buf_len += ISCSI_CRC_LEN;
}
length = min(buf_len, OFFLOAD_BUF_SIZE);
buf = kzalloc(length, GFP_ATOMIC);
......@@ -75,41 +81,12 @@ int iscsit_dump_data_payload(
rx_got = rx_data(conn, &iov, 1, size);
if (rx_got != size) {
ret = DATAOUT_CANNOT_RECOVER;
goto out;
break;
}
offset += size;
}
if (!dump_padding_digest)
goto out;
padding = ((-buf_len) & 3);
if (padding != 0) {
iov.iov_len = padding;
iov.iov_base = pad_bytes;
rx_got = rx_data(conn, &iov, 1, padding);
if (rx_got != padding) {
ret = DATAOUT_CANNOT_RECOVER;
goto out;
}
}
if (conn->conn_ops->DataDigest) {
u32 data_crc;
iov.iov_len = ISCSI_CRC_LEN;
iov.iov_base = &data_crc;
rx_got = rx_data(conn, &iov, 1, ISCSI_CRC_LEN);
if (rx_got != ISCSI_CRC_LEN) {
ret = DATAOUT_CANNOT_RECOVER;
goto out;
}
}
out:
kfree(buf);
return ret;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment