SCSI: Revert some of the changes to introcuce iovectors and prepare to

obsolete the old api.

After discussions, It is probably not the right thing to do.
Lets leave the old api as is. Most simpler applications will
continue to pass a single linear buffer to the iscsi_<send-data-out-to-device>_task() for convenience  so it would be wrong to force them all to
migrate to amore complex iovector api.

Convert any linear buffers, if provided, to a one element data-out iovector
if a buffer was provided.
This commit is contained in:
Ronnie Sahlberg
2012-11-29 19:08:57 -08:00
parent 9449753a5d
commit 7704215bcc

View File

@@ -134,9 +134,8 @@ iscsi_send_data_out(struct iscsi_context *iscsi, struct iscsi_pdu *cmd_pdu,
return 0; return 0;
} }
/* Using 'struct iscsi_data *d' for data-out is depreciated. /* Using 'struct iscsi_data *d' for data-out is optional
* Instead the task should have a data-out iovector attached to it. * and will be converted into a one element data-out iovector.
* See iscsi_write10_task for an example.
*/ */
int int
iscsi_scsi_command_async(struct iscsi_context *iscsi, int lun, iscsi_scsi_command_async(struct iscsi_context *iscsi, int lun,
@@ -158,8 +157,8 @@ iscsi_scsi_command_async(struct iscsi_context *iscsi, int lun,
return -1; return -1;
} }
/* Convert old-style callers to the new 'iovector assigned to the task structure' /* We got an actual buffer from the application. Convert it to
* model. * a data-out iovector.
*/ */
if (d != NULL && d->data != NULL) { if (d != NULL && d->data != NULL) {
struct scsi_iovec *iov; struct scsi_iovec *iov;
@@ -763,6 +762,7 @@ iscsi_write10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data d;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -777,21 +777,11 @@ iscsi_write10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
"write10 cdb."); "write10 cdb.");
return NULL; return NULL;
} }
if (data != NULL) { d.data = data;
struct scsi_iovec *iov; d.size = datalen;
iov = scsi_malloc(task, sizeof(struct scsi_iovec));
if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
NULL, private_data) != 0) { &d, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -806,6 +796,7 @@ iscsi_write12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data d;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -820,21 +811,11 @@ iscsi_write12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
"write12 cdb."); "write12 cdb.");
return NULL; return NULL;
} }
if (data != NULL) { d.data = data;
struct scsi_iovec *iov; d.size = datalen;
iov = scsi_malloc(task, sizeof(struct scsi_iovec));
if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
NULL, private_data) != 0) { &d, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -849,6 +830,7 @@ iscsi_write16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data d;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -863,21 +845,11 @@ iscsi_write16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
"write16 cdb."); "write16 cdb.");
return NULL; return NULL;
} }
if (data != NULL) { d.data = data;
struct scsi_iovec *iov; d.size = datalen;
iov = scsi_malloc(task, sizeof(struct scsi_iovec));
if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
NULL, private_data) != 0) { &d, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -892,6 +864,7 @@ iscsi_orwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data d;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -906,21 +879,11 @@ iscsi_orwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
"orwrite cdb."); "orwrite cdb.");
return NULL; return NULL;
} }
if (data != NULL) { d.data = data;
struct scsi_iovec *iov; d.size = datalen;
iov = scsi_malloc(task, sizeof(struct scsi_iovec));
if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
NULL, private_data) != 0) { &d, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -935,6 +898,7 @@ iscsi_compareandwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data d;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -949,21 +913,11 @@ iscsi_compareandwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
"compareandwrite cdb."); "compareandwrite cdb.");
return NULL; return NULL;
} }
if (data != NULL) { d.data = data;
struct scsi_iovec *iov; d.size = datalen;
iov = scsi_malloc(task, sizeof(struct scsi_iovec));
if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
NULL, private_data) != 0) { &d, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -978,6 +932,7 @@ iscsi_writeverify10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data d;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -992,21 +947,11 @@ iscsi_writeverify10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
"writeverify10 cdb."); "writeverify10 cdb.");
return NULL; return NULL;
} }
if (data != NULL) { d.data = data;
struct scsi_iovec *iov; d.size = datalen;
iov = scsi_malloc(task, sizeof(struct scsi_iovec));
if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
NULL, private_data) != 0) { &d, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1021,6 +966,7 @@ iscsi_writeverify12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data d;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -1035,21 +981,11 @@ iscsi_writeverify12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
"writeverify12 cdb."); "writeverify12 cdb.");
return NULL; return NULL;
} }
if (data != NULL) { d.data = data;
struct scsi_iovec *iov; d.size = datalen;
iov = scsi_malloc(task, sizeof(struct scsi_iovec));
if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
NULL, private_data) != 0) { &d, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1064,6 +1000,7 @@ iscsi_writeverify16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data d;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -1078,21 +1015,11 @@ iscsi_writeverify16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
"writeverify16 cdb."); "writeverify16 cdb.");
return NULL; return NULL;
} }
if (data != NULL) { d.data = data;
struct scsi_iovec *iov; d.size = datalen;
iov = scsi_malloc(task, sizeof(struct scsi_iovec));
if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
NULL, private_data) != 0) { &d, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1106,6 +1033,7 @@ iscsi_verify10_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data d;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -1119,21 +1047,11 @@ iscsi_verify10_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
"verify10 cdb."); "verify10 cdb.");
return NULL; return NULL;
} }
if (data != NULL) { d.data = data;
struct scsi_iovec *iov; d.size = datalen;
iov = scsi_malloc(task, sizeof(struct scsi_iovec));
if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
NULL, private_data) != 0) { &d, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1147,6 +1065,7 @@ iscsi_verify12_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data d;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -1160,21 +1079,11 @@ iscsi_verify12_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
"verify12 cdb."); "verify12 cdb.");
return NULL; return NULL;
} }
if (data != NULL) { d.data = data;
struct scsi_iovec *iov; d.size = datalen;
iov = scsi_malloc(task, sizeof(struct scsi_iovec));
if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
NULL, private_data) != 0) { &d, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1188,6 +1097,7 @@ iscsi_verify16_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data d;
if (datalen % blocksize != 0) { if (datalen % blocksize != 0) {
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the "
@@ -1201,21 +1111,11 @@ iscsi_verify16_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
"verify16 cdb."); "verify16 cdb.");
return NULL; return NULL;
} }
if (data != NULL) { d.data = data;
struct scsi_iovec *iov; d.size = datalen;
iov = scsi_malloc(task, sizeof(struct scsi_iovec));
if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
}
if (iscsi_scsi_command_async(iscsi, lun, task, cb, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
NULL, private_data) != 0) { &d, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1392,6 +1292,7 @@ iscsi_writesame10_task(struct iscsi_context *iscsi, int lun,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data d;
task = scsi_cdb_writesame10(wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks); task = scsi_cdb_writesame10(wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks);
if (task == NULL) { if (task == NULL) {
@@ -1399,27 +1300,17 @@ iscsi_writesame10_task(struct iscsi_context *iscsi, int lun,
"writesame10 cdb."); "writesame10 cdb.");
return NULL; return NULL;
} }
d.data = data;
d.size = datalen;
if (data != NULL) { if (data != NULL) {
struct scsi_iovec *iov;
iov = scsi_malloc(task, sizeof(struct scsi_iovec));
if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
task->expxferlen = datalen; task->expxferlen = datalen;
} else { } else {
task->expxferlen = 0; task->expxferlen = 0;
task->xfer_dir = SCSI_XFER_NONE; task->xfer_dir = SCSI_XFER_NONE;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
NULL, private_data) != 0) { &d, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }
@@ -1436,6 +1327,7 @@ iscsi_writesame16_task(struct iscsi_context *iscsi, int lun,
iscsi_command_cb cb, void *private_data) iscsi_command_cb cb, void *private_data)
{ {
struct scsi_task *task; struct scsi_task *task;
struct iscsi_data d;
task = scsi_cdb_writesame16(wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks); task = scsi_cdb_writesame16(wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks);
if (task == NULL) { if (task == NULL) {
@@ -1443,28 +1335,18 @@ iscsi_writesame16_task(struct iscsi_context *iscsi, int lun,
"writesame16 cdb."); "writesame16 cdb.");
return NULL; return NULL;
} }
d.data = data;
d.size = datalen;
if (data != NULL) { if (data != NULL) {
struct scsi_iovec *iov;
iov = scsi_malloc(task, sizeof(struct scsi_iovec));
if (iov == NULL) {
scsi_free_scsi_task(task);
return NULL;
}
iov->iov_base = data;
iov->iov_len = datalen;
scsi_task_set_iov_out(task, iov, 1);
task->expxferlen = datalen; task->expxferlen = datalen;
} else { } else {
task->expxferlen = 0; task->expxferlen = 0;
task->xfer_dir = SCSI_XFER_NONE; task->xfer_dir = SCSI_XFER_NONE;
} }
if (iscsi_scsi_command_async(iscsi, lun, task, cb, if (iscsi_scsi_command_async(iscsi, lun, task, cb,
NULL, private_data) != 0) { &d, private_data) != 0) {
scsi_free_scsi_task(task); scsi_free_scsi_task(task);
return NULL; return NULL;
} }