iscsi-command: Adding struct scsi_iovec and int niov into all
write function (WRITE6, WRITE10, etc') parameters.
In TCP adding pdu to out queue and writing it to the
socket are happening concurrently, so one can add io
vectors to task after adding the pdu of the same task to the outqueue.
In iSER adding the pdu to out queue is equivelent to
sending the packet so one must publish io vectors before
putting the pdu on the out queue.
By doing so, if an application wants to use it's own
iovectors, it's just need to inject the
address of the first scsi_iovec and expected number of
io vectors.
if don't want to use this (application doesn't has
iovectors), putting NULL and 0 will match to
previous code.
examples/iscsi-dd.c | 4 +-
examples/iscsiclient.c | 18 ++++++------
examples/ld_iscsi.c | 2 +-
include/iscsi.h | 57 +++++++++++++++++++-------------------
lib/iscsi-command.c | 71 ++++++++++++++++++++++++++++++++++++++---------
lib/sync.c | 56 +++++++++++++++++++-------------------
6 files changed, 126 insertions(+), 82 deletions(-)
diff --git a/examples/iscsi-dd.c b/examples/iscsi-dd.c
index fadcafb..d1c79a9 100644
--- a/examples/iscsi-dd.c
+++ b/examples/iscsi-dd.c
@@ -131,7 +131,7 @@ void read_cb(struct iscsi_context *iscsi _U_, int status, void *command_data, vo
task2 = iscsi_write16_task(client->dst_iscsi, client->dst_lun,
read16_cdb->lba, task->datain.data, task->datain.size,
client->dst_blocksize, 0, 0, 0, 0, 0,
- write_cb, wt);
+ write_cb, wt, NULL, 0);
} else {
read10_cdb = scsi_cdb_unmarshall(task, SCSI_OPCODE_READ10);
if (read10_cdb == NULL) {
@@ -141,7 +141,7 @@ void read_cb(struct iscsi_context *iscsi _U_, int status, void *command_data, vo
task2 = iscsi_write10_task(client->dst_iscsi, client->dst_lun,
read10_cdb->lba, task->datain.data, task->datain.size,
client->dst_blocksize, 0, 0, 0, 0, 0,
- write_cb, wt);
+ write_cb, wt, NULL, 0);
}
if (task2 == NULL) {
printf("failed to send read16 command\n");
diff --git a/examples/iscsiclient.c b/examples/iscsiclient.c
index 8e6a5a8..8566fff 100644
--- a/examples/iscsiclient.c
+++ b/examples/iscsiclient.c
@@ -152,13 +152,6 @@ void write10_cb(struct iscsi_context *iscsi _U_, int status, void *command_data,
for (i = 0;i < 512; i++) {
wb[i] = (511 - i) & 0xff;
}
- task = iscsi_write10_task(iscsi, clnt->lun, 0, NULL, 512, 512,
- 0, 0, 0, 0, 0,
- write10_1_cb, private_data);
- if (task == NULL) {
- printf("failed to send write10 command\n");
- exit(10);
- }
/* provide iovectors where to read the data.
*/
iov[0].iov_base = &wb[0];
@@ -167,7 +160,14 @@ void write10_cb(struct iscsi_context *iscsi _U_, int status, void *command_data,
iov[1].iov_len = 11;
iov[2].iov_base = &wb[15];
iov[2].iov_len = 512 - 15;
- scsi_task_set_iov_out(task, &iov[0], 3);
+
+ task = iscsi_write10_task(iscsi, clnt->lun, 0, NULL, 512, 512,
+ 0, 0, 0, 0, 0,
+ write10_1_cb, private_data, &iov[0], 3);
+ if (task == NULL) {
+ printf("failed to send write10 command\n");
+ exit(10);
+ }
}
void read10_1_cb(struct iscsi_context *iscsi, int status, void *command_data, void *private_data)
@@ -209,7 +209,7 @@ void read10_1_cb(struct iscsi_context *iscsi, int status, void *command_data, vo
}
task = iscsi_write10_task(iscsi, clnt->lun, 0, wb, 512, 512,
0, 0, 0, 0, 0,
- write10_cb, private_data);
+ write10_cb, private_data, NULL, 0);
if (task == NULL) {
printf("failed to send write10 command\n");
exit(10);
diff --git a/examples/ld_iscsi.c b/examples/ld_iscsi.c
index 5ce0299..2d5e48c 100644
--- a/examples/ld_iscsi.c
+++ b/examples/ld_iscsi.c
@@ -466,7 +466,7 @@ ssize_t write(int fd, const void *buf, size_t count)
iscsi_fd_list[fd].in_flight = 1;
LD_ISCSI_DPRINTF(4,"write16_sync: lun %d, lba %"PRIu64", num_blocks: %"PRIu64", block_size: %d, offset: %"PRIu64" count: %lu",iscsi_fd_list[fd].lun,lba,num_blocks,iscsi_fd_list[fd].block_size,offset,(unsigned long)count);
- task = iscsi_write16_sync(iscsi_fd_list[fd].iscsi, iscsi_fd_list[fd].lun, lba, (unsigned char *) buf, count, iscsi_fd_list[fd].block_size, 0, 0, 0, 0, 0);
+ task = iscsi_write16_sync(iscsi_fd_list[fd].iscsi, iscsi_fd_list[fd].lun, lba, (unsigned char *) buf, count, iscsi_fd_list[fd].block_size, 0, 0, 0, 0, 0, NULL, 0);
iscsi_fd_list[fd].in_flight = 0;
if (task == NULL || task->status != SCSI_STATUS_GOOD) {
LD_ISCSI_DPRINTF(0,"failed to send write16 command");
diff --git a/include/iscsi.h b/include/iscsi.h
index a5fad6d..d11d5c6 100644
--- a/include/iscsi.h
+++ b/include/iscsi.h
@@ -21,6 +21,7 @@
#include <sys/types.h>
#include <string.h>
+#include "scsi-lowlevel.h"
#if defined(WIN32)
#define EXTERN __declspec( dllexport )
#else
@@ -864,12 +865,12 @@ EXTERN struct scsi_task *
iscsi_write10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int fua, int fua_nv, int group_number,
- iscsi_command_cb cb, void *private_data);
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_writeverify10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int bytchk, int group_number,
- iscsi_command_cb cb, void *private_data);
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_read12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
uint32_t datalen, int blocksize,
@@ -879,12 +880,12 @@ EXTERN struct scsi_task *
iscsi_write12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int fua, int fua_nv, int group_number,
- iscsi_command_cb cb, void *private_data);
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_writeverify12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int bytchk, int group_number,
- iscsi_command_cb cb, void *private_data);
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_read16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
uint32_t datalen, int blocksize,
@@ -894,17 +895,17 @@ EXTERN struct scsi_task *
iscsi_write16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int fua, int fua_nv, int group_number,
- iscsi_command_cb cb, void *private_data);
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_writeatomic16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int fua, int group_number,
- iscsi_command_cb cb, void *private_data);
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_orwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int fua, int fua_nv, int group_number,
- iscsi_command_cb cb, void *private_data);
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_startstopunit_task(struct iscsi_context *iscsi, int lun,
int immed, int pcm, int pc,
@@ -918,42 +919,42 @@ EXTERN struct scsi_task *
iscsi_compareandwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int fua, int fua_nv, int group_number,
- iscsi_command_cb cb, void *private_data);
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_writeverify16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int bytchk, int group_number,
- iscsi_command_cb cb, void *private_data);
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_verify10_task(struct iscsi_context *iscsi, int lun,
unsigned char *data, uint32_t datalen, uint32_t lba,
int vprotect, int dpo, int bytchk,
int blocksize, iscsi_command_cb cb,
- void *private_data);
+ void *private_data, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_verify12_task(struct iscsi_context *iscsi, int lun,
unsigned char *data, uint32_t datalen, uint32_t lba,
int vprotect, int dpo, int bytchk,
int blocksize, iscsi_command_cb cb,
- void *private_data);
+ void *private_data, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_verify16_task(struct iscsi_context *iscsi, int lun,
unsigned char *data, uint32_t datalen, uint64_t lba,
int vprotect, int dpo, int bytchk,
int blocksize, iscsi_command_cb cb,
- void *private_data);
+ void *private_data, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_writesame10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen,
uint16_t num_blocks,
int anchor, int unmap, int wrprotect, int group,
- iscsi_command_cb cb, void *private_data);
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_writesame16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen,
uint32_t num_blocks,
int anchor, int unmap, int wrprotect, int group,
- iscsi_command_cb cb, void *private_data);
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_modeselect6_task(struct iscsi_context *iscsi, int lun,
int pf, int sp, struct scsi_mode_page *mp,
@@ -1061,12 +1062,12 @@ iscsi_read10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
EXTERN struct scsi_task *
iscsi_write10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int fua, int fua_nv, int group_number);
+ int wrprotect, int dpo, int fua, int fua_nv, int group_number, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_writeverify10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int bytchk, int group_number);
+ int wrprotect, int dpo, int bytchk, int group_number, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_read12_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
@@ -1076,12 +1077,12 @@ iscsi_read12_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
EXTERN struct scsi_task *
iscsi_write12_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int fua, int fua_nv, int group_number);
+ int wrprotect, int dpo, int fua, int fua_nv, int group_number, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_writeverify12_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int bytchk, int group_number);
+ int wrprotect, int dpo, int bytchk, int group_number, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_read16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
@@ -1091,17 +1092,17 @@ iscsi_read16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
EXTERN struct scsi_task *
iscsi_write16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int fua, int fua_nv, int group_number);
+ int wrprotect, int dpo, int fua, int fua_nv, int group_number, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_writeatomic16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int fua, int group_number);
+ int wrprotect, int dpo, int fua, int group_number, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_orwrite_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int fua, int fua_nv, int group_number);
+ int wrprotect, int dpo, int fua, int fua_nv, int group_number, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_startstopunit_sync(struct iscsi_context *iscsi, int lun,
@@ -1115,12 +1116,12 @@ iscsi_preventallow_sync(struct iscsi_context *iscsi, int lun,
EXTERN struct scsi_task *
iscsi_compareandwrite_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int fua, int fua_nv, int group_number);
+ int wrprotect, int dpo, int fua, int fua_nv, int group_number, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_writeverify16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int bytchk, int group_number);
+ int wrprotect, int dpo, int bytchk, int group_number, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_readcapacity10_sync(struct iscsi_context *iscsi, int lun, int lba,
@@ -1165,31 +1166,31 @@ EXTERN struct scsi_task *
iscsi_verify10_sync(struct iscsi_context *iscsi, int lun,
unsigned char *data, uint32_t datalen, uint32_t lba,
int vprotect, int dpo, int bytchk,
- int blocksize);
+ int blocksize, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_verify12_sync(struct iscsi_context *iscsi, int lun,
unsigned char *data, uint32_t datalen, uint32_t lba,
int vprotect, int dpo, int bytchk,
- int blocksize);
+ int blocksize, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_verify16_sync(struct iscsi_context *iscsi, int lun,
unsigned char *data, uint32_t datalen, uint64_t lba,
int vprotect, int dpo, int bytchk,
- int blocksize);
+ int blocksize, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_writesame10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen,
uint16_t num_blocks,
- int anchor, int unmap, int wrprotect, int group);
+ int anchor, int unmap, int wrprotect, int group, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_writesame16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen,
uint32_t num_blocks,
- int anchor, int unmap, int wrprotect, int group);
+ int anchor, int unmap, int wrprotect, int group, struct scsi_iovec *iov, int niov);
EXTERN struct scsi_task *
iscsi_persistent_reserve_in_sync(struct iscsi_context *iscsi, int lun,
diff --git a/lib/iscsi-command.c b/lib/iscsi-command.c
index 0d25808..acdcef4 100644
--- a/lib/iscsi-command.c
+++ b/lib/iscsi-command.c
@@ -851,7 +851,7 @@ struct scsi_task *
iscsi_write10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int fua, int fua_nv, int group_number,
- iscsi_command_cb cb, void *private_data)
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov)
{
struct scsi_task *task;
struct iscsi_data d;
@@ -872,6 +872,10 @@ iscsi_write10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
d.data = data;
d.size = datalen;
+ if (iov != NULL)
+ scsi_task_set_iov_out(task, iov, niov);
+
+
if (iscsi_scsi_command_async(iscsi, lun, task, cb,
&d, private_data) != 0) {
scsi_free_scsi_task(task);
@@ -885,7 +889,7 @@ struct scsi_task *
iscsi_write12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int fua, int fua_nv, int group_number,
- iscsi_command_cb cb, void *private_data)
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov)
{
struct scsi_task *task;
struct iscsi_data d;
@@ -906,6 +910,9 @@ iscsi_write12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
d.data = data;
d.size = datalen;
+ if (iov != NULL)
+ scsi_task_set_iov_out(task, iov, niov);
+
if (iscsi_scsi_command_async(iscsi, lun, task, cb,
&d, private_data) != 0) {
scsi_free_scsi_task(task);
@@ -919,7 +926,7 @@ struct scsi_task *
iscsi_write16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int fua, int fua_nv, int group_number,
- iscsi_command_cb cb, void *private_data)
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov)
{
struct scsi_task *task;
struct iscsi_data d;
@@ -940,6 +947,9 @@ iscsi_write16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
d.data = data;
d.size = datalen;
+ if (iov != NULL)
+ scsi_task_set_iov_out(task, iov, niov);
+
if (iscsi_scsi_command_async(iscsi, lun, task, cb,
&d, private_data) != 0) {
scsi_free_scsi_task(task);
@@ -953,7 +963,7 @@ struct scsi_task *
iscsi_writeatomic16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int fua, int group_number,
- iscsi_command_cb cb, void *private_data)
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov)
{
struct scsi_task *task;
struct iscsi_data d;
@@ -974,6 +984,9 @@ iscsi_writeatomic16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
d.data = data;
d.size = datalen;
+ if (iov != NULL)
+ scsi_task_set_iov_out(task, iov, niov);
+
if (iscsi_scsi_command_async(iscsi, lun, task, cb,
&d, private_data) != 0) {
scsi_free_scsi_task(task);
@@ -987,7 +1000,7 @@ struct scsi_task *
iscsi_orwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int fua, int fua_nv, int group_number,
- iscsi_command_cb cb, void *private_data)
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov)
{
struct scsi_task *task;
struct iscsi_data d;
@@ -1008,6 +1021,9 @@ iscsi_orwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
d.data = data;
d.size = datalen;
+ if (iov != NULL)
+ scsi_task_set_iov_out(task, iov, niov);
+
if (iscsi_scsi_command_async(iscsi, lun, task, cb,
&d, private_data) != 0) {
scsi_free_scsi_task(task);
@@ -1021,7 +1037,7 @@ struct scsi_task *
iscsi_compareandwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int fua, int fua_nv, int group_number,
- iscsi_command_cb cb, void *private_data)
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov)
{
struct scsi_task *task;
struct iscsi_data d;
@@ -1042,6 +1058,9 @@ iscsi_compareandwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
d.data = data;
d.size = datalen;
+ if (iov != NULL)
+ scsi_task_set_iov_out(task, iov, niov);
+
if (iscsi_scsi_command_async(iscsi, lun, task, cb,
&d, private_data) != 0) {
scsi_free_scsi_task(task);
@@ -1055,7 +1074,7 @@ struct scsi_task *
iscsi_writeverify10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int bytchk, int group_number,
- iscsi_command_cb cb, void *private_data)
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov)
{
struct scsi_task *task;
struct iscsi_data d;
@@ -1076,6 +1095,9 @@ iscsi_writeverify10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
d.data = data;
d.size = datalen;
+ if (iov != NULL)
+ scsi_task_set_iov_out(task, iov, niov);
+
if (iscsi_scsi_command_async(iscsi, lun, task, cb,
&d, private_data) != 0) {
scsi_free_scsi_task(task);
@@ -1089,7 +1111,7 @@ struct scsi_task *
iscsi_writeverify12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int bytchk, int group_number,
- iscsi_command_cb cb, void *private_data)
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov)
{
struct scsi_task *task;
struct iscsi_data d;
@@ -1110,6 +1132,9 @@ iscsi_writeverify12_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
d.data = data;
d.size = datalen;
+ if (iov != NULL)
+ scsi_task_set_iov_out(task, iov, niov);
+
if (iscsi_scsi_command_async(iscsi, lun, task, cb,
&d, private_data) != 0) {
scsi_free_scsi_task(task);
@@ -1123,7 +1148,7 @@ struct scsi_task *
iscsi_writeverify16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
int wrprotect, int dpo, int bytchk, int group_number,
- iscsi_command_cb cb, void *private_data)
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov)
{
struct scsi_task *task;
struct iscsi_data d;
@@ -1144,6 +1169,9 @@ iscsi_writeverify16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
d.data = data;
d.size = datalen;
+ if (iov != NULL)
+ scsi_task_set_iov_out(task, iov, niov);
+
if (iscsi_scsi_command_async(iscsi, lun, task, cb,
&d, private_data) != 0) {
scsi_free_scsi_task(task);
@@ -1156,7 +1184,7 @@ iscsi_writeverify16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
struct scsi_task *
iscsi_verify10_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
uint32_t datalen, uint32_t lba, int vprotect, int dpo, int bytchk, int blocksize,
- iscsi_command_cb cb, void *private_data)
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov)
{
struct scsi_task *task;
struct iscsi_data d;
@@ -1176,6 +1204,9 @@ iscsi_verify10_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
d.data = data;
d.size = datalen;
+ if (iov != NULL)
+ scsi_task_set_iov_out(task, iov, niov);
+
if (iscsi_scsi_command_async(iscsi, lun, task, cb,
&d, private_data) != 0) {
scsi_free_scsi_task(task);
@@ -1188,7 +1219,7 @@ iscsi_verify10_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
struct scsi_task *
iscsi_verify12_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
uint32_t datalen, uint32_t lba, int vprotect, int dpo, int bytchk, int blocksize,
- iscsi_command_cb cb, void *private_data)
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov)
{
struct scsi_task *task;
struct iscsi_data d;
@@ -1208,6 +1239,9 @@ iscsi_verify12_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
d.data = data;
d.size = datalen;
+ if (iov != NULL)
+ scsi_task_set_iov_out(task, iov, niov);
+
if (iscsi_scsi_command_async(iscsi, lun, task, cb,
&d, private_data) != 0) {
scsi_free_scsi_task(task);
@@ -1220,7 +1254,7 @@ iscsi_verify12_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
struct scsi_task *
iscsi_verify16_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
uint32_t datalen, uint64_t lba, int vprotect, int dpo, int bytchk, int blocksize,
- iscsi_command_cb cb, void *private_data)
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov)
{
struct scsi_task *task;
struct iscsi_data d;
@@ -1240,6 +1274,9 @@ iscsi_verify16_task(struct iscsi_context *iscsi, int lun, unsigned char *data,
d.data = data;
d.size = datalen;
+ if (iov != NULL)
+ scsi_task_set_iov_out(task, iov, niov);
+
if (iscsi_scsi_command_async(iscsi, lun, task, cb,
&d, private_data) != 0) {
scsi_free_scsi_task(task);
@@ -1559,7 +1596,7 @@ iscsi_writesame10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen,
uint16_t num_blocks,
int anchor, int unmap, int wrprotect, int group,
- iscsi_command_cb cb, void *private_data)
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov)
{
struct scsi_task *task;
struct iscsi_data d;
@@ -1574,6 +1611,9 @@ iscsi_writesame10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
d.data = data;
d.size = datalen;
+ if (iov != NULL)
+ scsi_task_set_iov_out(task, iov, niov);
+
if (data != NULL) {
task->expxferlen = datalen;
} else {
@@ -1593,7 +1633,7 @@ iscsi_writesame16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen,
uint32_t num_blocks,
int anchor, int unmap, int wrprotect, int group,
- iscsi_command_cb cb, void *private_data)
+ iscsi_command_cb cb, void *private_data, struct scsi_iovec *iov, int niov)
{
struct scsi_task *task;
struct iscsi_data d;
@@ -1608,6 +1648,9 @@ iscsi_writesame16_task(struct iscsi_context *iscsi, int lun, uint64_t lba,
d.data = data;
d.size = datalen;
+ if (iov != NULL)
+ scsi_task_set_iov_out(task, iov, niov);
+
if (data != NULL) {
task->expxferlen = datalen;
} else {
diff --git a/lib/sync.c b/lib/sync.c
index fcbf3da..444425f 100644
--- a/lib/sync.c
+++ b/lib/sync.c
@@ -758,7 +758,7 @@ iscsi_prefetch16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
struct scsi_task *
iscsi_write10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int fua, int fua_nv, int group_number)
+ int wrprotect, int dpo, int fua, int fua_nv, int group_number, struct scsi_iovec *iov, int niov)
{
struct iscsi_sync_state state;
@@ -766,7 +766,7 @@ iscsi_write10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
if (iscsi_write10_task(iscsi, lun, lba, data, datalen, blocksize,
wrprotect, dpo, fua, fua_nv, group_number,
- scsi_sync_cb, &state) == NULL) {
+ scsi_sync_cb, &state, iov, niov) == NULL) {
iscsi_set_error(iscsi,
"Failed to send Write10 command");
return NULL;
@@ -780,7 +780,7 @@ iscsi_write10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
struct scsi_task *
iscsi_write12_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int fua, int fua_nv, int group_number)
+ int wrprotect, int dpo, int fua, int fua_nv, int group_number, struct scsi_iovec *iov,int niov)
{
struct iscsi_sync_state state;
@@ -789,7 +789,7 @@ iscsi_write12_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
if (iscsi_write12_task(iscsi, lun, lba,
data, datalen, blocksize, wrprotect,
dpo, fua, fua_nv, group_number,
- scsi_sync_cb, &state) == NULL) {
+ scsi_sync_cb, &state, iov, niov) == NULL) {
iscsi_set_error(iscsi,
"Failed to send Write12 command");
return NULL;
@@ -803,7 +803,7 @@ iscsi_write12_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
struct scsi_task *
iscsi_write16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int fua, int fua_nv, int group_number)
+ int wrprotect, int dpo, int fua, int fua_nv, int group_number, struct scsi_iovec *iov, int niov)
{
struct iscsi_sync_state state;
@@ -812,7 +812,7 @@ iscsi_write16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
if (iscsi_write16_task(iscsi, lun, lba,
data, datalen, blocksize, wrprotect,
dpo, fua, fua_nv, group_number,
- scsi_sync_cb, &state) == NULL) {
+ scsi_sync_cb, &state, iov, niov) == NULL) {
iscsi_set_error(iscsi,
"Failed to send Write16 command");
return NULL;
@@ -826,7 +826,7 @@ iscsi_write16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
struct scsi_task *
iscsi_writeatomic16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int fua, int group_number)
+ int wrprotect, int dpo, int fua, int group_number, struct scsi_iovec *iov, int niov)
{
struct iscsi_sync_state state;
@@ -835,7 +835,7 @@ iscsi_writeatomic16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
if (iscsi_writeatomic16_task(iscsi, lun, lba,
data, datalen, blocksize, wrprotect,
dpo, fua, group_number,
- scsi_sync_cb, &state) == NULL) {
+ scsi_sync_cb, &state, iov, niov) == NULL) {
iscsi_set_error(iscsi,
"Failed to send WriteAtomic16 command");
return NULL;
@@ -849,7 +849,7 @@ iscsi_writeatomic16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
struct scsi_task *
iscsi_orwrite_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int fua, int fua_nv, int group_number)
+ int wrprotect, int dpo, int fua, int fua_nv, int group_number, struct scsi_iovec *iov, int niov)
{
struct iscsi_sync_state state;
@@ -858,7 +858,7 @@ iscsi_orwrite_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
if (iscsi_orwrite_task(iscsi, lun, lba,
data, datalen, blocksize, wrprotect,
dpo, fua, fua_nv, group_number,
- scsi_sync_cb, &state) == NULL) {
+ scsi_sync_cb, &state, iov, niov) == NULL) {
iscsi_set_error(iscsi,
"Failed to send Orwrite command");
return NULL;
@@ -872,7 +872,7 @@ iscsi_orwrite_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
struct scsi_task *
iscsi_compareandwrite_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int fua, int fua_nv, int group_number)
+ int wrprotect, int dpo, int fua, int fua_nv, int group_number, struct scsi_iovec *iov, int niov)
{
struct iscsi_sync_state state;
@@ -881,7 +881,7 @@ iscsi_compareandwrite_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
if (iscsi_compareandwrite_task(iscsi, lun, lba,
data, datalen, blocksize, wrprotect,
dpo, fua, fua_nv, group_number,
- scsi_sync_cb, &state) == NULL) {
+ scsi_sync_cb, &state, iov, niov) == NULL) {
iscsi_set_error(iscsi,
"Failed to send CompareAndWrite command");
return NULL;
@@ -895,7 +895,7 @@ iscsi_compareandwrite_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
struct scsi_task *
iscsi_writeverify10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int bytchk, int group_number)
+ int wrprotect, int dpo, int bytchk, int group_number, struct scsi_iovec *iov, int niov)
{
struct iscsi_sync_state state;
@@ -903,7 +903,7 @@ iscsi_writeverify10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
if (iscsi_writeverify10_task(iscsi, lun, lba, data, datalen, blocksize,
wrprotect, dpo, bytchk, group_number,
- scsi_sync_cb, &state) == NULL) {
+ scsi_sync_cb, &state, iov, niov) == NULL) {
iscsi_set_error(iscsi,
"Failed to send Writeverify10 command");
return NULL;
@@ -917,7 +917,7 @@ iscsi_writeverify10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
struct scsi_task *
iscsi_writeverify12_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int bytchk, int group_number)
+ int wrprotect, int dpo, int bytchk, int group_number, struct scsi_iovec *iov, int niov)
{
struct iscsi_sync_state state;
@@ -926,7 +926,7 @@ iscsi_writeverify12_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
if (iscsi_writeverify12_task(iscsi, lun, lba,
data, datalen, blocksize, wrprotect,
dpo, bytchk, group_number,
- scsi_sync_cb, &state) == NULL) {
+ scsi_sync_cb, &state, iov, niov) == NULL) {
iscsi_set_error(iscsi,
"Failed to send Writeverify12 command");
return NULL;
@@ -940,7 +940,7 @@ iscsi_writeverify12_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
struct scsi_task *
iscsi_writeverify16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen, int blocksize,
- int wrprotect, int dpo, int bytchk, int group_number)
+ int wrprotect, int dpo, int bytchk, int group_number, struct scsi_iovec *iov, int niov)
{
struct iscsi_sync_state state;
@@ -949,7 +949,7 @@ iscsi_writeverify16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
if (iscsi_writeverify16_task(iscsi, lun, lba,
data, datalen, blocksize, wrprotect,
dpo, bytchk, group_number,
- scsi_sync_cb, &state) == NULL) {
+ scsi_sync_cb, &state, iov, niov) == NULL) {
iscsi_set_error(iscsi,
"Failed to send Writeverify16 command");
return NULL;
@@ -962,14 +962,14 @@ iscsi_writeverify16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
struct scsi_task *
iscsi_verify10_sync(struct iscsi_context *iscsi, int lun, unsigned char *data, uint32_t datalen, uint32_t lba,
- int vprotect, int dpo, int bytchk, int blocksize)
+ int vprotect, int dpo, int bytchk, int blocksize, struct scsi_iovec *iov, int niov)
{
struct iscsi_sync_state state;
memset(&state, 0, sizeof(state));
if (iscsi_verify10_task(iscsi, lun, data, datalen, lba, vprotect, dpo, bytchk, blocksize,
- scsi_sync_cb, &state) == NULL) {
+ scsi_sync_cb, &state, iov, niov) == NULL) {
iscsi_set_error(iscsi,
"Failed to send Verify10 command");
return NULL;
@@ -982,14 +982,14 @@ iscsi_verify10_sync(struct iscsi_context *iscsi, int lun, unsigned char *data, u
struct scsi_task *
iscsi_verify12_sync(struct iscsi_context *iscsi, int lun, unsigned char *data, uint32_t datalen, uint32_t lba,
- int vprotect, int dpo, int bytchk, int blocksize)
+ int vprotect, int dpo, int bytchk, int blocksize, struct scsi_iovec *iov, int niov)
{
struct iscsi_sync_state state;
memset(&state, 0, sizeof(state));
if (iscsi_verify12_task(iscsi, lun, data, datalen, lba, vprotect, dpo, bytchk, blocksize,
- scsi_sync_cb, &state) == NULL) {
+ scsi_sync_cb, &state, iov, niov) == NULL) {
iscsi_set_error(iscsi,
"Failed to send Verify12 command");
return NULL;
@@ -1002,14 +1002,14 @@ iscsi_verify12_sync(struct iscsi_context *iscsi, int lun, unsigned char *data, u
struct scsi_task *
iscsi_verify16_sync(struct iscsi_context *iscsi, int lun, unsigned char *data, uint32_t datalen, uint64_t lba,
- int vprotect, int dpo, int bytchk, int blocksize)
+ int vprotect, int dpo, int bytchk, int blocksize, struct scsi_iovec *iov, int niov)
{
struct iscsi_sync_state state;
memset(&state, 0, sizeof(state));
if (iscsi_verify16_task(iscsi, lun, data, datalen, lba, vprotect, dpo, bytchk, blocksize,
- scsi_sync_cb, &state) == NULL) {
+ scsi_sync_cb, &state, iov, niov) == NULL) {
iscsi_set_error(iscsi,
"Failed to send Verify16 command");
return NULL;
@@ -1024,7 +1024,7 @@ struct scsi_task *
iscsi_writesame10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
unsigned char *data, uint32_t datalen,
uint16_t num_blocks,
- int anchor, int unmap, int wrprotect, int group)
+ int anchor, int unmap, int wrprotect, int group, struct scsi_iovec *iov, int niov)
{
struct iscsi_sync_state state;
@@ -1033,7 +1033,7 @@ iscsi_writesame10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
if (iscsi_writesame10_task(iscsi, lun, lba,
data, datalen, num_blocks,
anchor, unmap, wrprotect, group,
- scsi_sync_cb, &state) == NULL) {
+ scsi_sync_cb, &state, iov, niov) == NULL) {
iscsi_set_error(iscsi,
"Failed to send WRITESAME10 command");
return NULL;
@@ -1048,7 +1048,7 @@ struct scsi_task *
iscsi_writesame16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
unsigned char *data, uint32_t datalen,
uint32_t num_blocks,
- int anchor, int unmap, int wrprotect, int group)
+ int anchor, int unmap, int wrprotect, int group, struct scsi_iovec *iov, int niov)
{
struct iscsi_sync_state state;
@@ -1057,7 +1057,7 @@ iscsi_writesame16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba,
if (iscsi_writesame16_task(iscsi, lun, lba,
data, datalen, num_blocks,
anchor, unmap, wrprotect, group,
- scsi_sync_cb, &state) == NULL) {
+ scsi_sync_cb, &state, iov, niov) == NULL) {
iscsi_set_error(iscsi,
"Failed to send WRITESAME16 command");
return NULL;
--
1.7.8.2