diff --git a/include/iscsi-private.h b/include/iscsi-private.h index 5c9b15a..3280f1d 100644 --- a/include/iscsi-private.h +++ b/include/iscsi-private.h @@ -48,8 +48,8 @@ struct iscsi_in_pdu { long long data_pos; unsigned char *data; }; -void iscsi_free_iscsi_in_pdu(struct iscsi_in_pdu *in); -void iscsi_free_iscsi_inqueue(struct iscsi_in_pdu *inqueue); +void iscsi_free_iscsi_in_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in); +void iscsi_free_iscsi_inqueue(struct iscsi_context *iscsi, struct iscsi_in_pdu *inqueue); enum iscsi_initial_r2t { ISCSI_INITIAL_R2T_NO = 0, @@ -128,6 +128,8 @@ struct iscsi_context { int no_auto_reconnect; int reconnect_deferred; int debug; + int mallocs; + int frees; }; #define ISCSI_PDU_IMMEDIATE 0x40 @@ -208,7 +210,7 @@ struct iscsi_pdu { struct iscsi_scsi_cbdata *scsi_cbdata; }; -void iscsi_free_scsi_cbdata(struct iscsi_scsi_cbdata *scsi_cbdata); +void iscsi_free_scsi_cbdata(struct iscsi_context *iscsi, struct iscsi_scsi_cbdata *scsi_cbdata); struct iscsi_pdu *iscsi_allocate_pdu(struct iscsi_context *iscsi, enum iscsi_opcode opcode, @@ -277,6 +279,10 @@ void iscsi_set_error(struct iscsi_context *iscsi, const char *error_string, unsigned char *iscsi_get_user_in_buffer(struct iscsi_context *iscsi, struct iscsi_in_pdu *in, uint32_t pos, ssize_t *count); unsigned char *scsi_task_get_data_in_buffer(struct scsi_task *task, uint32_t pos, ssize_t *count); +inline void* iscsi_malloc(struct iscsi_context *iscsi, size_t size); +inline void* iscsi_zmalloc(struct iscsi_context *iscsi, size_t size); +inline void iscsi_free(struct iscsi_context *iscsi, void* ptr); +inline char* iscsi_strdup(struct iscsi_context *iscsi, const char* str); unsigned long crc32c(char *buf, int len); diff --git a/include/iscsi.h b/include/iscsi.h index 0ab4b84..af7e1ba 100644 --- a/include/iscsi.h +++ b/include/iscsi.h @@ -77,6 +77,7 @@ struct iscsi_url { char user[MAX_STRING_SIZE+1]; char passwd[MAX_STRING_SIZE+1]; int lun; + struct iscsi_context *iscsi; }; /* diff --git a/include/scsi-lowlevel.h b/include/scsi-lowlevel.h index 9d25b47..0f7face 100644 --- a/include/scsi-lowlevel.h +++ b/include/scsi-lowlevel.h @@ -123,7 +123,7 @@ enum scsi_xfer_dir { /* * READTOC */ -EXTERN struct scsi_task *scsi_cdb_readtoc(int msf, int format, int track_session, uint16_t alloc_len); +EXTERN struct scsi_task *scsi_cdb_readtoc(struct iscsi_context *iscsi, int msf, int format, int track_session, uint16_t alloc_len); enum scsi_readtoc_fmt { SCSI_READ_TOC = 0, @@ -312,10 +312,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; @@ -371,8 +371,7 @@ EXTERN void *scsi_get_task_private_ptr(struct scsi_task *task); /* * TESTUNITREADY */ -EXTERN struct scsi_task *scsi_cdb_testunitready(void); - +EXTERN struct scsi_task *scsi_cdb_testunitready(struct iscsi_context *iscsi); /* * REPORTLUNS @@ -386,16 +385,16 @@ struct scsi_reportluns_list { uint16_t luns[0]; }; -EXTERN struct scsi_task *scsi_reportluns_cdb(int report_type, int alloc_len); +EXTERN struct scsi_task *scsi_reportluns_cdb(struct iscsi_context *iscsi, int report_type, int alloc_len); /* * RESERVE6 */ -EXTERN struct scsi_task *scsi_cdb_reserve6(void); +EXTERN struct scsi_task *scsi_cdb_reserve6(struct iscsi_context *iscsi); /* * RELEASE6 */ -EXTERN struct scsi_task *scsi_cdb_release6(void); +EXTERN struct scsi_task *scsi_cdb_release6(struct iscsi_context *iscsi); /* * READCAPACITY10 @@ -404,7 +403,7 @@ struct scsi_readcapacity10 { uint32_t lba; uint32_t block_size; }; -EXTERN struct scsi_task *scsi_cdb_readcapacity10(int lba, int pmi); +EXTERN struct scsi_task *scsi_cdb_readcapacity10(struct iscsi_context *iscsi, int lba, int pmi); /* @@ -564,7 +563,7 @@ struct scsi_inquiry_logical_block_provisioning { enum scsi_inquiry_provisioning_type provisioning_type; }; -EXTERN struct scsi_task *scsi_cdb_inquiry(int evpd, int page_code, int alloc_len); +EXTERN struct scsi_task *scsi_cdb_inquiry(struct iscsi_context *iscsi, int evpd, int page_code, int alloc_len); struct scsi_inquiry_unit_serial_number { enum scsi_inquiry_peripheral_qualifier qualifier; @@ -734,7 +733,8 @@ struct scsi_mode_sense { struct scsi_mode_page *pages; }; -EXTERN struct scsi_task *scsi_cdb_modesense6(int dbd, +EXTERN struct scsi_task *scsi_cdb_modesense6(struct iscsi_context *iscsi, + int dbd, enum scsi_modesense_page_control pc, enum scsi_modesense_page_code page_code, int sub_page_code, @@ -799,37 +799,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(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_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_synchronizecache10(int lba, int num_blocks, +EXTERN struct scsi_task *scsi_cdb_synchronizecache10(struct iscsi_context *iscsi, int lba, int num_blocks, int syncnv, int immed); -EXTERN struct scsi_task *scsi_cdb_synchronizecache16(uint64_t lba, uint32_t num_blocks, +EXTERN struct scsi_task *scsi_cdb_synchronizecache16(struct iscsi_context *iscsi, uint64_t lba, uint32_t num_blocks, int syncnv, int immed); -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); +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); void *scsi_malloc(struct scsi_task *task, size_t size); diff --git a/lib/connect.c b/lib/connect.c index 4fce89c..be51d89 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -61,7 +61,7 @@ iscsi_testunitready_cb(struct iscsi_context *iscsi, int status, "failed."); ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data); - free(ct); + iscsi_free(iscsi, ct); } scsi_free_scsi_task(task); return; @@ -80,7 +80,7 @@ iscsi_testunitready_cb(struct iscsi_context *iscsi, int status, ct->cb(iscsi, status?SCSI_STATUS_ERROR:SCSI_STATUS_GOOD, NULL, ct->private_data); scsi_free_scsi_task(task); - free(ct); + iscsi_free(iscsi, ct); } static void @@ -92,7 +92,7 @@ iscsi_login_cb(struct iscsi_context *iscsi, int status, void *command_data _U_, if (status == SCSI_STATUS_REDIRECT && iscsi->target_address[0]) { iscsi_disconnect(iscsi); if (iscsi_connect_async(iscsi, iscsi->target_address, iscsi_connect_cb, iscsi->connect_data) != 0) { - free(ct); + iscsi_free(iscsi, ct); return; } return; @@ -100,7 +100,7 @@ iscsi_login_cb(struct iscsi_context *iscsi, int status, void *command_data _U_, if (status != 0) { ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data); - free(ct); + iscsi_free(iscsi, ct); return; } @@ -121,14 +121,14 @@ iscsi_connect_cb(struct iscsi_context *iscsi, int status, void *command_data _U_ iscsi_set_error(iscsi, "Failed to connect to iSCSI socket. " "%s", iscsi_get_error(iscsi)); ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data); - free(ct); + iscsi_free(iscsi, ct); return; } if (iscsi_login_async(iscsi, iscsi_login_cb, ct) != 0) { iscsi_set_error(iscsi, "iscsi_login_async failed."); ct->cb(iscsi, SCSI_STATUS_ERROR, NULL, ct->private_data); - free(ct); + iscsi_free(iscsi, ct); } } @@ -142,7 +142,7 @@ iscsi_full_connect_async(struct iscsi_context *iscsi, const char *portal, iscsi->lun = lun; strncpy(iscsi->portal,portal,MAX_STRING_SIZE); - ct = malloc(sizeof(struct connect_task)); + ct = iscsi_malloc(iscsi, sizeof(struct connect_task)); if (ct == NULL) { iscsi_set_error(iscsi, "Out-of-memory. Failed to allocate " "connect_task structure."); @@ -318,18 +318,22 @@ try_again: } if (old_iscsi->incoming != NULL) { - iscsi_free_iscsi_in_pdu(old_iscsi->incoming); + iscsi_free_iscsi_in_pdu(old_iscsi, old_iscsi->incoming); } if (old_iscsi->inqueue != NULL) { - iscsi_free_iscsi_inqueue(old_iscsi->inqueue); + iscsi_free_iscsi_inqueue(old_iscsi, old_iscsi->inqueue); } close(iscsi->fd); iscsi->fd = old_iscsi->fd; + int _mallocs = old_iscsi->mallocs; + int _frees = old_iscsi->frees; memcpy(old_iscsi, iscsi, sizeof(struct iscsi_context)); free(iscsi); old_iscsi->is_reconnecting = 0; + old_iscsi->mallocs+=_mallocs; + old_iscsi->frees+=_frees; return 0; } diff --git a/lib/discovery.c b/lib/discovery.c index f474ae7..1ddf8ef 100644 --- a/lib/discovery.c +++ b/lib/discovery.c @@ -79,19 +79,19 @@ iscsi_discovery_async(struct iscsi_context *iscsi, iscsi_command_cb cb, } static void -iscsi_free_discovery_addresses(struct iscsi_discovery_address *addresses) +iscsi_free_discovery_addresses(struct iscsi_context *iscsi, struct iscsi_discovery_address *addresses) { while (addresses != NULL) { struct iscsi_discovery_address *next = addresses->next; - free(discard_const(addresses->target_name)); + iscsi_free(iscsi, discard_const(addresses->target_name)); addresses->target_name = NULL; - free(discard_const(addresses->target_address)); + iscsi_free(iscsi, discard_const(addresses->target_address)); addresses->target_address = NULL; addresses->next = NULL; - free(addresses); + iscsi_free(iscsi, addresses); addresses = next; } } @@ -127,7 +127,7 @@ iscsi_process_text_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, "discovery data %d>%d", len, size); pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, pdu->private_data); - iscsi_free_discovery_addresses(targets); + iscsi_free_discovery_addresses(iscsi, targets); return -1; } @@ -135,40 +135,39 @@ iscsi_process_text_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, if (!strncmp((char *)ptr, "TargetName=", 11)) { struct iscsi_discovery_address *target; - target = malloc(sizeof(struct iscsi_discovery_address)); + target = iscsi_zmalloc(iscsi, sizeof(struct iscsi_discovery_address)); if (target == NULL) { iscsi_set_error(iscsi, "Failed to allocate " "data for new discovered " "target"); pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, pdu->private_data); - iscsi_free_discovery_addresses(targets); + iscsi_free_discovery_addresses(iscsi, targets); return -1; } - memset(target, 0, sizeof(struct iscsi_discovery_address)); - target->target_name = strdup((char *)ptr+11); + target->target_name = iscsi_strdup(iscsi,(char *)ptr+11); if (target->target_name == NULL) { iscsi_set_error(iscsi, "Failed to allocate " "data for new discovered " "target name"); pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, pdu->private_data); - free(target); + iscsi_free(iscsi, target); target = NULL; - iscsi_free_discovery_addresses(targets); + iscsi_free_discovery_addresses(iscsi, targets); return -1; } target->next = targets; targets = target; } else if (!strncmp((char *)ptr, "TargetAddress=", 14)) { - targets->target_address = strdup((char *)ptr+14); + targets->target_address = iscsi_strdup(iscsi, (char *)ptr+14); if (targets->target_address == NULL) { iscsi_set_error(iscsi, "Failed to allocate " "data for new discovered " "target address"); pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, pdu->private_data); - iscsi_free_discovery_addresses(targets); + iscsi_free_discovery_addresses(iscsi, targets); return -1; } } else { @@ -176,7 +175,7 @@ iscsi_process_text_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, "discovery string : %s", ptr); pdu->callback(iscsi, SCSI_STATUS_ERROR, NULL, pdu->private_data); - iscsi_free_discovery_addresses(targets); + iscsi_free_discovery_addresses(iscsi, targets); return -1; } @@ -185,7 +184,7 @@ iscsi_process_text_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, } pdu->callback(iscsi, SCSI_STATUS_GOOD, targets, pdu->private_data); - iscsi_free_discovery_addresses(targets); + iscsi_free_discovery_addresses(iscsi, targets); return 0; } diff --git a/lib/init.c b/lib/init.c index 533b654..a53d665 100644 --- a/lib/init.c +++ b/lib/init.c @@ -33,23 +33,50 @@ #include "iscsi-private.h" #include "slist.h" +inline void* iscsi_malloc(struct iscsi_context *iscsi, size_t size) { + void * ptr = malloc(size); + if (ptr != NULL) iscsi->mallocs++; + return ptr; +} + +inline void* iscsi_zmalloc(struct iscsi_context *iscsi, size_t size) { + void * ptr = malloc(size); + if (ptr != NULL) { + memset(ptr,0x00,size); + iscsi->mallocs++; + } + return ptr; +} + +inline void iscsi_free(struct iscsi_context *iscsi, void* ptr) { + if (ptr == NULL) return; + free(ptr); + iscsi->frees++; +} + +inline char* iscsi_strdup(struct iscsi_context *iscsi, const char* str) { + char *str2 = strdup(str); + if (str2 != NULL) iscsi->mallocs++; + return str2; +} + struct iscsi_context * iscsi_create_context(const char *initiator_name) { struct iscsi_context *iscsi; + if (!initiator_name[0]) { + return NULL; + } + iscsi = malloc(sizeof(struct iscsi_context)); if (iscsi == NULL) { return NULL; } - + memset(iscsi, 0, sizeof(struct iscsi_context)); strncpy(iscsi->initiator_name,initiator_name,MAX_STRING_SIZE); - if (!iscsi->initiator_name[0]) { - free(iscsi); - return NULL; - } iscsi->fd = -1; @@ -226,14 +253,20 @@ iscsi_destroy_context(struct iscsi_context *iscsi) } if (iscsi->incoming != NULL) { - iscsi_free_iscsi_in_pdu(iscsi->incoming); + iscsi_free_iscsi_in_pdu(iscsi, iscsi->incoming); } if (iscsi->inqueue != NULL) { - iscsi_free_iscsi_inqueue(iscsi->inqueue); + iscsi_free_iscsi_inqueue(iscsi, iscsi->inqueue); } iscsi->connect_data = NULL; + if (iscsi->mallocs != iscsi->frees) { + DPRINTF(iscsi,1,"%d memory blocks lost at iscsi_destroy_context() after %d mallocs and %d frees",iscsi->mallocs-iscsi->frees,iscsi->mallocs,iscsi->frees); + } else { + DPRINTF(iscsi,5,"memory is clean at iscsi_destroy_context() after %d mallocs and %d frees",iscsi->mallocs,iscsi->frees); + } + free(iscsi); return 0; @@ -391,12 +424,12 @@ iscsi_parse_url(struct iscsi_context *iscsi, const char *url, int full) if (tmp) *tmp=0; } - iscsi_url = malloc(sizeof(struct iscsi_url)); + iscsi_url = iscsi_zmalloc(iscsi, sizeof(struct iscsi_url)); if (iscsi_url == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to allocate iscsi_url structure"); return NULL; } - memset(iscsi_url, 0, sizeof(struct iscsi_url)); + iscsi_url->iscsi= iscsi; strncpy(iscsi_url->portal,portal,MAX_STRING_SIZE); @@ -428,7 +461,7 @@ iscsi_parse_portal_url(struct iscsi_context *iscsi, const char *url) void iscsi_destroy_url(struct iscsi_url *iscsi_url) { - free(iscsi_url); + iscsi_free(iscsi_url->iscsi, iscsi_url); } diff --git a/lib/login.c b/lib/login.c index 5da4d21..04368d2 100644 --- a/lib/login.c +++ b/lib/login.c @@ -43,23 +43,23 @@ iscsi_login_add_initiatorname(struct iscsi_context *iscsi, struct iscsi_pdu *pdu return 0; } - str = malloc(1024); + str = iscsi_malloc(iscsi, 1024); #if defined(WIN32) if (_snprintf_s(str, 1024, 1024, "InitiatorName=%s", iscsi->initiator_name) == -1) { #else if (snprintf(str, 1024, "InitiatorName=%s", iscsi->initiator_name) == -1) { #endif iscsi_set_error(iscsi, "Out-of-memory: aprintf failed."); - free(str); + iscsi_free(iscsi, str); return -1; } if (iscsi_pdu_add_data(iscsi, pdu, (unsigned char *)str, strlen(str)+1) != 0) { iscsi_set_error(iscsi, "Out-of-memory: pdu add data failed."); - free(str); + iscsi_free(iscsi, str); return -1; } - free(str); + iscsi_free(iscsi, str); return 0; } @@ -74,24 +74,24 @@ iscsi_login_add_alias(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) return 0; } - str = malloc(1024); + str = iscsi_malloc(iscsi, 1024); #if defined(WIN32) if (_snprintf_s(str, 1024, 1024, "InitiatorAlias=%s", iscsi->alias) == -1) { #else if (snprintf(str, 1024, "InitiatorAlias=%s", iscsi->alias) == -1) { #endif iscsi_set_error(iscsi, "Out-of-memory: aprintf failed."); - free(str); + iscsi_free(iscsi, str); return -1; } if (iscsi_pdu_add_data(iscsi, pdu, (unsigned char *)str, strlen(str)+1) != 0) { iscsi_set_error(iscsi, "Out-of-memory: pdu add data failed."); - free(str); + iscsi_free(iscsi, str); return -1; } - free(str); + iscsi_free(iscsi, str); return 0; } @@ -112,24 +112,24 @@ iscsi_login_add_targetname(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) return -1; } - str = malloc(1024); + str = iscsi_malloc(iscsi, 1024); #if defined(WIN32) if (_snprintf_s(str, 1024, 1024, "TargetName=%s", iscsi->target_name) == -1) { #else if (snprintf(str, 1024, "TargetName=%s", iscsi->target_name) == -1) { #endif iscsi_set_error(iscsi, "Out-of-memory: aprintf failed."); - free(str); + iscsi_free(iscsi, str); return -1; } if (iscsi_pdu_add_data(iscsi, pdu, (unsigned char *)str, strlen(str)+1) != 0) { iscsi_set_error(iscsi, "Out-of-memory: pdu add data failed."); - free(str); + iscsi_free(iscsi, str); return -1; } - free(str); + iscsi_free(iscsi, str); return 0; } @@ -232,7 +232,7 @@ iscsi_login_add_initialr2t(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) return 0; } - str = malloc(1024); + str = iscsi_malloc(iscsi, 1024); #if defined(WIN32) if (_snprintf_s(str, 1024, 1024, "InitialR2T=%s", iscsi->want_initial_r2t == ISCSI_INITIAL_R2T_NO ? #else @@ -240,17 +240,17 @@ iscsi_login_add_initialr2t(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) #endif "No" : "Yes") == -1) { iscsi_set_error(iscsi, "Out-of-memory: aprintf failed."); - free(str); + iscsi_free(iscsi, str); return -1; } if (iscsi_pdu_add_data(iscsi, pdu, (unsigned char *)str, strlen(str)+1) != 0) { iscsi_set_error(iscsi, "Out-of-memory: pdu add data failed."); - free(str); + iscsi_free(iscsi, str); return -1; } - free(str); + iscsi_free(iscsi, str); return 0; } @@ -265,7 +265,7 @@ iscsi_login_add_immediatedata(struct iscsi_context *iscsi, struct iscsi_pdu *pdu return 0; } - str = malloc(1024); + str = iscsi_malloc(iscsi, 1024); #if defined(WIN32) if (_snprintf_s(str, 1024, 1024, "ImmediateData=%s", iscsi->want_immediate_data == ISCSI_IMMEDIATE_DATA_NO ? #else @@ -273,17 +273,17 @@ iscsi_login_add_immediatedata(struct iscsi_context *iscsi, struct iscsi_pdu *pdu #endif "No" : "Yes") == -1) { iscsi_set_error(iscsi, "Out-of-memory: aprintf failed."); - free(str); + iscsi_free(iscsi, str); return -1; } if (iscsi_pdu_add_data(iscsi, pdu, (unsigned char *)str, strlen(str)+1) != 0) { iscsi_set_error(iscsi, "Out-of-memory: pdu add data failed."); - free(str); + iscsi_free(iscsi, str); return -1; } - free(str); + iscsi_free(iscsi, str); return 0; } @@ -298,24 +298,24 @@ iscsi_login_add_maxburstlength(struct iscsi_context *iscsi, struct iscsi_pdu *pd return 0; } - str = malloc(1024); + str = iscsi_malloc(iscsi, 1024); #if defined(WIN32) if (_snprintf_s(str, 1024, 1024, "MaxBurstLength=%d", iscsi->max_burst_length) == -1) { #else if (snprintf(str, 1024, "MaxBurstLength=%d", iscsi->max_burst_length) == -1) { #endif iscsi_set_error(iscsi, "Out-of-memory: aprintf failed."); - free(str); + iscsi_free(iscsi, str); return -1; } if (iscsi_pdu_add_data(iscsi, pdu, (unsigned char *)str, strlen(str)+1) != 0) { iscsi_set_error(iscsi, "Out-of-memory: pdu add data failed."); - free(str); + iscsi_free(iscsi, str); return -1; } - free(str); + iscsi_free(iscsi, str); return 0; } @@ -329,24 +329,24 @@ iscsi_login_add_firstburstlength(struct iscsi_context *iscsi, struct iscsi_pdu * return 0; } - str = malloc(1024); + str = iscsi_malloc(iscsi, 1024); #if defined(WIN32) if (_snprintf_s(str, 1024, 1024, "FirstBurstLength=%d", iscsi->first_burst_length) == -1) { #else if (snprintf(str, 1024, "FirstBurstLength=%d", iscsi->first_burst_length) == -1) { #endif iscsi_set_error(iscsi, "Out-of-memory: aprintf failed."); - free(str); + iscsi_free(iscsi, str); return -1; } if (iscsi_pdu_add_data(iscsi, pdu, (unsigned char *)str, strlen(str)+1) != 0) { iscsi_set_error(iscsi, "Out-of-memory: pdu add data failed."); - free(str); + iscsi_free(iscsi, str); return -1; } - free(str); + iscsi_free(iscsi, str); return 0; } @@ -360,24 +360,24 @@ iscsi_login_add_maxrecvdatasegmentlength(struct iscsi_context *iscsi, struct isc return 0; } - str = malloc(1024); + str = iscsi_malloc(iscsi, 1024); #if defined(WIN32) if (_snprintf_s(str, 1024, 1024, "MaxRecvDataSegmentLength=%d", iscsi->initiator_max_recv_data_segment_length) == -1) { #else if (snprintf(str, 1024, "MaxRecvDataSegmentLength=%d", iscsi->initiator_max_recv_data_segment_length) == -1) { #endif iscsi_set_error(iscsi, "Out-of-memory: aprintf failed."); - free(str); + iscsi_free(iscsi, str); return -1; } if (iscsi_pdu_add_data(iscsi, pdu, (unsigned char *)str, strlen(str)+1) != 0) { iscsi_set_error(iscsi, "Out-of-memory: pdu add data failed."); - free(str); + iscsi_free(iscsi, str); return -1; } - free(str); + iscsi_free(iscsi, str); return 0; } diff --git a/lib/pdu.c b/lib/pdu.c index f9cbf80..7109511 100644 --- a/lib/pdu.c +++ b/lib/pdu.c @@ -36,22 +36,20 @@ iscsi_allocate_pdu_with_itt_flags(struct iscsi_context *iscsi, enum iscsi_opcode { struct iscsi_pdu *pdu; - pdu = malloc(sizeof(struct iscsi_pdu)); + pdu = iscsi_zmalloc(iscsi, sizeof(struct iscsi_pdu)); if (pdu == NULL) { iscsi_set_error(iscsi, "failed to allocate pdu"); return NULL; } - memset(pdu, 0, sizeof(struct iscsi_pdu)); pdu->outdata.size = ISCSI_HEADER_SIZE; - pdu->outdata.data = malloc(pdu->outdata.size); + pdu->outdata.data = iscsi_zmalloc(iscsi, pdu->outdata.size); if (pdu->outdata.data == NULL) { iscsi_set_error(iscsi, "failed to allocate pdu header"); - free(pdu); + iscsi_free(iscsi, pdu); return NULL; } - memset(pdu->outdata.data, 0, pdu->outdata.size); /* opcode */ pdu->outdata.data[0] = opcode; @@ -89,18 +87,18 @@ iscsi_free_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) return; } - free(pdu->outdata.data); + iscsi_free(iscsi, pdu->outdata.data); pdu->outdata.data = NULL; - free(pdu->indata.data); + iscsi_free(iscsi, pdu->indata.data); pdu->indata.data = NULL; if (pdu->scsi_cbdata) { - iscsi_free_scsi_cbdata(pdu->scsi_cbdata); + iscsi_free_scsi_cbdata(iscsi, pdu->scsi_cbdata); pdu->scsi_cbdata = NULL; } - free(pdu); + iscsi_free(iscsi, pdu); } @@ -122,7 +120,8 @@ iscsi_add_data(struct iscsi_context *iscsi, struct iscsi_data *data, if (pdualignment) { aligned = (aligned+3)&0xfffffffc; } - buf = malloc(aligned); + + buf = iscsi_malloc(iscsi, aligned); if (buf == NULL) { iscsi_set_error(iscsi, "failed to allocate buffer for %d " "bytes", len); @@ -138,7 +137,7 @@ iscsi_add_data(struct iscsi_context *iscsi, struct iscsi_data *data, memset(buf+len, 0, aligned-len); } - free(data->data); + iscsi_free(iscsi, data->data); data->data = buf; data->size = len; diff --git a/lib/scsi-command.c b/lib/scsi-command.c index 0fe5291..49f96a0 100644 --- a/lib/scsi-command.c +++ b/lib/scsi-command.c @@ -37,7 +37,7 @@ struct iscsi_scsi_cbdata { }; void -iscsi_free_scsi_cbdata(struct iscsi_scsi_cbdata *scsi_cbdata) +iscsi_free_scsi_cbdata(struct iscsi_context *iscsi, struct iscsi_scsi_cbdata *scsi_cbdata) { if (scsi_cbdata == NULL) { return; @@ -45,7 +45,7 @@ iscsi_free_scsi_cbdata(struct iscsi_scsi_cbdata *scsi_cbdata) if (scsi_cbdata->task != NULL) { scsi_cbdata->task = NULL; } - free(scsi_cbdata); + iscsi_free(iscsi, scsi_cbdata); } static void @@ -186,13 +186,12 @@ iscsi_scsi_command_async(struct iscsi_context *iscsi, int lun, return -1; } - scsi_cbdata = malloc(sizeof(struct iscsi_scsi_cbdata)); + scsi_cbdata = iscsi_zmalloc(iscsi, sizeof(struct iscsi_scsi_cbdata)); if (scsi_cbdata == NULL) { iscsi_set_error(iscsi, "Out-of-memory: failed to allocate " "scsi cbdata."); return -1; } - memset(scsi_cbdata, 0, sizeof(struct iscsi_scsi_cbdata)); scsi_cbdata->task = task; scsi_cbdata->callback = cb; scsi_cbdata->private_data = private_data; @@ -204,7 +203,7 @@ iscsi_scsi_command_async(struct iscsi_context *iscsi, int lun, if (pdu == NULL) { iscsi_set_error(iscsi, "Out-of-memory, Failed to allocate " "scsi pdu."); - iscsi_free_scsi_cbdata(scsi_cbdata); + iscsi_free_scsi_cbdata(iscsi, scsi_cbdata); return -1; } pdu->scsi_cbdata = scsi_cbdata; @@ -384,7 +383,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 = malloc(task->datain.size); + task->datain.data = iscsi_malloc(iscsi, task->datain.size); if (task->datain.data == NULL) { iscsi_set_error(iscsi, "failed to allocate blob for " "sense data"); @@ -533,7 +532,7 @@ iscsi_testunitready_task(struct iscsi_context *iscsi, int lun, { struct scsi_task *task; - task = scsi_cdb_testunitready(); + task = scsi_cdb_testunitready(iscsi); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "testunitready cdb."); @@ -561,7 +560,7 @@ iscsi_reportluns_task(struct iscsi_context *iscsi, int report_type, return NULL; } - task = scsi_reportluns_cdb(report_type, alloc_len); + task = scsi_reportluns_cdb(iscsi, report_type, alloc_len); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "reportluns cdb."); @@ -584,7 +583,7 @@ iscsi_inquiry_task(struct iscsi_context *iscsi, int lun, int evpd, { struct scsi_task *task; - task = scsi_cdb_inquiry(evpd, page_code, maxsize); + task = scsi_cdb_inquiry(iscsi, evpd, page_code, maxsize); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "inquiry cdb."); @@ -605,7 +604,7 @@ iscsi_readcapacity10_task(struct iscsi_context *iscsi, int lun, int lba, { struct scsi_task *task; - task = scsi_cdb_readcapacity10(lba, pmi); + task = scsi_cdb_readcapacity10(iscsi, lba, pmi); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "readcapacity10 cdb."); @@ -626,7 +625,7 @@ iscsi_readcapacity16_task(struct iscsi_context *iscsi, int lun, { struct scsi_task *task; - task = scsi_cdb_readcapacity16(); + task = scsi_cdb_readcapacity16(iscsi); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "readcapacity16 cdb."); @@ -648,7 +647,7 @@ iscsi_get_lba_status_task(struct iscsi_context *iscsi, int lun, { struct scsi_task *task; - task = scsi_cdb_get_lba_status(starting_lba, alloc_len); + task = scsi_cdb_get_lba_status(iscsi, starting_lba, alloc_len); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "get-lba-status cdb."); @@ -676,7 +675,7 @@ iscsi_read6_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return NULL; } - task = scsi_cdb_read6(lba, datalen, blocksize); + task = scsi_cdb_read6(iscsi, lba, datalen, blocksize); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "read6 cdb."); @@ -705,7 +704,7 @@ iscsi_read10_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return NULL; } - task = scsi_cdb_read10(lba, datalen, blocksize, rdprotect, + task = scsi_cdb_read10(iscsi, lba, datalen, blocksize, rdprotect, dpo, fua, fua_nv, group_number); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -735,7 +734,7 @@ iscsi_read12_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return NULL; } - task = scsi_cdb_read12(lba, datalen, blocksize, rdprotect, + task = scsi_cdb_read12(iscsi, lba, datalen, blocksize, rdprotect, dpo, fua, fua_nv, group_number); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -765,7 +764,7 @@ iscsi_read16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, return NULL; } - task = scsi_cdb_read16(lba, datalen, blocksize, rdprotect, + task = scsi_cdb_read16(iscsi, lba, datalen, blocksize, rdprotect, dpo, fua, fua_nv, group_number); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -796,7 +795,7 @@ iscsi_write10_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return NULL; } - task = scsi_cdb_write10(lba, datalen, blocksize, wrprotect, + task = scsi_cdb_write10(iscsi, lba, datalen, blocksize, wrprotect, dpo, fua, fua_nv, group_number); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -831,7 +830,7 @@ iscsi_write12_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return NULL; } - task = scsi_cdb_write12(lba, datalen, blocksize, wrprotect, + task = scsi_cdb_write12(iscsi, lba, datalen, blocksize, wrprotect, dpo, fua, fua_nv, group_number); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -866,7 +865,7 @@ iscsi_write16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, return NULL; } - task = scsi_cdb_write16(lba, datalen, blocksize, wrprotect, + task = scsi_cdb_write16(iscsi, lba, datalen, blocksize, wrprotect, dpo, fua, fua_nv, group_number); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -901,7 +900,7 @@ iscsi_orwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba, return NULL; } - task = scsi_cdb_orwrite(lba, datalen, blocksize, wrprotect, + task = scsi_cdb_orwrite(iscsi, lba, datalen, blocksize, wrprotect, dpo, fua, fua_nv, group_number); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -936,7 +935,7 @@ iscsi_compareandwrite_task(struct iscsi_context *iscsi, int lun, uint64_t lba, return NULL; } - task = scsi_cdb_compareandwrite(lba, datalen, blocksize, wrprotect, + task = scsi_cdb_compareandwrite(iscsi, lba, datalen, blocksize, wrprotect, dpo, fua, fua_nv, group_number); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -971,7 +970,7 @@ iscsi_writeverify10_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return NULL; } - task = scsi_cdb_writeverify10(lba, datalen, blocksize, wrprotect, + task = scsi_cdb_writeverify10(iscsi, lba, datalen, blocksize, wrprotect, dpo, bytchk, group_number); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -1006,7 +1005,7 @@ iscsi_writeverify12_task(struct iscsi_context *iscsi, int lun, uint32_t lba, return NULL; } - task = scsi_cdb_writeverify12(lba, datalen, blocksize, wrprotect, + task = scsi_cdb_writeverify12(iscsi, lba, datalen, blocksize, wrprotect, dpo, bytchk, group_number); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -1041,7 +1040,7 @@ iscsi_writeverify16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, return NULL; } - task = scsi_cdb_writeverify16(lba, datalen, blocksize, wrprotect, + task = scsi_cdb_writeverify16(iscsi, lba, datalen, blocksize, wrprotect, dpo, bytchk, group_number); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -1075,7 +1074,7 @@ iscsi_verify10_task(struct iscsi_context *iscsi, int lun, unsigned char *data, return NULL; } - task = scsi_cdb_verify10(lba, datalen, vprotect, dpo, bytchk, blocksize); + task = scsi_cdb_verify10(iscsi, lba, datalen, vprotect, dpo, bytchk, blocksize); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "verify10 cdb."); @@ -1108,7 +1107,7 @@ iscsi_verify12_task(struct iscsi_context *iscsi, int lun, unsigned char *data, return NULL; } - task = scsi_cdb_verify12(lba, datalen, vprotect, dpo, bytchk, blocksize); + task = scsi_cdb_verify12(iscsi, lba, datalen, vprotect, dpo, bytchk, blocksize); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "verify12 cdb."); @@ -1141,7 +1140,7 @@ iscsi_verify16_task(struct iscsi_context *iscsi, int lun, unsigned char *data, return NULL; } - task = scsi_cdb_verify16(lba, datalen, vprotect, dpo, bytchk, blocksize); + task = scsi_cdb_verify16(iscsi, lba, datalen, vprotect, dpo, bytchk, blocksize); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "verify16 cdb."); @@ -1168,7 +1167,7 @@ iscsi_modesense6_task(struct iscsi_context *iscsi, int lun, int dbd, int pc, { struct scsi_task *task; - task = scsi_cdb_modesense6(dbd, pc, page_code, sub_page_code, + task = scsi_cdb_modesense6(iscsi, dbd, pc, page_code, sub_page_code, alloc_len); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -1192,7 +1191,7 @@ iscsi_startstopunit_task(struct iscsi_context *iscsi, int lun, { struct scsi_task *task; - task = scsi_cdb_startstopunit(immed, pcm, pc, no_flush, + task = scsi_cdb_startstopunit(iscsi, immed, pcm, pc, no_flush, loej, start); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -1215,7 +1214,7 @@ iscsi_preventallow_task(struct iscsi_context *iscsi, int lun, { struct scsi_task *task; - task = scsi_cdb_preventallow(prevent); + task = scsi_cdb_preventallow(iscsi, prevent); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "PreventAllowMediumRemoval cdb."); @@ -1237,7 +1236,7 @@ iscsi_synchronizecache10_task(struct iscsi_context *iscsi, int lun, int lba, { struct scsi_task *task; - task = scsi_cdb_synchronizecache10(lba, num_blocks, syncnv, + task = scsi_cdb_synchronizecache10(iscsi, lba, num_blocks, syncnv, immed); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -1260,7 +1259,7 @@ iscsi_synchronizecache16_task(struct iscsi_context *iscsi, int lun, uint64_t lba { struct scsi_task *task; - task = scsi_cdb_synchronizecache16(lba, num_blocks, syncnv, + task = scsi_cdb_synchronizecache16(iscsi, lba, num_blocks, syncnv, immed); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " @@ -1283,7 +1282,7 @@ iscsi_prefetch10_task(struct iscsi_context *iscsi, int lun, uint32_t lba, { struct scsi_task *task; - task = scsi_cdb_prefetch10(lba, num_blocks, immed, group); + task = scsi_cdb_prefetch10(iscsi, lba, num_blocks, immed, group); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "prefetch10 cdb."); @@ -1305,7 +1304,7 @@ iscsi_prefetch16_task(struct iscsi_context *iscsi, int lun, uint64_t lba, { struct scsi_task *task; - task = scsi_cdb_prefetch16(lba, num_blocks, immed, group); + task = scsi_cdb_prefetch16(iscsi, lba, num_blocks, immed, group); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "prefetch16 cdb."); @@ -1331,7 +1330,7 @@ iscsi_writesame10_task(struct iscsi_context *iscsi, int lun, struct scsi_task *task; struct iscsi_data outdata; - task = scsi_cdb_writesame10(wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks); + task = scsi_cdb_writesame10(iscsi, wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "writesame10 cdb."); @@ -1373,7 +1372,7 @@ iscsi_writesame16_task(struct iscsi_context *iscsi, int lun, struct scsi_task *task; struct iscsi_data outdata; - task = scsi_cdb_writesame16(wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks); + task = scsi_cdb_writesame16(iscsi, wrprotect, anchor, unmap, pbdata, lbdata, lba, group, num_blocks); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "writesame16 cdb."); @@ -1417,7 +1416,7 @@ iscsi_unmap_task(struct iscsi_context *iscsi, int lun, int anchor, int group, xferlen = 8 + list_len * 16; - task = scsi_cdb_unmap(anchor, group, xferlen); + task = scsi_cdb_unmap(iscsi, anchor, group, xferlen); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "unmap cdb."); @@ -1484,7 +1483,7 @@ iscsi_readtoc_task(struct iscsi_context *iscsi, int lun, int msf, { struct scsi_task *task; - task = scsi_cdb_readtoc(msf, format, track_session, maxsize); + task = scsi_cdb_readtoc(iscsi, msf, format, track_session, maxsize); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "read TOC cdb."); @@ -1505,7 +1504,7 @@ iscsi_reserve6_task(struct iscsi_context *iscsi, int lun, { struct scsi_task *task; - task = scsi_cdb_reserve6(); + task = scsi_cdb_reserve6(iscsi); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "reserve6 cdb."); @@ -1526,7 +1525,7 @@ iscsi_release6_task(struct iscsi_context *iscsi, int lun, { struct scsi_task *task; - task = scsi_cdb_release6(); + task = scsi_cdb_release6(iscsi); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "release6 cdb."); @@ -1548,7 +1547,7 @@ iscsi_report_supported_opcodes_task(struct iscsi_context *iscsi, { struct scsi_task *task; - task = scsi_cdb_report_supported_opcodes(return_timeouts, maxsize); + task = scsi_cdb_report_supported_opcodes(iscsi, return_timeouts, maxsize); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "Maintenance In/Read Supported Op Codes cdb."); diff --git a/lib/scsi-lowlevel.c b/lib/scsi-lowlevel.c index 3f8020e..73e9d1d 100644 --- a/lib/scsi-lowlevel.c +++ b/lib/scsi-lowlevel.c @@ -46,24 +46,32 @@ scsi_free_scsi_task(struct scsi_task *task) struct scsi_allocated_memory *mem; while ((mem = task->mem)) { - SLIST_REMOVE(&task->mem, mem); - free(mem); + SLIST_REMOVE(&task->mem, mem); + iscsi_free(task->iscsi, mem); } - free(task->datain.data); - free(task); + iscsi_free(task->iscsi,task->datain.data); + iscsi_free(task->iscsi,task); +} + +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; } void * scsi_malloc(struct scsi_task *task, size_t size) { struct scsi_allocated_memory *mem; - - mem = malloc(sizeof(struct scsi_allocated_memory) + size); + mem = iscsi_zmalloc(task->iscsi,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; @@ -163,16 +171,15 @@ scsi_sense_ascq_str(int ascq) * TESTUNITREADY */ struct scsi_task * -scsi_cdb_testunitready(void) +scsi_cdb_testunitready(struct iscsi_context *iscsi) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_TESTUNITREADY; task->cdb_size = 6; @@ -187,16 +194,15 @@ scsi_cdb_testunitready(void) * REPORTLUNS */ struct scsi_task * -scsi_reportluns_cdb(int report_type, int alloc_len) +scsi_reportluns_cdb(struct iscsi_context *iscsi, int report_type, int alloc_len) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); 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); @@ -268,16 +274,15 @@ scsi_reportluns_datain_unmarshall(struct scsi_task *task) * READCAPACITY10 */ struct scsi_task * -scsi_cdb_readcapacity10(int lba, int pmi) +scsi_cdb_readcapacity10(struct iscsi_context *iscsi, int lba, int pmi) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); 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); @@ -302,7 +307,7 @@ scsi_cdb_readcapacity10(int lba, int pmi) * READTOC */ struct scsi_task * -scsi_cdb_readtoc(int msf, int format, int track_session, uint16_t alloc_len) +scsi_cdb_readtoc(struct iscsi_context *iscsi, int msf, int format, int track_session, uint16_t alloc_len) { struct scsi_task *task; @@ -312,12 +317,11 @@ scsi_cdb_readtoc(int msf, int format, int track_session, uint16_t alloc_len) return NULL; } - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_READTOC; if (msf) { @@ -456,16 +460,15 @@ scsi_readtoc_datain_unmarshall(struct scsi_task *task) * RESERVE6 */ struct scsi_task * -scsi_cdb_reserve6(void) +scsi_cdb_reserve6(struct iscsi_context *iscsi) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_RESERVE6; task->cdb_size = 6; @@ -477,16 +480,15 @@ scsi_cdb_reserve6(void) * RELEASE10 */ struct scsi_task * -scsi_cdb_release6(void) +scsi_cdb_release6(struct iscsi_context *iscsi) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_RELEASE6; task->cdb_size = 6; @@ -637,16 +639,15 @@ scsi_maintenancein_datain_unmarshall(struct scsi_task *task) * MAINTENANCE In / Read Supported Op Codes */ struct scsi_task * -scsi_cdb_report_supported_opcodes(int return_timeouts, uint32_t alloc_len) +scsi_cdb_report_supported_opcodes(struct iscsi_context *iscsi, int return_timeouts, uint32_t alloc_len) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); 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; @@ -711,16 +712,15 @@ scsi_readcapacity10_datain_unmarshall(struct scsi_task *task) * INQUIRY */ struct scsi_task * -scsi_cdb_inquiry(int evpd, int page_code, int alloc_len) +scsi_cdb_inquiry(struct iscsi_context *iscsi, int evpd, int page_code, int alloc_len) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_INQUIRY; if (evpd) { @@ -987,7 +987,7 @@ scsi_inquiry_datain_unmarshall(struct scsi_task *task) * READ6 */ struct scsi_task * -scsi_cdb_read6(uint32_t lba, uint32_t xferlen, int blocksize) +scsi_cdb_read6(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize) { struct scsi_task *task; int num_blocks; @@ -1001,12 +1001,11 @@ scsi_cdb_read6(uint32_t lba, uint32_t xferlen, int blocksize) return NULL; } - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_READ6; task->cdb_size = 6; @@ -1035,16 +1034,15 @@ scsi_cdb_read6(uint32_t lba, uint32_t xferlen, int blocksize) * READ10 */ 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) +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) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_READ10; task->cdb[1] |= ((rdprotect & 0x07) << 5); @@ -1081,16 +1079,15 @@ scsi_cdb_read10(uint32_t lba, uint32_t xferlen, int blocksize, int rdprotect, in * READ12 */ 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) +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) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_READ12; task->cdb[1] |= ((rdprotect & 0x07) << 5); @@ -1127,16 +1124,15 @@ scsi_cdb_read12(uint32_t lba, uint32_t xferlen, int blocksize, int rdprotect, in * READ16 */ 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) +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) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_READ16; task->cdb[1] |= ((rdprotect & 0x07) << 5); @@ -1174,16 +1170,15 @@ scsi_cdb_read16(uint64_t lba, uint32_t xferlen, int blocksize, int rdprotect, in * WRITE10 */ 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) +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) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_WRITE10; task->cdb[1] |= ((wrprotect & 0x07) << 5); @@ -1220,16 +1215,15 @@ scsi_cdb_write10(uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, i * WRITE12 */ 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) +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) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_WRITE12; task->cdb[1] |= ((wrprotect & 0x07) << 5); @@ -1266,16 +1260,15 @@ scsi_cdb_write12(uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, i * WRITE16 */ 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) +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) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_WRITE16; task->cdb[1] |= ((wrprotect & 0x07) << 5); @@ -1313,16 +1306,15 @@ scsi_cdb_write16(uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, i * ORWRITE */ 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) +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) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_ORWRITE; task->cdb[1] |= ((wrprotect & 0x07) << 5); @@ -1360,16 +1352,15 @@ scsi_cdb_orwrite(uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, i * COMPAREANDWRITE */ 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) +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) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); 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); @@ -1406,16 +1397,15 @@ scsi_cdb_compareandwrite(uint64_t lba, uint32_t xferlen, int blocksize, int wrpr * VERIFY10 */ struct scsi_task * -scsi_cdb_verify10(uint32_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize) +scsi_cdb_verify10(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_VERIFY10; if (vprotect) { @@ -1452,16 +1442,15 @@ scsi_cdb_verify10(uint32_t lba, uint32_t xferlen, int vprotect, int dpo, int byt * VERIFY12 */ struct scsi_task * -scsi_cdb_verify12(uint32_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize) +scsi_cdb_verify12(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_VERIFY12; if (vprotect) { @@ -1498,16 +1487,15 @@ scsi_cdb_verify12(uint32_t lba, uint32_t xferlen, int vprotect, int dpo, int byt * VERIFY16 */ struct scsi_task * -scsi_cdb_verify16(uint64_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize) +scsi_cdb_verify16(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, int vprotect, int dpo, int bytchk, int blocksize) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_VERIFY16; if (vprotect) { @@ -1545,16 +1533,15 @@ scsi_cdb_verify16(uint64_t lba, uint32_t xferlen, int vprotect, int dpo, int byt * UNMAP */ struct scsi_task * -scsi_cdb_unmap(int anchor, int group, uint16_t xferlen) +scsi_cdb_unmap(struct iscsi_context *iscsi, int anchor, int group, uint16_t xferlen) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_UNMAP; if (anchor) { @@ -1579,16 +1566,15 @@ scsi_cdb_unmap(int anchor, int group, uint16_t xferlen) * WRITE_SAME10 */ 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) +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) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_WRITE_SAME10; if (wrprotect) { @@ -1623,16 +1609,15 @@ scsi_cdb_writesame10(int wrprotect, int anchor, int unmap, int pbdata, int lbdat * WRITE_SAME16 */ 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) +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) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_WRITE_SAME16; if (wrprotect) { @@ -1668,18 +1653,17 @@ scsi_cdb_writesame16(int wrprotect, int anchor, int unmap, int pbdata, int lbdat * MODESENSE6 */ struct scsi_task * -scsi_cdb_modesense6(int dbd, enum scsi_modesense_page_control pc, +scsi_cdb_modesense6(struct iscsi_context *iscsi, 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 = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_MODESENSE6; if (dbd) { @@ -1859,16 +1843,15 @@ scsi_modesense_datain_unmarshall(struct scsi_task *task) * STARTSTOPUNIT */ struct scsi_task * -scsi_cdb_startstopunit(int immed, int pcm, int pc, int no_flush, int loej, int start) +scsi_cdb_startstopunit(struct iscsi_context *iscsi, int immed, int pcm, int pc, int no_flush, int loej, int start) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_STARTSTOPUNIT; if (immed) { @@ -1905,16 +1888,15 @@ scsi_cdb_startstopunit(int immed, int pcm, int pc, int no_flush, int loej, int s * PREVENTALLOWMEDIUMREMOVAL */ struct scsi_task * -scsi_cdb_preventallow(int prevent) +scsi_cdb_preventallow(struct iscsi_context *iscsi, int prevent) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_PREVENTALLOW; task->cdb[4] = prevent & 0x03; @@ -1932,16 +1914,15 @@ scsi_cdb_preventallow(int prevent) * SYNCHRONIZECACHE10 */ struct scsi_task * -scsi_cdb_synchronizecache10(int lba, int num_blocks, int syncnv, int immed) +scsi_cdb_synchronizecache10(struct iscsi_context *iscsi, int lba, int num_blocks, int syncnv, int immed) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_SYNCHRONIZECACHE10; if (syncnv) { @@ -1964,16 +1945,15 @@ scsi_cdb_synchronizecache10(int lba, int num_blocks, int syncnv, int immed) * SYNCHRONIZECACHE16 */ struct scsi_task * -scsi_cdb_synchronizecache16(uint64_t lba, uint32_t num_blocks, int syncnv, int immed) +scsi_cdb_synchronizecache16(struct iscsi_context *iscsi, uint64_t lba, uint32_t num_blocks, int syncnv, int immed) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_SYNCHRONIZECACHE16; if (syncnv) { @@ -1997,16 +1977,15 @@ scsi_cdb_synchronizecache16(uint64_t lba, uint32_t num_blocks, int syncnv, int i * PREFETCH10 */ struct scsi_task * -scsi_cdb_prefetch10(uint32_t lba, int num_blocks, int immed, int group) +scsi_cdb_prefetch10(struct iscsi_context *iscsi, uint32_t lba, int num_blocks, int immed, int group) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_PREFETCH10; if (immed) { @@ -2027,16 +2006,15 @@ scsi_cdb_prefetch10(uint32_t lba, int num_blocks, int immed, int group) * PREFETCH16 */ struct scsi_task * -scsi_cdb_prefetch16(uint64_t lba, int num_blocks, int immed, int group) +scsi_cdb_prefetch16(struct iscsi_context *iscsi, uint64_t lba, int num_blocks, int immed, int group) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_PREFETCH16; if (immed) { @@ -2059,16 +2037,15 @@ scsi_cdb_prefetch16(uint64_t lba, int num_blocks, int immed, int group) * SERVICEACTIONIN16 */ struct scsi_task * -scsi_cdb_serviceactionin16(enum scsi_service_action_in sa, uint32_t xferlen) +scsi_cdb_serviceactionin16(struct iscsi_context *iscsi, enum scsi_service_action_in sa, uint32_t xferlen) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); if (task == NULL) { return NULL; } - memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_SERVICE_ACTION_IN; task->cdb[1] = sa; @@ -2092,25 +2069,24 @@ scsi_cdb_serviceactionin16(enum scsi_service_action_in sa, uint32_t xferlen) * READCAPACITY16 */ struct scsi_task * -scsi_cdb_readcapacity16(void) +scsi_cdb_readcapacity16(struct iscsi_context *iscsi) { - return scsi_cdb_serviceactionin16(SCSI_READCAPACITY16, 32); + return scsi_cdb_serviceactionin16(iscsi, SCSI_READCAPACITY16, 32); } /* * GET_LBA_STATUS */ struct scsi_task * -scsi_cdb_get_lba_status(uint64_t starting_lba, uint32_t alloc_len) +scsi_cdb_get_lba_status(struct iscsi_context *iscsi, uint64_t starting_lba, uint32_t alloc_len) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); 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; @@ -2136,16 +2112,15 @@ scsi_cdb_get_lba_status(uint64_t starting_lba, uint32_t alloc_len) * WRITEVERIFY10 */ struct scsi_task * -scsi_cdb_writeverify10(uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number) +scsi_cdb_writeverify10(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); 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); @@ -2179,16 +2154,15 @@ scsi_cdb_writeverify10(uint32_t lba, uint32_t xferlen, int blocksize, int wrprot * WRITEVERIFY12 */ struct scsi_task * -scsi_cdb_writeverify12(uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number) +scsi_cdb_writeverify12(struct iscsi_context *iscsi, uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); 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); @@ -2222,16 +2196,15 @@ scsi_cdb_writeverify12(uint32_t lba, uint32_t xferlen, int blocksize, int wrprot * WRITEVERIFY16 */ struct scsi_task * -scsi_cdb_writeverify16(uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number) +scsi_cdb_writeverify16(struct iscsi_context *iscsi, uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, int dpo, int bytchk, int group_number) { struct scsi_task *task; - task = malloc(sizeof(struct scsi_task)); + task = scsi_create_scsi_task(iscsi); 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); diff --git a/lib/socket.c b/lib/socket.c index 4c4da61..247cea5 100644 --- a/lib/socket.c +++ b/lib/socket.c @@ -122,7 +122,7 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal, return -1; } - addr = strdup(portal); + addr = iscsi_strdup(iscsi, portal); if (addr == NULL) { iscsi_set_error(iscsi, "Out-of-memory: " "Failed to strdup portal address."); @@ -151,7 +151,7 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal, host ++; str = strchr(host, ']'); if (str == NULL) { - free(addr); + iscsi_free(iscsi, addr); iscsi_set_error(iscsi, "Invalid target:%s " "Missing ']' in IPv6 address", portal); return -1; @@ -161,12 +161,12 @@ iscsi_connect_async(struct iscsi_context *iscsi, const char *portal, /* is it a hostname ? */ if (getaddrinfo(host, NULL, NULL, &ai) != 0) { - free(addr); + iscsi_free(iscsi, addr); iscsi_set_error(iscsi, "Invalid target:%s " "Can not resolv into IPv4/v6.", portal); return -1; } - free(addr); + iscsi_free(iscsi, addr); switch (ai->ai_family) { case AF_INET: @@ -296,12 +296,11 @@ iscsi_read_from_socket(struct iscsi_context *iscsi) ssize_t data_size, count; if (iscsi->incoming == NULL) { - iscsi->incoming = malloc(sizeof(struct iscsi_in_pdu)); + iscsi->incoming = iscsi_zmalloc(iscsi, sizeof(struct iscsi_in_pdu)); if (iscsi->incoming == NULL) { iscsi_set_error(iscsi, "Out-of-memory: failed to malloc iscsi_in_pdu"); return -1; } - memset(iscsi->incoming, 0, sizeof(struct iscsi_in_pdu)); } in = iscsi->incoming; @@ -346,7 +345,7 @@ iscsi_read_from_socket(struct iscsi_context *iscsi) /* if not, allocate one */ if (buf == NULL) { if (in->data == NULL) { - in->data = malloc(data_size); + in->data = iscsi_malloc(iscsi, data_size); if (in->data == NULL) { iscsi_set_error(iscsi, "Out-of-memory: failed to malloc iscsi_in_pdu->data(%d)", (int)data_size); return -1; @@ -385,7 +384,7 @@ iscsi_read_from_socket(struct iscsi_context *iscsi) return -1; } SLIST_REMOVE(&iscsi->inqueue, current); - iscsi_free_iscsi_in_pdu(current); + iscsi_free_iscsi_in_pdu(iscsi, current); } @@ -442,7 +441,7 @@ iscsi_write_to_socket(struct iscsi_context *iscsi) return 0; } -int inline +inline int iscsi_service_reconnect_if_loggedin(struct iscsi_context *iscsi) { if (iscsi->is_loggedin) { @@ -553,18 +552,18 @@ iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) } void -iscsi_free_iscsi_in_pdu(struct iscsi_in_pdu *in) +iscsi_free_iscsi_in_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in) { - free(in->data); - free(in); + iscsi_free(iscsi, in->data); + iscsi_free(iscsi, in); } void -iscsi_free_iscsi_inqueue(struct iscsi_in_pdu *inqueue) +iscsi_free_iscsi_inqueue(struct iscsi_context *iscsi, struct iscsi_in_pdu *inqueue) { while (inqueue != NULL) { struct iscsi_in_pdu *next = inqueue->next; - iscsi_free_iscsi_in_pdu(inqueue); + iscsi_free_iscsi_in_pdu(iscsi, inqueue); inqueue = next; } }