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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user