From c85042bacb12627dacd25f313d0958939be60dce Mon Sep 17 00:00:00 2001 From: Roy Shterman Date: Fri, 27 May 2016 18:47:22 +0300 Subject: [PATCH] Libiscsi: Introducing new functions for zero-copy write operations iscsi-command: Adding new functions for all write operations (WRITE10, WRITE12, WRITE16, WRITEOR, etc') for cases where the user wants to pass his own io vectors (prevent memcpy). new functions are called iscsi_write*_iov_task and looks very similar to the iscsi_write*_task, only they get scsi_iovec pointer and number of scsi_iovec as parameters. Change-Id: I719552b4cbda4f937975b5df7e77b4844e48cd16 Signed-off-by: Roy Shterman --- include/iscsi.h | 163 ++++++++++++++ lib/iscsi-command.c | 521 ++++++++++++++++++++++++++++++++++++++++++++ lib/libiscsi.def | 22 ++ lib/libiscsi.syms | 22 ++ lib/sync.c | 325 +++++++++++++++++++++++++++ 5 files changed, 1053 insertions(+) diff --git a/include/iscsi.h b/include/iscsi.h index 294182d..f993d19 100644 --- a/include/iscsi.h +++ b/include/iscsi.h @@ -860,11 +860,21 @@ iscsi_write10_task(struct iscsi_context *iscsi, int lun, uint32_t lba, int wrprotect, int dpo, int fua, int fua_nv, int group_number, iscsi_command_cb cb, void *private_data); EXTERN struct scsi_task * +iscsi_write10_iov_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, 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); EXTERN struct scsi_task * +iscsi_writeverify10_iov_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, 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, int rdprotect, int dpo, int fua, int fua_nv, int group_number, @@ -880,11 +890,21 @@ iscsi_write12_task(struct iscsi_context *iscsi, int lun, uint32_t lba, int wrprotect, int dpo, int fua, int fua_nv, int group_number, iscsi_command_cb cb, void *private_data); EXTERN struct scsi_task * +iscsi_write12_iov_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, 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); EXTERN struct scsi_task * +iscsi_writeverify12_iov_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, 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, int rdprotect, int dpo, int fua, int fua_nv, int group_number, @@ -900,16 +920,32 @@ iscsi_write16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, int wrprotect, int dpo, int fua, int fua_nv, int group_number, iscsi_command_cb cb, void *private_data); EXTERN struct scsi_task * +iscsi_write16_iov_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, 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); EXTERN struct scsi_task * +iscsi_writeatomic16_iov_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, + 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); EXTERN struct scsi_task * +iscsi_orwrite_iov_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, 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, int no_flush, int loej, int start, @@ -924,41 +960,83 @@ iscsi_compareandwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba, int wrprotect, int dpo, int fua, int fua_nv, int group_number, iscsi_command_cb cb, void *private_data); EXTERN struct scsi_task * +iscsi_compareandwrite_iov_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, 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); EXTERN struct scsi_task * +iscsi_writeverify16_iov_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, 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); EXTERN struct scsi_task * +iscsi_verify10_iov_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, 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); EXTERN struct scsi_task * +iscsi_verify12_iov_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, 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); EXTERN struct scsi_task * +iscsi_verify16_iov_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, 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); EXTERN struct scsi_task * +iscsi_writesame10_iov_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, + 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); EXTERN struct scsi_task * +iscsi_writesame16_iov_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, + 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, iscsi_command_cb cb, void *private_data); @@ -1079,10 +1157,21 @@ iscsi_write10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba, int wrprotect, int dpo, int fua, int fua_nv, int group_number); EXTERN struct scsi_task * +iscsi_write10_iov_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, + 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); +EXTERN struct scsi_task * +iscsi_writeverify10_iov_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, + struct scsi_iovec *iov, int niov); + EXTERN struct scsi_task * iscsi_read12_sync(struct iscsi_context *iscsi, int lun, uint32_t lba, uint32_t datalen, int blocksize, @@ -1099,11 +1188,23 @@ 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); +EXTERN struct scsi_task * +iscsi_write12_iov_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, + 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); +EXTERN struct scsi_task * +iscsi_writeverify12_iov_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, + struct scsi_iovec *iov, int niov); + EXTERN struct scsi_task * iscsi_read16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba, uint32_t datalen, int blocksize, @@ -1120,16 +1221,34 @@ 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); +EXTERN struct scsi_task * +iscsi_write16_iov_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, + 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); +EXTERN struct scsi_task * +iscsi_writeatomic16_iov_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, + 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); +EXTERN struct scsi_task * +iscsi_orwrite_iov_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, + struct scsi_iovec *iov, int niov); + EXTERN struct scsi_task * iscsi_startstopunit_sync(struct iscsi_context *iscsi, int lun, int immed, int pcm, int pc, @@ -1144,11 +1263,23 @@ 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); +EXTERN struct scsi_task * +iscsi_compareandwrite_iov_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, + 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); +EXTERN struct scsi_task * +iscsi_writeverify16_iov_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, + struct scsi_iovec *iov, int niov); + EXTERN struct scsi_task * iscsi_readcapacity10_sync(struct iscsi_context *iscsi, int lun, int lba, int pmi); @@ -1194,30 +1325,62 @@ iscsi_verify10_sync(struct iscsi_context *iscsi, int lun, int vprotect, int dpo, int bytchk, int blocksize); +EXTERN struct scsi_task * +iscsi_verify10_iov_sync(struct iscsi_context *iscsi, int lun, + unsigned char *data, uint32_t datalen, uint32_t lba, + int vprotect, int dpo, int bytchk, + 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); +EXTERN struct scsi_task * +iscsi_verify12_iov_sync(struct iscsi_context *iscsi, int lun, + unsigned char *data, uint32_t datalen, uint32_t lba, + int vprotect, int dpo, int bytchk, + 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); +EXTERN struct scsi_task * +iscsi_verify16_iov_sync(struct iscsi_context *iscsi, int lun, + unsigned char *data, uint32_t datalen, uint64_t lba, + int vprotect, int dpo, int bytchk, + 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); +EXTERN struct scsi_task * +iscsi_writesame10_iov_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, + 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); +EXTERN struct scsi_task * +iscsi_writesame16_iov_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, + struct scsi_iovec *iov, int niov); + EXTERN struct scsi_task * iscsi_persistent_reserve_in_sync(struct iscsi_context *iscsi, int lun, int sa, uint16_t xferlen); diff --git a/lib/iscsi-command.c b/lib/iscsi-command.c index 5023920..2b33fe7 100644 --- a/lib/iscsi-command.c +++ b/lib/iscsi-command.c @@ -1022,6 +1022,44 @@ iscsi_write10_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return task; } +struct scsi_task * +iscsi_write10_iov_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, struct scsi_iovec *iov, int niov) +{ + struct scsi_task *task; + struct iscsi_data d; + + if (datalen % blocksize != 0) { + iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " + "blocksize:%d.", datalen, blocksize); + return NULL; + } + + task = scsi_cdb_write10(lba, datalen, blocksize, wrprotect, + dpo, fua, fua_nv, group_number); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "write10 cdb."); + return NULL; + } + 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); + return NULL; + } + + return task; +} + struct scsi_task * iscsi_write12_task(struct iscsi_context *iscsi, int lun, uint32_t lba, unsigned char *data, uint32_t datalen, int blocksize, @@ -1056,6 +1094,43 @@ iscsi_write12_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return task; } +struct scsi_task * +iscsi_write12_iov_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, struct scsi_iovec *iov, int niov) +{ + struct scsi_task *task; + struct iscsi_data d; + + if (datalen % blocksize != 0) { + iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " + "blocksize:%d.", datalen, blocksize); + return NULL; + } + + task = scsi_cdb_write12(lba, datalen, blocksize, wrprotect, + dpo, fua, fua_nv, group_number); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "write12 cdb."); + return NULL; + } + 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); + return NULL; + } + + return task; +} + struct scsi_task * iscsi_write16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, unsigned char *data, uint32_t datalen, int blocksize, @@ -1090,6 +1165,43 @@ iscsi_write16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, return task; } +struct scsi_task * +iscsi_write16_iov_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, struct scsi_iovec *iov, int niov) +{ + struct scsi_task *task; + struct iscsi_data d; + + if (datalen % blocksize != 0) { + iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " + "blocksize:%d.", datalen, blocksize); + return NULL; + } + + task = scsi_cdb_write16(lba, datalen, blocksize, wrprotect, + dpo, fua, fua_nv, group_number); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "write16 cdb."); + return NULL; + } + 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); + return NULL; + } + + return task; +} + struct scsi_task * iscsi_writeatomic16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, unsigned char *data, uint32_t datalen, int blocksize, @@ -1124,6 +1236,44 @@ iscsi_writeatomic16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, return task; } +struct scsi_task * +iscsi_writeatomic16_iov_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, + struct scsi_iovec *iov, int niov) +{ + struct scsi_task *task; + struct iscsi_data d; + + if (datalen % blocksize != 0) { + iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " + "blocksize:%d.", datalen, blocksize); + return NULL; + } + + task = scsi_cdb_writeatomic16(lba, datalen, blocksize, wrprotect, + dpo, fua, group_number); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "writeAtomic16 cdb."); + return NULL; + } + 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); + return NULL; + } + + return task; +} + struct scsi_task * iscsi_orwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba, unsigned char *data, uint32_t datalen, int blocksize, @@ -1158,6 +1308,43 @@ iscsi_orwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba, return task; } +struct scsi_task * +iscsi_orwrite_iov_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, struct scsi_iovec *iov, int niov) +{ + struct scsi_task *task; + struct iscsi_data d; + + if (datalen % blocksize != 0) { + iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " + "blocksize:%d.", datalen, blocksize); + return NULL; + } + + task = scsi_cdb_orwrite(lba, datalen, blocksize, wrprotect, + dpo, fua, fua_nv, group_number); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "orwrite cdb."); + return NULL; + } + 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); + return NULL; + } + + return task; +} + struct scsi_task * iscsi_compareandwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba, unsigned char *data, uint32_t datalen, int blocksize, @@ -1192,6 +1379,43 @@ iscsi_compareandwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba, return task; } +struct scsi_task * +iscsi_compareandwrite_iov_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, struct scsi_iovec *iov, int niov) +{ + struct scsi_task *task; + struct iscsi_data d; + + if (datalen % (blocksize * 2) != 0) { + iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " + "blocksize * 2:%d.", datalen, blocksize * 2); + return NULL; + } + + task = scsi_cdb_compareandwrite(lba, datalen, blocksize, wrprotect, + dpo, fua, fua_nv, group_number); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "compareandwrite cdb."); + return NULL; + } + 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); + return NULL; + } + + return task; +} + struct scsi_task * iscsi_writeverify10_task(struct iscsi_context *iscsi, int lun, uint32_t lba, unsigned char *data, uint32_t datalen, int blocksize, @@ -1226,6 +1450,44 @@ iscsi_writeverify10_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return task; } +struct scsi_task * +iscsi_writeverify10_iov_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, + struct scsi_iovec *iov, int niov) +{ + struct scsi_task *task; + struct iscsi_data d; + + if (datalen % blocksize != 0) { + iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " + "blocksize:%d.", datalen, blocksize); + return NULL; + } + + task = scsi_cdb_writeverify10(lba, datalen, blocksize, wrprotect, + dpo, bytchk, group_number); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "writeverify10 cdb."); + return NULL; + } + 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); + return NULL; + } + + return task; +} + struct scsi_task * iscsi_writeverify12_task(struct iscsi_context *iscsi, int lun, uint32_t lba, unsigned char *data, uint32_t datalen, int blocksize, @@ -1260,6 +1522,44 @@ iscsi_writeverify12_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return task; } +struct scsi_task * +iscsi_writeverify12_iov_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, + struct scsi_iovec *iov, int niov) +{ + struct scsi_task *task; + struct iscsi_data d; + + if (datalen % blocksize != 0) { + iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " + "blocksize:%d.", datalen, blocksize); + return NULL; + } + + task = scsi_cdb_writeverify12(lba, datalen, blocksize, wrprotect, + dpo, bytchk, group_number); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "writeverify12 cdb."); + return NULL; + } + 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); + return NULL; + } + + return task; +} + struct scsi_task * iscsi_writeverify16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, unsigned char *data, uint32_t datalen, int blocksize, @@ -1294,6 +1594,44 @@ iscsi_writeverify16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, return task; } +struct scsi_task * +iscsi_writeverify16_iov_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, + struct scsi_iovec *iov, int niov) +{ + struct scsi_task *task; + struct iscsi_data d; + + if (datalen % blocksize != 0) { + iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " + "blocksize:%d.", datalen, blocksize); + return NULL; + } + + task = scsi_cdb_writeverify16(lba, datalen, blocksize, wrprotect, + dpo, bytchk, group_number); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "writeverify16 cdb."); + return NULL; + } + 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); + return NULL; + } + + return task; +} + 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, @@ -1326,6 +1664,41 @@ iscsi_verify10_task(struct iscsi_context *iscsi, int lun, unsigned char *data, return task; } +struct scsi_task * +iscsi_verify10_iov_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, struct scsi_iovec *iov, int niov) +{ + struct scsi_task *task; + struct iscsi_data d; + + if (datalen % blocksize != 0) { + iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " + "blocksize:%d.", datalen, blocksize); + return NULL; + } + + task = scsi_cdb_verify10(lba, datalen, vprotect, dpo, bytchk, blocksize); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "verify10 cdb."); + return NULL; + } + 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); + return NULL; + } + + return task; +} + 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, @@ -1358,6 +1731,41 @@ iscsi_verify12_task(struct iscsi_context *iscsi, int lun, unsigned char *data, return task; } +struct scsi_task * +iscsi_verify12_iov_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, struct scsi_iovec *iov, int niov) +{ + struct scsi_task *task; + struct iscsi_data d; + + if (datalen % blocksize != 0) { + iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " + "blocksize:%d.", datalen, blocksize); + return NULL; + } + + task = scsi_cdb_verify12(lba, datalen, vprotect, dpo, bytchk, blocksize); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "verify12 cdb."); + return NULL; + } + 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); + return NULL; + } + + return task; +} + 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, @@ -1390,6 +1798,41 @@ iscsi_verify16_task(struct iscsi_context *iscsi, int lun, unsigned char *data, return task; } +struct scsi_task * +iscsi_verify16_iov_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, struct scsi_iovec *iov, int niov) +{ + struct scsi_task *task; + struct iscsi_data d; + + if (datalen % blocksize != 0) { + iscsi_set_error(iscsi, "Datalen:%d is not a multiple of the " + "blocksize:%d.", datalen, blocksize); + return NULL; + } + + task = scsi_cdb_verify16(lba, datalen, vprotect, dpo, bytchk, blocksize); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "verify16 cdb."); + return NULL; + } + 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); + return NULL; + } + + return task; +} + struct scsi_task * iscsi_modeselect6_task(struct iscsi_context *iscsi, int lun, int pf, int sp, struct scsi_mode_page *mp, @@ -1729,6 +2172,44 @@ iscsi_writesame10_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return task; } +struct scsi_task * +iscsi_writesame10_iov_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, + struct scsi_iovec *iov, int niov) +{ + struct scsi_task *task; + struct iscsi_data d; + + task = scsi_cdb_writesame10(wrprotect, anchor, unmap, lba, group, + num_blocks, datalen); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "writesame10 cdb."); + return NULL; + } + d.data = data; + d.size = datalen; + + if (iov != NULL) + scsi_task_set_iov_out(task, iov, niov); + + if (data != NULL) { + task->expxferlen = datalen; + } else { + task->expxferlen = 0; + task->xfer_dir = SCSI_XFER_NONE; + } + if (iscsi_scsi_command_async(iscsi, lun, task, cb, + &d, private_data) != 0) { + scsi_free_scsi_task(task); + return NULL; + } + return task; +} + struct scsi_task * iscsi_writesame16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, unsigned char *data, uint32_t datalen, @@ -1765,6 +2246,46 @@ iscsi_writesame16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, return task; } +struct scsi_task * +iscsi_writesame16_iov_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, + struct scsi_iovec *iov, int niov) +{ + struct scsi_task *task; + struct iscsi_data d; + + task = scsi_cdb_writesame16(wrprotect, anchor, unmap, lba, group, + num_blocks, datalen); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "writesame16 cdb."); + return NULL; + } + d.data = data; + d.size = datalen; + + if (iov != NULL) + scsi_task_set_iov_out(task, iov, niov); + + if (data != NULL) { + task->expxferlen = datalen; + } else { + task->expxferlen = 0; + task->xfer_dir = SCSI_XFER_NONE; + } + + if (iscsi_scsi_command_async(iscsi, lun, task, cb, + &d, private_data) != 0) { + scsi_free_scsi_task(task); + return NULL; + } + + return task; +} + struct scsi_task * iscsi_unmap_task(struct iscsi_context *iscsi, int lun, int anchor, int group, struct unmap_list *list, int list_len, diff --git a/lib/libiscsi.def b/lib/libiscsi.def index 7201984..ac9f2f3 100644 --- a/lib/libiscsi.def +++ b/lib/libiscsi.def @@ -149,27 +149,49 @@ iscsi_verify16_sync iscsi_verify16_task iscsi_which_events iscsi_write10_sync +iscsi_write10_iov_sync iscsi_write10_task +iscsi_write10_iov_task iscsi_write12_sync +iscsi_write12_iov_sync iscsi_write12_task +iscsi_write12_iov_task iscsi_write16_sync +iscsi_write16_iov_sync iscsi_write16_task +iscsi_write16_iov_task iscsi_writeatomic16_sync +iscsi_writeatomic16_iov_sync iscsi_writeatomic16_task +iscsi_writeatomic16_iov_task iscsi_orwrite_sync +iscsi_orwrite_iov_sync iscsi_orwrite_task +iscsi_orwrite_iov_task iscsi_compareandwrite_sync +iscsi_compareandwrite_iov_sync iscsi_compareandwrite_task +iscsi_compareandwrite_iov_task iscsi_writeverify10_sync +iscsi_writeverify10_iov_sync iscsi_writeverify10_task +iscsi_writeverify10_iov_task iscsi_writeverify12_sync +iscsi_writeverify12_iov_sync iscsi_writeverify12_task +iscsi_writeverify12_iov_task iscsi_writeverify16_sync +iscsi_writeverify16_iov_sync iscsi_writeverify16_task +iscsi_writeverify16_iov_task iscsi_writesame10_sync +iscsi_writesame10_iov_sync iscsi_writesame10_task +iscsi_writesame10_iov_task iscsi_writesame16_sync +iscsi_writesame16_iov_sync iscsi_writesame16_task +iscsi_writesame16_iov_task scsi_association_to_str scsi_cdb_compareandwrite scsi_cdb_extended_copy diff --git a/lib/libiscsi.syms b/lib/libiscsi.syms index a411448..f1c3723 100644 --- a/lib/libiscsi.syms +++ b/lib/libiscsi.syms @@ -147,27 +147,49 @@ iscsi_verify16_sync iscsi_verify16_task iscsi_which_events iscsi_write10_sync +iscsi_write10_iov_sync iscsi_write10_task +iscsi_write10_iov_task iscsi_write12_sync +iscsi_write12_iov_sync iscsi_write12_task +iscsi_write12_iov_task iscsi_write16_sync +iscsi_write16_iov_sync iscsi_write16_task +iscsi_write16_iov_task iscsi_writeatomic16_sync +iscsi_writeatomic16_iov_sync iscsi_writeatomic16_task +iscsi_writeatomic16_iov_task iscsi_orwrite_sync +iscsi_orwrite_iov_sync iscsi_orwrite_task +iscsi_orwrite_iov_task iscsi_compareandwrite_sync +iscsi_compareandwrite_iov_sync iscsi_compareandwrite_task +iscsi_compareandwrite_iov_task iscsi_writeverify10_sync +iscsi_writeverify10_iov_sync iscsi_writeverify10_task +iscsi_writeverify10_iov_task iscsi_writeverify12_sync +iscsi_writeverify12_iov_sync iscsi_writeverify12_task +iscsi_writeverify12_iov_task iscsi_writeverify16_sync +iscsi_writeverify16_iov_sync iscsi_writeverify16_task +iscsi_writeverify16_iov_task iscsi_writesame10_sync +iscsi_writesame10_iov_sync iscsi_writesame10_task +iscsi_writesame10_iov_task iscsi_writesame16_sync +iscsi_writesame16_iov_sync iscsi_writesame16_task +iscsi_writesame16_iov_task scsi_association_to_str scsi_cdb_compareandwrite scsi_cdb_extended_copy diff --git a/lib/sync.c b/lib/sync.c index 9b52036..c4803ab 100644 --- a/lib/sync.c +++ b/lib/sync.c @@ -866,6 +866,29 @@ iscsi_write10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba, return state.task; } +struct scsi_task * +iscsi_write10_iov_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, + struct scsi_iovec *iov, int niov) +{ + struct iscsi_sync_state state; + + memset(&state, 0, sizeof(state)); + + if (iscsi_write10_iov_task(iscsi, lun, lba, data, datalen, blocksize, + wrprotect, dpo, fua, fua_nv, group_number, + scsi_sync_cb, &state, iov, niov) == NULL) { + iscsi_set_error(iscsi, + "Failed to send Write10 command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + struct scsi_task * iscsi_write12_sync(struct iscsi_context *iscsi, int lun, uint32_t lba, unsigned char *data, uint32_t datalen, int blocksize, @@ -889,6 +912,30 @@ iscsi_write12_sync(struct iscsi_context *iscsi, int lun, uint32_t lba, return state.task; } +struct scsi_task * +iscsi_write12_iov_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, + struct scsi_iovec *iov,int niov) +{ + struct iscsi_sync_state state; + + memset(&state, 0, sizeof(state)); + + if (iscsi_write12_iov_task(iscsi, lun, lba, + data, datalen, blocksize, wrprotect, + dpo, fua, fua_nv, group_number, + scsi_sync_cb, &state, iov, niov) == NULL) { + iscsi_set_error(iscsi, + "Failed to send Write12 command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + struct scsi_task * iscsi_write16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba, unsigned char *data, uint32_t datalen, int blocksize, @@ -912,6 +959,30 @@ iscsi_write16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba, return state.task; } +struct scsi_task * +iscsi_write16_iov_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, + struct scsi_iovec *iov, int niov) +{ + struct iscsi_sync_state state; + + memset(&state, 0, sizeof(state)); + + if (iscsi_write16_iov_task(iscsi, lun, lba, + data, datalen, blocksize, wrprotect, + dpo, fua, fua_nv, group_number, + scsi_sync_cb, &state, iov, niov) == NULL) { + iscsi_set_error(iscsi, + "Failed to send Write16 command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + struct scsi_task * iscsi_writeatomic16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba, unsigned char *data, uint32_t datalen, int blocksize, @@ -935,6 +1006,30 @@ iscsi_writeatomic16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba, return state.task; } +struct scsi_task * +iscsi_writeatomic16_iov_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, + struct scsi_iovec *iov, int niov) +{ + struct iscsi_sync_state state; + + memset(&state, 0, sizeof(state)); + + if (iscsi_writeatomic16_iov_task(iscsi, lun, lba, + data, datalen, blocksize, wrprotect, + dpo, fua, group_number, + scsi_sync_cb, &state, iov, niov) == NULL) { + iscsi_set_error(iscsi, + "Failed to send WriteAtomic16 command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + struct scsi_task * iscsi_orwrite_sync(struct iscsi_context *iscsi, int lun, uint64_t lba, unsigned char *data, uint32_t datalen, int blocksize, @@ -958,6 +1053,30 @@ iscsi_orwrite_sync(struct iscsi_context *iscsi, int lun, uint64_t lba, return state.task; } +struct scsi_task * +iscsi_orwrite_iov_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, + struct scsi_iovec *iov, int niov) +{ + struct iscsi_sync_state state; + + memset(&state, 0, sizeof(state)); + + if (iscsi_orwrite_iov_task(iscsi, lun, lba, + data, datalen, blocksize, wrprotect, + dpo, fua, fua_nv, group_number, + scsi_sync_cb, &state, iov, niov) == NULL) { + iscsi_set_error(iscsi, + "Failed to send Orwrite command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + struct scsi_task * iscsi_compareandwrite_sync(struct iscsi_context *iscsi, int lun, uint64_t lba, unsigned char *data, uint32_t datalen, int blocksize, @@ -981,6 +1100,30 @@ iscsi_compareandwrite_sync(struct iscsi_context *iscsi, int lun, uint64_t lba, return state.task; } +struct scsi_task * +iscsi_compareandwrite_iov_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, + struct scsi_iovec *iov, int niov) +{ + struct iscsi_sync_state state; + + memset(&state, 0, sizeof(state)); + + if (iscsi_compareandwrite_iov_task(iscsi, lun, lba, + data, datalen, blocksize, wrprotect, + dpo, fua, fua_nv, group_number, + scsi_sync_cb, &state, iov, niov) == NULL) { + iscsi_set_error(iscsi, + "Failed to send CompareAndWrite command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + struct scsi_task * iscsi_writeverify10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba, unsigned char *data, uint32_t datalen, int blocksize, @@ -1003,6 +1146,29 @@ iscsi_writeverify10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba, return state.task; } +struct scsi_task * +iscsi_writeverify10_iov_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, + struct scsi_iovec *iov, int niov) +{ + struct iscsi_sync_state state; + + memset(&state, 0, sizeof(state)); + + if (iscsi_writeverify10_iov_task(iscsi, lun, lba, data, datalen, blocksize, + wrprotect, dpo, bytchk, group_number, + scsi_sync_cb, &state, iov, niov) == NULL) { + iscsi_set_error(iscsi, + "Failed to send Writeverify10 command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + struct scsi_task * iscsi_writeverify12_sync(struct iscsi_context *iscsi, int lun, uint32_t lba, unsigned char *data, uint32_t datalen, int blocksize, @@ -1026,6 +1192,30 @@ iscsi_writeverify12_sync(struct iscsi_context *iscsi, int lun, uint32_t lba, return state.task; } +struct scsi_task * +iscsi_writeverify12_iov_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, + struct scsi_iovec *iov, int niov) +{ + struct iscsi_sync_state state; + + memset(&state, 0, sizeof(state)); + + if (iscsi_writeverify12_iov_task(iscsi, lun, lba, + data, datalen, blocksize, wrprotect, + dpo, bytchk, group_number, + scsi_sync_cb, &state, iov, niov) == NULL) { + iscsi_set_error(iscsi, + "Failed to send Writeverify12 command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + struct scsi_task * iscsi_writeverify16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba, unsigned char *data, uint32_t datalen, int blocksize, @@ -1049,6 +1239,30 @@ iscsi_writeverify16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba, return state.task; } +struct scsi_task * +iscsi_writeverify16_iov_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, + struct scsi_iovec *iov, int niov) +{ + struct iscsi_sync_state state; + + memset(&state, 0, sizeof(state)); + + if (iscsi_writeverify16_iov_task(iscsi, lun, lba, + data, datalen, blocksize, wrprotect, + dpo, bytchk, group_number, + scsi_sync_cb, &state, iov, niov) == NULL) { + iscsi_set_error(iscsi, + "Failed to send Writeverify16 command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + 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) @@ -1069,6 +1283,27 @@ iscsi_verify10_sync(struct iscsi_context *iscsi, int lun, unsigned char *data, u return state.task; } +struct scsi_task * +iscsi_verify10_iov_sync(struct iscsi_context *iscsi, int lun, unsigned char *data, uint32_t datalen, uint32_t lba, + 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_iov_task(iscsi, lun, data, datalen, lba, vprotect, dpo, bytchk, blocksize, + scsi_sync_cb, &state, iov, niov) == NULL) { + iscsi_set_error(iscsi, + "Failed to send Verify10 command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + + 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) @@ -1089,6 +1324,26 @@ iscsi_verify12_sync(struct iscsi_context *iscsi, int lun, unsigned char *data, u return state.task; } +struct scsi_task * +iscsi_verify12_iov_sync(struct iscsi_context *iscsi, int lun, unsigned char *data, uint32_t datalen, uint32_t lba, + 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_iov_task(iscsi, lun, data, datalen, lba, vprotect, dpo, bytchk, blocksize, + scsi_sync_cb, &state, iov, niov) == NULL) { + iscsi_set_error(iscsi, + "Failed to send Verify12 command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + 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) @@ -1109,6 +1364,26 @@ iscsi_verify16_sync(struct iscsi_context *iscsi, int lun, unsigned char *data, u return state.task; } +struct scsi_task * +iscsi_verify16_iov_sync(struct iscsi_context *iscsi, int lun, unsigned char *data, uint32_t datalen, uint64_t lba, + 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_iov_task(iscsi, lun, data, datalen, lba, vprotect, dpo, bytchk, blocksize, + scsi_sync_cb, &state, iov, niov) == NULL) { + iscsi_set_error(iscsi, + "Failed to send Verify16 command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + struct scsi_task * iscsi_writesame10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba, unsigned char *data, uint32_t datalen, @@ -1133,6 +1408,31 @@ iscsi_writesame10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba, return state.task; } +struct scsi_task * +iscsi_writesame10_iov_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, + struct scsi_iovec *iov, int niov) +{ + struct iscsi_sync_state state; + + memset(&state, 0, sizeof(state)); + + if (iscsi_writesame10_iov_task(iscsi, lun, lba, + data, datalen, num_blocks, + anchor, unmap, wrprotect, group, + scsi_sync_cb, &state, iov, niov) == NULL) { + iscsi_set_error(iscsi, + "Failed to send WRITESAME10 command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + struct scsi_task * iscsi_writesame16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba, unsigned char *data, uint32_t datalen, @@ -1157,6 +1457,31 @@ iscsi_writesame16_sync(struct iscsi_context *iscsi, int lun, uint64_t lba, return state.task; } +struct scsi_task * +iscsi_writesame16_iov_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, + struct scsi_iovec *iov, int niov) +{ + struct iscsi_sync_state state; + + memset(&state, 0, sizeof(state)); + + if (iscsi_writesame16_iov_task(iscsi, lun, lba, + data, datalen, num_blocks, + anchor, unmap, wrprotect, group, + scsi_sync_cb, &state, iov, niov) == NULL) { + iscsi_set_error(iscsi, + "Failed to send WRITESAME16 command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + struct scsi_task * iscsi_persistent_reserve_in_sync(struct iscsi_context *iscsi, int lun, int sa, uint16_t xferlen)