MEMORY add wrappers around all mallocs and frees and trace them

This patch adds a wrapper around all memory allocations and frees.
The idea is to get warned immediately if the application leaks memory.
Additionally the wrapper functions make it easy to add different
memory allocators or memory pools in the future.
This commit is contained in:
Peter Lieven
2012-11-03 01:05:57 +01:00
parent 389f6a8ba5
commit d327ab09c6
11 changed files with 300 additions and 287 deletions

View File

@@ -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);

View File

@@ -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;
};
/*

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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.");

View File

@@ -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);

View File

@@ -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;
}
}