diff --git a/include/iscsi.h b/include/iscsi.h index fde65c8..461a758 100644 --- a/include/iscsi.h +++ b/include/iscsi.h @@ -955,8 +955,8 @@ EXTERN int scsi_task_add_data_in_buffer(struct scsi_task *task, int len, unsigne * To cancel the task also a the target you need to call the task management functions. */ EXTERN int -iscsi_scsi_task_cancel(struct iscsi_context *iscsi, - struct scsi_task *task); +iscsi_scsi_cancel_task(struct iscsi_context *iscsi, + struct scsi_task *task); /* * This function is used when you want to cancel all scsi tasks. diff --git a/include/scsi-lowlevel.h b/include/scsi-lowlevel.h index 0f7face..38787c1 100644 --- a/include/scsi-lowlevel.h +++ b/include/scsi-lowlevel.h @@ -17,6 +17,12 @@ #ifndef __scsi_lowlevel_h__ #define __scsi_lowlevel_h__ +#if defined(WIN32) +#define EXTERN __declspec( dllexport ) +#else +#define EXTERN +#endif + #ifdef __cplusplus extern "C" { #endif @@ -123,7 +129,7 @@ enum scsi_xfer_dir { /* * READTOC */ -EXTERN struct scsi_task *scsi_cdb_readtoc(struct iscsi_context *iscsi, int msf, int format, int track_session, uint16_t alloc_len); +EXTERN struct scsi_task *scsi_cdb_readtoc(int msf, int format, int track_session, uint16_t alloc_len); enum scsi_readtoc_fmt { SCSI_READ_TOC = 0, @@ -299,11 +305,6 @@ struct scsi_data { unsigned char *data; }; -struct scsi_allocated_memory { - struct scsi_allocated_memory *next; - void *ptr; -}; - enum scsi_residual { SCSI_RESIDUAL_NO_RESIDUAL = 0, SCSI_RESIDUAL_UNDERFLOW, @@ -312,10 +313,10 @@ enum scsi_residual { struct scsi_task { int status; + int cdb_size; int xfer_dir; int expxferlen; - struct iscsi_context * iscsi; unsigned char cdb[SCSI_CDB_MAX_SIZE]; union { struct scsi_read6_params read6; @@ -361,7 +362,7 @@ struct scsi_task { /* This function will free a scsi task structure. You may NOT cancel a task until the callback has been invoked - and the command has completed on the iscsi layer. + and the command has completed on the transport layer. */ EXTERN void scsi_free_scsi_task(struct scsi_task *task); @@ -371,7 +372,8 @@ EXTERN void *scsi_get_task_private_ptr(struct scsi_task *task); /* * TESTUNITREADY */ -EXTERN struct scsi_task *scsi_cdb_testunitready(struct iscsi_context *iscsi); +EXTERN struct scsi_task *scsi_cdb_testunitready(void); + /* * REPORTLUNS @@ -385,16 +387,16 @@ struct scsi_reportluns_list { uint16_t luns[0]; }; -EXTERN struct scsi_task *scsi_reportluns_cdb(struct iscsi_context *iscsi, int report_type, int alloc_len); +EXTERN struct scsi_task *scsi_reportluns_cdb(int report_type, int alloc_len); /* * RESERVE6 */ -EXTERN struct scsi_task *scsi_cdb_reserve6(struct iscsi_context *iscsi); +EXTERN struct scsi_task *scsi_cdb_reserve6(void); /* * RELEASE6 */ -EXTERN struct scsi_task *scsi_cdb_release6(struct iscsi_context *iscsi); +EXTERN struct scsi_task *scsi_cdb_release6(void); /* * READCAPACITY10 @@ -403,7 +405,7 @@ struct scsi_readcapacity10 { uint32_t lba; uint32_t block_size; }; -EXTERN struct scsi_task *scsi_cdb_readcapacity10(struct iscsi_context *iscsi, int lba, int pmi); +EXTERN struct scsi_task *scsi_cdb_readcapacity10(int lba, int pmi); /* @@ -563,7 +565,7 @@ struct scsi_inquiry_logical_block_provisioning { enum scsi_inquiry_provisioning_type provisioning_type; }; -EXTERN struct scsi_task *scsi_cdb_inquiry(struct iscsi_context *iscsi, int evpd, int page_code, int alloc_len); +EXTERN struct scsi_task *scsi_cdb_inquiry(int evpd, int page_code, int alloc_len); struct scsi_inquiry_unit_serial_number { enum scsi_inquiry_peripheral_qualifier qualifier; @@ -733,8 +735,7 @@ struct scsi_mode_sense { struct scsi_mode_page *pages; }; -EXTERN struct scsi_task *scsi_cdb_modesense6(struct iscsi_context *iscsi, - int dbd, +EXTERN struct scsi_task *scsi_cdb_modesense6(int dbd, enum scsi_modesense_page_control pc, enum scsi_modesense_page_code page_code, int sub_page_code, @@ -799,37 +800,37 @@ struct scsi_report_supported_op_codes { EXTERN int scsi_datain_getfullsize(struct scsi_task *task); EXTERN void *scsi_datain_unmarshall(struct scsi_task *task); -EXTERN struct scsi_task *scsi_cdb_read6(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize); -EXTERN struct scsi_task *scsi_cdb_read10(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize, int rdprotect, int dpo, int fua, int fua_nv, int group_number); -EXTERN struct scsi_task *scsi_cdb_read12(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize, int rdprotect, int dpo, int fua, int fua_nv, int group_number); -EXTERN struct scsi_task *scsi_cdb_read16(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, int blocksize, int rdprotect, int dpo, int fua, int fua_nv, int group_number); -EXTERN struct scsi_task *scsi_cdb_write10(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number); -EXTERN struct scsi_task *scsi_cdb_write12(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number); -EXTERN struct scsi_task *scsi_cdb_write16(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number); -EXTERN struct scsi_task *scsi_cdb_startstopunit(struct iscsi_context *iscsi, int immed, int pcm, int pc, int no_flush, int loej, int start); -EXTERN struct scsi_task *scsi_cdb_preventallow(struct iscsi_context *iscsi, int prevent); -EXTERN struct scsi_task *scsi_cdb_orwrite(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number); -EXTERN struct scsi_task *scsi_cdb_compareandwrite(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number); -EXTERN struct scsi_task *scsi_cdb_writeverify10(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number); -EXTERN struct scsi_task *scsi_cdb_writeverify12(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number); -EXTERN struct scsi_task *scsi_cdb_writeverify16(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number); -EXTERN struct scsi_task *scsi_cdb_verify10(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize); -EXTERN struct scsi_task *scsi_cdb_verify12(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize); -EXTERN struct scsi_task *scsi_cdb_verify16(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize); +EXTERN struct scsi_task *scsi_cdb_read6(uint32_t lba, uint32_t xferlen, int blocksize); +EXTERN struct scsi_task *scsi_cdb_read10(uint32_t lba, uint32_t xferlen, int blocksize, int rdprotect, int dpo, int fua, int fua_nv, int group_number); +EXTERN struct scsi_task *scsi_cdb_read12(uint32_t lba, uint32_t xferlen, int blocksize, int rdprotect, int dpo, int fua, int fua_nv, int group_number); +EXTERN struct scsi_task *scsi_cdb_read16(uint64_t lba, uint32_t xferlen, int blocksize, int rdprotect, int dpo, int fua, int fua_nv, int group_number); +EXTERN struct scsi_task *scsi_cdb_write10(uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number); +EXTERN struct scsi_task *scsi_cdb_write12(uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number); +EXTERN struct scsi_task *scsi_cdb_write16(uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number); +EXTERN struct scsi_task *scsi_cdb_startstopunit(int immed, int pcm, int pc, int no_flush, int loej, int start); +EXTERN struct scsi_task *scsi_cdb_preventallow(int prevent); +EXTERN struct scsi_task *scsi_cdb_orwrite(uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number); +EXTERN struct scsi_task *scsi_cdb_compareandwrite(uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number); +EXTERN struct scsi_task *scsi_cdb_writeverify10(uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number); +EXTERN struct scsi_task *scsi_cdb_writeverify12(uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number); +EXTERN struct scsi_task *scsi_cdb_writeverify16(uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number); +EXTERN struct scsi_task *scsi_cdb_verify10(uint32_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize); +EXTERN struct scsi_task *scsi_cdb_verify12(uint32_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize); +EXTERN struct scsi_task *scsi_cdb_verify16(uint64_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize); -EXTERN struct scsi_task *scsi_cdb_synchronizecache10(struct iscsi_context *iscsi, int lba, int num_blocks, +EXTERN struct scsi_task *scsi_cdb_synchronizecache10(int lba, int num_blocks, int syncnv, int immed); -EXTERN struct scsi_task *scsi_cdb_synchronizecache16(struct iscsi_context *iscsi, uint64_t lba, uint32_t num_blocks, +EXTERN struct scsi_task *scsi_cdb_synchronizecache16(uint64_t lba, uint32_t num_blocks, int syncnv, int immed); -EXTERN struct scsi_task *scsi_cdb_serviceactionin16(struct iscsi_context *iscsi, enum scsi_service_action_in sa, uint32_t xferlen); -EXTERN struct scsi_task *scsi_cdb_readcapacity16(struct iscsi_context *iscsi); -EXTERN struct scsi_task *scsi_cdb_get_lba_status(struct iscsi_context *iscsi, uint64_t starting_lba, uint32_t alloc_len); -EXTERN struct scsi_task *scsi_cdb_unmap(struct iscsi_context *iscsi, int anchor, int group, uint16_t xferlen); -EXTERN struct scsi_task *scsi_cdb_writesame10(struct iscsi_context *iscsi, int wrprotect, int anchor, int unmap, int pbdata, int lbdata, uint32_t lba, int group, uint16_t num_blocks); -EXTERN struct scsi_task *scsi_cdb_writesame16(struct iscsi_context *iscsi, int wrprotect, int anchor, int unmap, int pbdata, int lbdata, uint64_t lba, int group, uint32_t num_blocks); -EXTERN struct scsi_task *scsi_cdb_prefetch10(struct iscsi_context *iscsi, uint32_t lba, int num_blocks, int immed, int group); -EXTERN struct scsi_task *scsi_cdb_prefetch16(struct iscsi_context *iscsi, uint64_t lba, int num_blocks, int immed, int group); -EXTERN struct scsi_task *scsi_cdb_report_supported_opcodes(struct iscsi_context *iscsi, int report_timeouts, uint32_t alloc_len); +EXTERN struct scsi_task *scsi_cdb_serviceactionin16(enum scsi_service_action_in sa, uint32_t xferlen); +EXTERN struct scsi_task *scsi_cdb_readcapacity16(void); +EXTERN struct scsi_task *scsi_cdb_get_lba_status(uint64_t starting_lba, uint32_t alloc_len); +EXTERN struct scsi_task *scsi_cdb_unmap(int anchor, int group, uint16_t xferlen); +EXTERN struct scsi_task *scsi_cdb_writesame10(int wrprotect, int anchor, int unmap, int pbdata, int lbdata, uint32_t lba, int group, uint16_t num_blocks); +EXTERN struct scsi_task *scsi_cdb_writesame16(int wrprotect, int anchor, int unmap, int pbdata, int lbdata, uint64_t lba, int group, uint32_t num_blocks); +EXTERN struct scsi_task *scsi_cdb_prefetch10(uint32_t lba, int num_blocks, int immed, int group); +EXTERN struct scsi_task *scsi_cdb_prefetch16(uint64_t lba, int num_blocks, int immed, int group); +EXTERN struct scsi_task *scsi_cdb_report_supported_opcodes(int report_timeouts, uint32_t alloc_len); void *scsi_malloc(struct scsi_task *task, size_t size); @@ -838,4 +839,3 @@ void *scsi_malloc(struct scsi_task *task, size_t size); #endif #endif /* __scsi_lowlevel_h__ */ - diff --git a/lib/libiscsi.def b/lib/libiscsi.def index 95f4552..d8f6f5a 100644 --- a/lib/libiscsi.def +++ b/lib/libiscsi.def @@ -61,7 +61,7 @@ iscsi_reportluns_task iscsi_scsi_cancel_all_tasks iscsi_scsi_command_async iscsi_scsi_command_sync -iscsi_scsi_task_cancel +iscsi_scsi_cancel_task iscsi_service iscsi_set_alias iscsi_set_debug diff --git a/lib/libiscsi.syms b/lib/libiscsi.syms index 4eaeb67..78a5cf8 100644 --- a/lib/libiscsi.syms +++ b/lib/libiscsi.syms @@ -59,7 +59,7 @@ iscsi_reportluns_task iscsi_scsi_cancel_all_tasks iscsi_scsi_command_async iscsi_scsi_command_sync -iscsi_scsi_task_cancel +iscsi_scsi_cancel_task iscsi_service iscsi_set_alias iscsi_set_debug diff --git a/lib/scsi-command.c b/lib/scsi-command.c index 57c50d3..fbbd016 100644 --- a/lib/scsi-command.c +++ b/lib/scsi-command.c @@ -85,11 +85,10 @@ iscsi_send_data_out(struct iscsi_context *iscsi, struct iscsi_pdu *cmd_pdu, len = iscsi->target_max_recv_data_segment_length; } - pdu = iscsi_allocate_pdu_with_itt_flags_size(iscsi, ISCSI_PDU_DATA_OUT, + pdu = iscsi_allocate_pdu_with_itt_flags(iscsi, ISCSI_PDU_DATA_OUT, ISCSI_PDU_NO_PDU, cmd_pdu->itt, - ISCSI_PDU_DELETE_WHEN_SENT|ISCSI_PDU_NO_CALLBACK, - len); + ISCSI_PDU_DELETE_WHEN_SENT|ISCSI_PDU_NO_CALLBACK); if (pdu == NULL) { iscsi_set_error(iscsi, "Out-of-memory, Failed to allocate " "scsi data out pdu."); @@ -193,22 +192,15 @@ iscsi_scsi_command_async(struct iscsi_context *iscsi, int lun, "scsi cbdata."); return -1; } + scsi_cbdata->task = task; scsi_cbdata->callback = cb; scsi_cbdata->private_data = private_data; scsi_set_task_private_ptr(task, scsi_cbdata); - u_int32_t payload_size = 0; - if (iscsi->use_immediate_data == ISCSI_IMMEDIATE_DATA_YES) { - payload_size=data.size; - if (payload_size > iscsi->first_burst_length) { - payload_size = iscsi->first_burst_length; - } - } - - pdu = iscsi_allocate_pdu_size(iscsi, ISCSI_PDU_SCSI_REQUEST, - ISCSI_PDU_SCSI_RESPONSE, payload_size); + pdu = iscsi_allocate_pdu(iscsi, ISCSI_PDU_SCSI_REQUEST, + ISCSI_PDU_SCSI_RESPONSE); if (pdu == NULL) { iscsi_set_error(iscsi, "Out-of-memory, Failed to allocate " "scsi pdu."); @@ -392,7 +384,7 @@ iscsi_process_scsi_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, break; case SCSI_STATUS_CHECK_CONDITION: task->datain.size = in->data_pos; - task->datain.data = iscsi_malloc(iscsi, task->datain.size); + task->datain.data = malloc(task->datain.size); if (task->datain.data == NULL) { iscsi_set_error(iscsi, "failed to allocate blob for " "sense data"); @@ -541,7 +533,7 @@ iscsi_testunitready_task(struct iscsi_context *iscsi, int lun, { struct scsi_task *task; - task = scsi_cdb_testunitready(iscsi); + task = scsi_cdb_testunitready(); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "testunitready cdb."); @@ -569,7 +561,7 @@ iscsi_reportluns_task(struct iscsi_context *iscsi, int report_type, return NULL; } - task = scsi_reportluns_cdb(iscsi, report_type, alloc_len); + task = scsi_reportluns_cdb(report_type, alloc_len); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "reportluns cdb."); @@ -592,7 +584,7 @@ iscsi_inquiry_task(struct iscsi_context *iscsi, int lun, int evpd, { struct scsi_task *task; - task = scsi_cdb_inquiry(iscsi, evpd, page_code, maxsize); + task = scsi_cdb_inquiry(evpd, page_code, maxsize); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "inquiry cdb."); @@ -613,7 +605,7 @@ iscsi_readcapacity10_task(struct iscsi_context *iscsi, int lun, int lba, { struct scsi_task *task; - task = scsi_cdb_readcapacity10(iscsi, lba, pmi); + task = scsi_cdb_readcapacity10(lba, pmi); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "readcapacity10 cdb."); @@ -634,7 +626,7 @@ iscsi_readcapacity16_task(struct iscsi_context *iscsi, int lun, { struct scsi_task *task; - task = scsi_cdb_readcapacity16(iscsi); + task = scsi_cdb_readcapacity16(); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "readcapacity16 cdb."); @@ -656,7 +648,7 @@ iscsi_get_lba_status_task(struct iscsi_context *iscsi, int lun, { struct scsi_task *task; - task = scsi_cdb_get_lba_status(iscsi, starting_lba, alloc_len); + task = scsi_cdb_get_lba_status(starting_lba, alloc_len); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "get-lba-status cdb."); @@ -684,7 +676,7 @@ iscsi_read6_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return NULL; } - task = scsi_cdb_read6(iscsi, lba, datalen, blocksize); + task = scsi_cdb_read6(lba, datalen, blocksize); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "read6 cdb."); @@ -713,7 +705,7 @@ iscsi_read10_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return NULL; } - task = scsi_cdb_read10(iscsi, lba, datalen, blocksize, rdprotect, + task = scsi_cdb_read10(lba, datalen, blocksize, rdprotect, dpo, fua, fua_nv, group_number); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -743,7 +735,7 @@ iscsi_read12_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return NULL; } - task = scsi_cdb_read12(iscsi, lba, datalen, blocksize, rdprotect, + task = scsi_cdb_read12(lba, datalen, blocksize, rdprotect, dpo, fua, fua_nv, group_number); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -773,7 +765,7 @@ iscsi_read16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, return NULL; } - task = scsi_cdb_read16(iscsi, lba, datalen, blocksize, rdprotect, + task = scsi_cdb_read16(lba, datalen, blocksize, rdprotect, dpo, fua, fua_nv, group_number); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -804,7 +796,7 @@ iscsi_write10_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return NULL; } - task = scsi_cdb_write10(iscsi, lba, datalen, blocksize, wrprotect, + 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 " @@ -839,7 +831,7 @@ iscsi_write12_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return NULL; } - task = scsi_cdb_write12(iscsi, lba, datalen, blocksize, wrprotect, + 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 " @@ -874,7 +866,7 @@ iscsi_write16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, return NULL; } - task = scsi_cdb_write16(iscsi, lba, datalen, blocksize, wrprotect, + 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 " @@ -909,7 +901,7 @@ iscsi_orwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba, return NULL; } - task = scsi_cdb_orwrite(iscsi, lba, datalen, blocksize, wrprotect, + 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 " @@ -944,7 +936,7 @@ iscsi_compareandwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba, return NULL; } - task = scsi_cdb_compareandwrite(iscsi, lba, datalen, blocksize, wrprotect, + 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 " @@ -979,7 +971,7 @@ iscsi_writeverify10_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return NULL; } - task = scsi_cdb_writeverify10(iscsi, lba, datalen, blocksize, wrprotect, + 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 " @@ -1014,7 +1006,7 @@ iscsi_writeverify12_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return NULL; } - task = scsi_cdb_writeverify12(iscsi, lba, datalen, blocksize, wrprotect, + 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 " @@ -1049,7 +1041,7 @@ iscsi_writeverify16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, return NULL; } - task = scsi_cdb_writeverify16(iscsi, lba, datalen, blocksize, wrprotect, + 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 " @@ -1083,7 +1075,7 @@ iscsi_verify10_task(struct iscsi_context *iscsi, int lun, unsigned char *data, return NULL; } - task = scsi_cdb_verify10(iscsi, lba, datalen, vprotect, dpo, bytchk, blocksize); + 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."); @@ -1116,7 +1108,7 @@ iscsi_verify12_task(struct iscsi_context *iscsi, int lun, unsigned char *data, return NULL; } - task = scsi_cdb_verify12(iscsi, lba, datalen, vprotect, dpo, bytchk, blocksize); + 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."); @@ -1149,7 +1141,7 @@ iscsi_verify16_task(struct iscsi_context *iscsi, int lun, unsigned char *data, return NULL; } - task = scsi_cdb_verify16(iscsi, lba, datalen, vprotect, dpo, bytchk, blocksize); + 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."); @@ -1176,7 +1168,7 @@ iscsi_modesense6_task(struct iscsi_context *iscsi, int lun, int dbd, int pc, { struct scsi_task *task; - task = scsi_cdb_modesense6(iscsi, dbd, pc, page_code, sub_page_code, + task = scsi_cdb_modesense6(dbd, pc, page_code, sub_page_code, alloc_len); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -1200,7 +1192,7 @@ iscsi_startstopunit_task(struct iscsi_context *iscsi, int lun, { struct scsi_task *task; - task = scsi_cdb_startstopunit(iscsi, immed, pcm, pc, no_flush, + task = scsi_cdb_startstopunit(immed, pcm, pc, no_flush, loej, start); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -1223,7 +1215,7 @@ iscsi_preventallow_task(struct iscsi_context *iscsi, int lun, { struct scsi_task *task; - task = scsi_cdb_preventallow(iscsi, prevent); + task = scsi_cdb_preventallow(prevent); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "PreventAllowMediumRemoval cdb."); @@ -1245,7 +1237,7 @@ iscsi_synchronizecache10_task(struct iscsi_context *iscsi, int lun, int lba, { struct scsi_task *task; - task = scsi_cdb_synchronizecache10(iscsi, lba, num_blocks, syncnv, + task = scsi_cdb_synchronizecache10(lba, num_blocks, syncnv, immed); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -1268,7 +1260,7 @@ iscsi_synchronizecache16_task(struct iscsi_context *iscsi, int lun, uint64_t lba { struct scsi_task *task; - task = scsi_cdb_synchronizecache16(iscsi, lba, num_blocks, syncnv, + task = scsi_cdb_synchronizecache16(lba, num_blocks, syncnv, immed); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -1291,7 +1283,7 @@ iscsi_prefetch10_task(struct iscsi_context *iscsi, int lun, uint32_t lba, { struct scsi_task *task; - task = scsi_cdb_prefetch10(iscsi, lba, num_blocks, immed, group); + task = scsi_cdb_prefetch10(lba, num_blocks, immed, group); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "prefetch10 cdb."); @@ -1313,7 +1305,7 @@ iscsi_prefetch16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, { struct scsi_task *task; - task = scsi_cdb_prefetch16(iscsi, lba, num_blocks, immed, group); + task = scsi_cdb_prefetch16(lba, num_blocks, immed, group); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "prefetch16 cdb."); @@ -1339,7 +1331,7 @@ iscsi_writesame10_task(struct iscsi_context *iscsi, int lun, struct scsi_task *task; struct iscsi_data outdata; - task = scsi_cdb_writesame10(iscsi, wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks); + task = scsi_cdb_writesame10(wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "writesame10 cdb."); @@ -1381,7 +1373,7 @@ iscsi_writesame16_task(struct iscsi_context *iscsi, int lun, struct scsi_task *task; struct iscsi_data outdata; - task = scsi_cdb_writesame16(iscsi, wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks); + task = scsi_cdb_writesame16(wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "writesame16 cdb."); @@ -1425,7 +1417,7 @@ iscsi_unmap_task(struct iscsi_context *iscsi, int lun, int anchor, int group, xferlen = 8 + list_len * 16; - task = scsi_cdb_unmap(iscsi, anchor, group, xferlen); + task = scsi_cdb_unmap(anchor, group, xferlen); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "unmap cdb."); @@ -1492,7 +1484,7 @@ iscsi_readtoc_task(struct iscsi_context *iscsi, int lun, int msf, { struct scsi_task *task; - task = scsi_cdb_readtoc(iscsi, msf, format, track_session, maxsize); + task = scsi_cdb_readtoc(msf, format, track_session, maxsize); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "read TOC cdb."); @@ -1513,7 +1505,7 @@ iscsi_reserve6_task(struct iscsi_context *iscsi, int lun, { struct scsi_task *task; - task = scsi_cdb_reserve6(iscsi); + task = scsi_cdb_reserve6(); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "reserve6 cdb."); @@ -1534,7 +1526,7 @@ iscsi_release6_task(struct iscsi_context *iscsi, int lun, { struct scsi_task *task; - task = scsi_cdb_release6(iscsi); + task = scsi_cdb_release6(); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "release6 cdb."); @@ -1556,7 +1548,7 @@ iscsi_report_supported_opcodes_task(struct iscsi_context *iscsi, { struct scsi_task *task; - task = scsi_cdb_report_supported_opcodes(iscsi, return_timeouts, maxsize); + task = scsi_cdb_report_supported_opcodes(return_timeouts, maxsize); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "Maintenance In/Read Supported Op Codes cdb."); @@ -1576,3 +1568,57 @@ iscsi_scsi_get_task_from_pdu(struct iscsi_pdu *pdu) { return pdu->scsi_cbdata->task; } + +int +iscsi_scsi_cancel_task(struct iscsi_context *iscsi, + struct scsi_task *task) +{ + struct iscsi_pdu *pdu; + + for (pdu = iscsi->waitpdu; pdu; pdu = pdu->next) { + if (pdu->itt == task->itt) { + SLIST_REMOVE(&iscsi->waitpdu, pdu); + if ( !(pdu->flags & ISCSI_PDU_NO_CALLBACK)) { + pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, + pdu->private_data); + } + iscsi_free_pdu(iscsi, pdu); + return 0; + } + } + for (pdu = iscsi->outqueue; pdu; pdu = pdu->next) { + if (pdu->itt == task->itt) { + SLIST_REMOVE(&iscsi->outqueue, pdu); + if ( !(pdu->flags & ISCSI_PDU_NO_CALLBACK)) { + pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, + pdu->private_data); + } + iscsi_free_pdu(iscsi, pdu); + return 0; + } + } + return -1; +} + +void +iscsi_scsi_cancel_all_tasks(struct iscsi_context *iscsi) +{ + struct iscsi_pdu *pdu; + + for (pdu = iscsi->waitpdu; pdu; pdu = pdu->next) { + SLIST_REMOVE(&iscsi->waitpdu, pdu); + if ( !(pdu->flags & ISCSI_PDU_NO_CALLBACK)) { + pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, + pdu->private_data); + } + iscsi_free_pdu(iscsi, pdu); + } + for (pdu = iscsi->outqueue; pdu; pdu = pdu->next) { + SLIST_REMOVE(&iscsi->outqueue, pdu); + if ( !(pdu->flags & ISCSI_PDU_NO_CALLBACK)) { + pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, + pdu->private_data); + } + iscsi_free_pdu(iscsi, pdu); + } +} diff --git a/lib/scsi-lowlevel.c b/lib/scsi-lowlevel.c index d99f5d9..53e84d3 100644 --- a/lib/scsi-lowlevel.c +++ b/lib/scsi-lowlevel.c @@ -35,58 +35,39 @@ #include #include #include "slist.h" -#include "iscsi.h" #include "scsi-lowlevel.h" -#include "iscsi-private.h" +struct scsi_allocated_memory { + struct scsi_allocated_memory *next; + char buf[0]; +}; void scsi_free_scsi_task(struct scsi_task *task) { struct scsi_allocated_memory *mem; - if (task->iscsi != NULL) { - while ((mem = task->mem)) { - SLIST_REMOVE(&task->mem, mem); - iscsi_free(task->iscsi, mem); - } - iscsi_free(task->iscsi,task->datain.data); - iscsi_free(task->iscsi,task); - } else { - while ((mem = task->mem)) { - SLIST_REMOVE(&task->mem, mem); - free(mem); - } - free(task->datain.data); - free(task); + while ((mem = task->mem)) { + SLIST_REMOVE(&task->mem, mem); + free(mem); } -} -struct scsi_task * -scsi_create_scsi_task(struct iscsi_context *iscsi) -{ - struct scsi_task * task; - task = iscsi_zmalloc(iscsi, sizeof(struct scsi_task)); - if (task==NULL) return NULL; - task->iscsi=iscsi; - return task; + free(task->datain.data); + free(task); } void * scsi_malloc(struct scsi_task *task, size_t size) { struct scsi_allocated_memory *mem; - if (task->iscsi != NULL) - mem = iscsi_malloc(task->iscsi,sizeof(struct scsi_allocated_memory) + size); - else - mem = malloc(sizeof(struct scsi_allocated_memory) + size); + + mem = malloc(sizeof(struct scsi_allocated_memory) + size); if (mem == NULL) { return NULL; } memset(mem, 0, sizeof(struct scsi_allocated_memory) + size); - mem->ptr = (void *) ((uintptr_t)mem + sizeof(struct scsi_allocated_memory)); SLIST_ADD(&task->mem, mem); - return mem->ptr; + return &mem->buf[0]; } struct value_string { @@ -183,15 +164,16 @@ scsi_sense_ascq_str(int ascq) * TESTUNITREADY */ struct scsi_task * -scsi_cdb_testunitready(struct iscsi_context *iscsi) +scsi_cdb_testunitready(void) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_TESTUNITREADY; task->cdb_size = 6; @@ -206,15 +188,16 @@ scsi_cdb_testunitready(struct iscsi_context *iscsi) * REPORTLUNS */ struct scsi_task * -scsi_reportluns_cdb(struct iscsi_context *iscsi, int report_type, int alloc_len) +scsi_reportluns_cdb(int report_type, int alloc_len) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_REPORTLUNS; task->cdb[2] = report_type; *(uint32_t *)&task->cdb[6] = htonl(alloc_len); @@ -286,15 +269,16 @@ scsi_reportluns_datain_unmarshall(struct scsi_task *task) * READCAPACITY10 */ struct scsi_task * -scsi_cdb_readcapacity10(struct iscsi_context *iscsi, int lba, int pmi) +scsi_cdb_readcapacity10(int lba, int pmi) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_READCAPACITY10; *(uint32_t *)&task->cdb[2] = htonl(lba); @@ -319,7 +303,7 @@ scsi_cdb_readcapacity10(struct iscsi_context *iscsi, int lba, int pmi) * READTOC */ struct scsi_task * -scsi_cdb_readtoc(struct iscsi_context *iscsi, int msf, int format, int track_session, uint16_t alloc_len) +scsi_cdb_readtoc(int msf, int format, int track_session, uint16_t alloc_len) { struct scsi_task *task; @@ -329,11 +313,12 @@ scsi_cdb_readtoc(struct iscsi_context *iscsi, int msf, int format, int track_ses return NULL; } - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_READTOC; if (msf) { @@ -472,15 +457,16 @@ scsi_readtoc_datain_unmarshall(struct scsi_task *task) * RESERVE6 */ struct scsi_task * -scsi_cdb_reserve6(struct iscsi_context *iscsi) +scsi_cdb_reserve6(void) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_RESERVE6; task->cdb_size = 6; @@ -492,15 +478,16 @@ scsi_cdb_reserve6(struct iscsi_context *iscsi) * RELEASE10 */ struct scsi_task * -scsi_cdb_release6(struct iscsi_context *iscsi) +scsi_cdb_release6(void) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_RELEASE6; task->cdb_size = 6; @@ -651,15 +638,16 @@ scsi_maintenancein_datain_unmarshall(struct scsi_task *task) * MAINTENANCE In / Read Supported Op Codes */ struct scsi_task * -scsi_cdb_report_supported_opcodes(struct iscsi_context *iscsi, int return_timeouts, uint32_t alloc_len) +scsi_cdb_report_supported_opcodes(int return_timeouts, uint32_t alloc_len) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_MAINTENANCE_IN; task->cdb[1] = SCSI_REPORT_SUPPORTED_OP_CODES; task->cdb[2] = SCSI_REPORT_SUPPORTING_OPS_ALL; @@ -724,15 +712,16 @@ scsi_readcapacity10_datain_unmarshall(struct scsi_task *task) * INQUIRY */ struct scsi_task * -scsi_cdb_inquiry(struct iscsi_context *iscsi, int evpd, int page_code, int alloc_len) +scsi_cdb_inquiry(int evpd, int page_code, int alloc_len) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_INQUIRY; if (evpd) { @@ -999,7 +988,7 @@ scsi_inquiry_datain_unmarshall(struct scsi_task *task) * READ6 */ struct scsi_task * -scsi_cdb_read6(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize) +scsi_cdb_read6(uint32_t lba, uint32_t xferlen, int blocksize) { struct scsi_task *task; int num_blocks; @@ -1013,11 +1002,12 @@ scsi_cdb_read6(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int return NULL; } - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_READ6; task->cdb_size = 6; @@ -1046,15 +1036,16 @@ scsi_cdb_read6(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int * READ10 */ struct scsi_task * -scsi_cdb_read10(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize, int rdprotect, int dpo, int fua, int fua_nv, int group_number) +scsi_cdb_read10(uint32_t lba, uint32_t xferlen, int blocksize, int rdprotect, int dpo, int fua, int fua_nv, int group_number) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_READ10; task->cdb[1] |= ((rdprotect & 0x07) << 5); @@ -1091,15 +1082,16 @@ scsi_cdb_read10(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int * READ12 */ struct scsi_task * -scsi_cdb_read12(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize, int rdprotect, int dpo, int fua, int fua_nv, int group_number) +scsi_cdb_read12(uint32_t lba, uint32_t xferlen, int blocksize, int rdprotect, int dpo, int fua, int fua_nv, int group_number) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_READ12; task->cdb[1] |= ((rdprotect & 0x07) << 5); @@ -1136,15 +1128,16 @@ scsi_cdb_read12(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int * READ16 */ struct scsi_task * -scsi_cdb_read16(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, int blocksize, int rdprotect, int dpo, int fua, int fua_nv, int group_number) +scsi_cdb_read16(uint64_t lba, uint32_t xferlen, int blocksize, int rdprotect, int dpo, int fua, int fua_nv, int group_number) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_READ16; task->cdb[1] |= ((rdprotect & 0x07) << 5); @@ -1182,15 +1175,16 @@ scsi_cdb_read16(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, int * WRITE10 */ struct scsi_task * -scsi_cdb_write10(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number) +scsi_cdb_write10(uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_WRITE10; task->cdb[1] |= ((wrprotect & 0x07) << 5); @@ -1227,15 +1221,16 @@ scsi_cdb_write10(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, in * WRITE12 */ struct scsi_task * -scsi_cdb_write12(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number) +scsi_cdb_write12(uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_WRITE12; task->cdb[1] |= ((wrprotect & 0x07) << 5); @@ -1272,15 +1267,16 @@ scsi_cdb_write12(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, in * WRITE16 */ struct scsi_task * -scsi_cdb_write16(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number) +scsi_cdb_write16(uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_WRITE16; task->cdb[1] |= ((wrprotect & 0x07) << 5); @@ -1318,15 +1314,16 @@ scsi_cdb_write16(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, in * ORWRITE */ struct scsi_task * -scsi_cdb_orwrite(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number) +scsi_cdb_orwrite(uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_ORWRITE; task->cdb[1] |= ((wrprotect & 0x07) << 5); @@ -1364,15 +1361,16 @@ scsi_cdb_orwrite(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, in * COMPAREANDWRITE */ struct scsi_task * -scsi_cdb_compareandwrite(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number) +scsi_cdb_compareandwrite(uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group_number) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_COMPARE_AND_WRITE; task->cdb[1] |= ((wrprotect & 0x07) << 5); @@ -1409,15 +1407,16 @@ scsi_cdb_compareandwrite(struct iscsi_context *iscsi, uint64_t lba, uint32_t xfe * VERIFY10 */ struct scsi_task * -scsi_cdb_verify10(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize) +scsi_cdb_verify10(uint32_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_VERIFY10; if (vprotect) { @@ -1454,15 +1453,16 @@ scsi_cdb_verify10(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, i * VERIFY12 */ struct scsi_task * -scsi_cdb_verify12(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize) +scsi_cdb_verify12(uint32_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_VERIFY12; if (vprotect) { @@ -1499,15 +1499,16 @@ scsi_cdb_verify12(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, i * VERIFY16 */ struct scsi_task * -scsi_cdb_verify16(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize) +scsi_cdb_verify16(uint64_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_VERIFY16; if (vprotect) { @@ -1545,15 +1546,16 @@ scsi_cdb_verify16(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, i * UNMAP */ struct scsi_task * -scsi_cdb_unmap(struct iscsi_context *iscsi, int anchor, int group, uint16_t xferlen) +scsi_cdb_unmap(int anchor, int group, uint16_t xferlen) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_UNMAP; if (anchor) { @@ -1578,15 +1580,16 @@ scsi_cdb_unmap(struct iscsi_context *iscsi, int anchor, int group, uint16_t xfer * WRITE_SAME10 */ struct scsi_task * -scsi_cdb_writesame10(struct iscsi_context *iscsi, int wrprotect, int anchor, int unmap, int pbdata, int lbdata, uint32_t lba, int group, uint16_t num_blocks) +scsi_cdb_writesame10(int wrprotect, int anchor, int unmap, int pbdata, int lbdata, uint32_t lba, int group, uint16_t num_blocks) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_WRITE_SAME10; if (wrprotect) { @@ -1621,15 +1624,16 @@ scsi_cdb_writesame10(struct iscsi_context *iscsi, int wrprotect, int anchor, int * WRITE_SAME16 */ struct scsi_task * -scsi_cdb_writesame16(struct iscsi_context *iscsi, int wrprotect, int anchor, int unmap, int pbdata, int lbdata, uint64_t lba, int group, uint32_t num_blocks) +scsi_cdb_writesame16(int wrprotect, int anchor, int unmap, int pbdata, int lbdata, uint64_t lba, int group, uint32_t num_blocks) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_WRITE_SAME16; if (wrprotect) { @@ -1665,17 +1669,18 @@ scsi_cdb_writesame16(struct iscsi_context *iscsi, int wrprotect, int anchor, int * MODESENSE6 */ struct scsi_task * -scsi_cdb_modesense6(struct iscsi_context *iscsi, int dbd, enum scsi_modesense_page_control pc, +scsi_cdb_modesense6(int dbd, enum scsi_modesense_page_control pc, enum scsi_modesense_page_code page_code, int sub_page_code, unsigned char alloc_len) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_MODESENSE6; if (dbd) { @@ -1855,15 +1860,16 @@ scsi_modesense_datain_unmarshall(struct scsi_task *task) * STARTSTOPUNIT */ struct scsi_task * -scsi_cdb_startstopunit(struct iscsi_context *iscsi, int immed, int pcm, int pc, int no_flush, int loej, int start) +scsi_cdb_startstopunit(int immed, int pcm, int pc, int no_flush, int loej, int start) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_STARTSTOPUNIT; if (immed) { @@ -1900,15 +1906,16 @@ scsi_cdb_startstopunit(struct iscsi_context *iscsi, int immed, int pcm, int pc, * PREVENTALLOWMEDIUMREMOVAL */ struct scsi_task * -scsi_cdb_preventallow(struct iscsi_context *iscsi, int prevent) +scsi_cdb_preventallow(int prevent) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_PREVENTALLOW; task->cdb[4] = prevent & 0x03; @@ -1926,15 +1933,16 @@ scsi_cdb_preventallow(struct iscsi_context *iscsi, int prevent) * SYNCHRONIZECACHE10 */ struct scsi_task * -scsi_cdb_synchronizecache10(struct iscsi_context *iscsi, int lba, int num_blocks, int syncnv, int immed) +scsi_cdb_synchronizecache10(int lba, int num_blocks, int syncnv, int immed) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_SYNCHRONIZECACHE10; if (syncnv) { @@ -1957,15 +1965,16 @@ scsi_cdb_synchronizecache10(struct iscsi_context *iscsi, int lba, int num_blocks * SYNCHRONIZECACHE16 */ struct scsi_task * -scsi_cdb_synchronizecache16(struct iscsi_context *iscsi, uint64_t lba, uint32_t num_blocks, int syncnv, int immed) +scsi_cdb_synchronizecache16(uint64_t lba, uint32_t num_blocks, int syncnv, int immed) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_SYNCHRONIZECACHE16; if (syncnv) { @@ -1989,15 +1998,16 @@ scsi_cdb_synchronizecache16(struct iscsi_context *iscsi, uint64_t lba, uint32_t * PREFETCH10 */ struct scsi_task * -scsi_cdb_prefetch10(struct iscsi_context *iscsi, uint32_t lba, int num_blocks, int immed, int group) +scsi_cdb_prefetch10(uint32_t lba, int num_blocks, int immed, int group) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_PREFETCH10; if (immed) { @@ -2018,15 +2028,16 @@ scsi_cdb_prefetch10(struct iscsi_context *iscsi, uint32_t lba, int num_blocks, i * PREFETCH16 */ struct scsi_task * -scsi_cdb_prefetch16(struct iscsi_context *iscsi, uint64_t lba, int num_blocks, int immed, int group) +scsi_cdb_prefetch16(uint64_t lba, int num_blocks, int immed, int group) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_PREFETCH16; if (immed) { @@ -2049,15 +2060,16 @@ scsi_cdb_prefetch16(struct iscsi_context *iscsi, uint64_t lba, int num_blocks, i * SERVICEACTIONIN16 */ struct scsi_task * -scsi_cdb_serviceactionin16(struct iscsi_context *iscsi, enum scsi_service_action_in sa, uint32_t xferlen) +scsi_cdb_serviceactionin16(enum scsi_service_action_in sa, uint32_t xferlen) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_SERVICE_ACTION_IN; task->cdb[1] = sa; @@ -2081,24 +2093,25 @@ scsi_cdb_serviceactionin16(struct iscsi_context *iscsi, enum scsi_service_action * READCAPACITY16 */ struct scsi_task * -scsi_cdb_readcapacity16(struct iscsi_context *iscsi) +scsi_cdb_readcapacity16(void) { - return scsi_cdb_serviceactionin16(iscsi, SCSI_READCAPACITY16, 32); + return scsi_cdb_serviceactionin16(SCSI_READCAPACITY16, 32); } /* * GET_LBA_STATUS */ struct scsi_task * -scsi_cdb_get_lba_status(struct iscsi_context *iscsi, uint64_t starting_lba, uint32_t alloc_len) +scsi_cdb_get_lba_status(uint64_t starting_lba, uint32_t alloc_len) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_SERVICE_ACTION_IN; task->cdb[1] = SCSI_GET_LBA_STATUS; @@ -2124,15 +2137,16 @@ scsi_cdb_get_lba_status(struct iscsi_context *iscsi, uint64_t starting_lba, uint * WRITEVERIFY10 */ struct scsi_task * -scsi_cdb_writeverify10(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number) +scsi_cdb_writeverify10(uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_WRITE_VERIFY10; task->cdb[1] |= ((wrprotect & 0x07) << 5); @@ -2166,15 +2180,16 @@ scsi_cdb_writeverify10(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferl * WRITEVERIFY12 */ struct scsi_task * -scsi_cdb_writeverify12(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number) +scsi_cdb_writeverify12(uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_WRITE_VERIFY12; task->cdb[1] |= ((wrprotect & 0x07) << 5); @@ -2208,15 +2223,16 @@ scsi_cdb_writeverify12(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferl * WRITEVERIFY16 */ struct scsi_task * -scsi_cdb_writeverify16(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number) +scsi_cdb_writeverify16(uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number) { struct scsi_task *task; - task = scsi_create_scsi_task(iscsi); + task = malloc(sizeof(struct scsi_task)); if (task == NULL) { return NULL; } + memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_WRITE_VERIFY16; task->cdb[1] |= ((wrprotect & 0x07) << 5); @@ -2539,77 +2555,3 @@ scsi_task_get_data_in_buffer(struct scsi_task *task, uint32_t pos, ssize_t *coun return &sdb->data[pos]; } - -int -iscsi_scsi_task_cancel(struct iscsi_context *iscsi, - struct scsi_task *task) -{ - struct iscsi_pdu *pdu; - - for (pdu = iscsi->waitpdu; pdu; pdu = pdu->next) { - if (pdu->itt == task->itt) { - while(task->in_buffers != NULL) { - struct scsi_data_buffer *ptr = task->in_buffers; - SLIST_REMOVE(&task->in_buffers, ptr); - } - SLIST_REMOVE(&iscsi->waitpdu, pdu); - if ( !(pdu->flags & ISCSI_PDU_NO_CALLBACK)) { - pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, - pdu->private_data); - } - iscsi_free_pdu(iscsi, pdu); - return 0; - } - } - for (pdu = iscsi->outqueue; pdu; pdu = pdu->next) { - if (pdu->itt == task->itt) { - while(task->in_buffers != NULL) { - struct scsi_data_buffer *ptr = task->in_buffers; - SLIST_REMOVE(&task->in_buffers, ptr); - } - SLIST_REMOVE(&iscsi->outqueue, pdu); - if ( !(pdu->flags & ISCSI_PDU_NO_CALLBACK)) { - pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, - pdu->private_data); - } - iscsi_free_pdu(iscsi, pdu); - return 0; - } - } - return -1; -} - -void -iscsi_scsi_cancel_all_tasks(struct iscsi_context *iscsi) -{ - struct iscsi_pdu *pdu; - - for (pdu = iscsi->waitpdu; pdu; pdu = pdu->next) { - struct scsi_task *task = iscsi_scsi_get_task_from_pdu(pdu); - - while(task->in_buffers != NULL) { - struct scsi_data_buffer *ptr = task->in_buffers; - SLIST_REMOVE(&task->in_buffers, ptr); - } - SLIST_REMOVE(&iscsi->waitpdu, pdu); - if ( !(pdu->flags & ISCSI_PDU_NO_CALLBACK)) { - pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, - pdu->private_data); - } - iscsi_free_pdu(iscsi, pdu); - } - for (pdu = iscsi->outqueue; pdu; pdu = pdu->next) { - struct scsi_task *task = iscsi_scsi_get_task_from_pdu(pdu); - - while(task->in_buffers != NULL) { - struct scsi_data_buffer *ptr = task->in_buffers; - SLIST_REMOVE(&task->in_buffers, ptr); - } - SLIST_REMOVE(&iscsi->outqueue, pdu); - if ( !(pdu->flags & ISCSI_PDU_NO_CALLBACK)) { - pdu->callback(iscsi, SCSI_STATUS_CANCELLED, NULL, - pdu->private_data); - } - iscsi_free_pdu(iscsi, pdu); - } -} diff --git a/lib/task_mgmt.c b/lib/task_mgmt.c index 286072d..5767aed 100644 --- a/lib/task_mgmt.c +++ b/lib/task_mgmt.c @@ -103,7 +103,7 @@ iscsi_task_mgmt_abort_task_async(struct iscsi_context *iscsi, struct scsi_task *task, iscsi_command_cb cb, void *private_data) { - iscsi_scsi_task_cancel(iscsi, task); + iscsi_scsi_cancel_task(iscsi, task); return iscsi_task_mgmt_async(iscsi, task->lun, ISCSI_TM_ABORT_TASK,