From 7704215bcc5b6ddcaf3179740a5de2690ea50ae9 Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Thu, 29 Nov 2012 19:08:57 -0800 Subject: [PATCH] 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__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. --- lib/iscsi-command.c | 230 +++++++++++--------------------------------- 1 file changed, 56 insertions(+), 174 deletions(-) diff --git a/lib/iscsi-command.c b/lib/iscsi-command.c index 3f344fe..ad8c9a5 100644 --- a/lib/iscsi-command.c +++ b/lib/iscsi-command.c @@ -134,9 +134,8 @@ iscsi_send_data_out(struct iscsi_context *iscsi, struct iscsi_pdu *cmd_pdu, return 0; } -/* Using 'struct iscsi_data *d' for data-out is depreciated. - * Instead the task should have a data-out iovector attached to it. - * See iscsi_write10_task for an example. +/* Using 'struct iscsi_data *d' for data-out is optional + * and will be converted into a one element data-out iovector. */ int 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; } - /* Convert old-style callers to the new 'iovector assigned to the task structure' - * model. + /* We got an actual buffer from the application. Convert it to + * a data-out iovector. */ if (d != NULL && d->data != NULL) { 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) { struct scsi_task *task; + struct iscsi_data d; if (datalen % blocksize != 0) { 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."); return 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); - } + d.data = data; + d.size = datalen; if (iscsi_scsi_command_async(iscsi, lun, task, cb, - NULL, private_data) != 0) { + &d, private_data) != 0) { scsi_free_scsi_task(task); 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) { struct scsi_task *task; + struct iscsi_data d; if (datalen % blocksize != 0) { 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."); return 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); - } + d.data = data; + d.size = datalen; if (iscsi_scsi_command_async(iscsi, lun, task, cb, - NULL, private_data) != 0) { + &d, private_data) != 0) { scsi_free_scsi_task(task); 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) { struct scsi_task *task; + struct iscsi_data d; if (datalen % blocksize != 0) { 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."); return 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); - } + d.data = data; + d.size = datalen; if (iscsi_scsi_command_async(iscsi, lun, task, cb, - NULL, private_data) != 0) { + &d, private_data) != 0) { scsi_free_scsi_task(task); 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) { struct scsi_task *task; + struct iscsi_data d; if (datalen % blocksize != 0) { 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."); return 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); - } + d.data = data; + d.size = datalen; if (iscsi_scsi_command_async(iscsi, lun, task, cb, - NULL, private_data) != 0) { + &d, private_data) != 0) { scsi_free_scsi_task(task); 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) { struct scsi_task *task; + struct iscsi_data d; if (datalen % blocksize != 0) { 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."); return 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); - } + d.data = data; + d.size = datalen; if (iscsi_scsi_command_async(iscsi, lun, task, cb, - NULL, private_data) != 0) { + &d, private_data) != 0) { scsi_free_scsi_task(task); 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) { struct scsi_task *task; + struct iscsi_data d; if (datalen % blocksize != 0) { 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."); return 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); - } + d.data = data; + d.size = datalen; if (iscsi_scsi_command_async(iscsi, lun, task, cb, - NULL, private_data) != 0) { + &d, private_data) != 0) { scsi_free_scsi_task(task); 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) { struct scsi_task *task; + struct iscsi_data d; if (datalen % blocksize != 0) { 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."); return 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); - } + d.data = data; + d.size = datalen; if (iscsi_scsi_command_async(iscsi, lun, task, cb, - NULL, private_data) != 0) { + &d, private_data) != 0) { scsi_free_scsi_task(task); 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) { struct scsi_task *task; + struct iscsi_data d; if (datalen % blocksize != 0) { 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."); return 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); - } + d.data = data; + d.size = datalen; if (iscsi_scsi_command_async(iscsi, lun, task, cb, - NULL, private_data) != 0) { + &d, private_data) != 0) { scsi_free_scsi_task(task); 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) { struct scsi_task *task; + struct iscsi_data d; if (datalen % blocksize != 0) { 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."); return 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); - } + d.data = data; + d.size = datalen; if (iscsi_scsi_command_async(iscsi, lun, task, cb, - NULL, private_data) != 0) { + &d, private_data) != 0) { scsi_free_scsi_task(task); 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) { struct scsi_task *task; + struct iscsi_data d; if (datalen % blocksize != 0) { 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."); return 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); - } + d.data = data; + d.size = datalen; if (iscsi_scsi_command_async(iscsi, lun, task, cb, - NULL, private_data) != 0) { + &d, private_data) != 0) { scsi_free_scsi_task(task); 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) { struct scsi_task *task; + struct iscsi_data d; if (datalen % blocksize != 0) { 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."); return 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); - } + d.data = data; + d.size = datalen; if (iscsi_scsi_command_async(iscsi, lun, task, cb, - NULL, private_data) != 0) { + &d, private_data) != 0) { scsi_free_scsi_task(task); return NULL; } @@ -1392,6 +1292,7 @@ iscsi_writesame10_task(struct iscsi_context *iscsi, int lun, iscsi_command_cb cb, void *private_data) { struct scsi_task *task; + struct iscsi_data d; task = scsi_cdb_writesame10(wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks); if (task == NULL) { @@ -1399,27 +1300,17 @@ iscsi_writesame10_task(struct iscsi_context *iscsi, int lun, "writesame10 cdb."); return NULL; } + d.data = data; + d.size = datalen; 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; - } else { task->expxferlen = 0; task->xfer_dir = SCSI_XFER_NONE; } if (iscsi_scsi_command_async(iscsi, lun, task, cb, - NULL, private_data) != 0) { + &d, private_data) != 0) { scsi_free_scsi_task(task); return NULL; } @@ -1436,6 +1327,7 @@ iscsi_writesame16_task(struct iscsi_context *iscsi, int lun, iscsi_command_cb cb, void *private_data) { struct scsi_task *task; + struct iscsi_data d; task = scsi_cdb_writesame16(wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks); if (task == NULL) { @@ -1443,28 +1335,18 @@ iscsi_writesame16_task(struct iscsi_context *iscsi, int lun, "writesame16 cdb."); return NULL; } + d.data = data; + d.size = datalen; 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; - } else { task->expxferlen = 0; task->xfer_dir = SCSI_XFER_NONE; } if (iscsi_scsi_command_async(iscsi, lun, task, cb, - NULL, private_data) != 0) { + &d, private_data) != 0) { scsi_free_scsi_task(task); return NULL; }