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)