iscsi_queue_pdu() can never fail, make it void

Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
This commit is contained in:
Ronnie Sahlberg
2025-04-20 13:27:47 +10:00
parent 37bc6fcd81
commit 3fc5d2996b
20 changed files with 49 additions and 102 deletions
+3 -5
View File
@@ -344,10 +344,11 @@ void iscsi_cancel_pdus(struct iscsi_context *iscsi);
void iscsi_cancel_lun_pdus(struct iscsi_context *iscsi, uint32_t lun); void iscsi_cancel_lun_pdus(struct iscsi_context *iscsi, uint32_t lun);
int iscsi_pdu_add_data(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, int iscsi_pdu_add_data(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
const unsigned char *dptr, int dsize); const unsigned char *dptr, int dsize);
int iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu); void iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu);
int iscsi_add_data(struct iscsi_context *iscsi, struct iscsi_data *data, int iscsi_add_data(struct iscsi_context *iscsi, struct iscsi_data *data,
const unsigned char *dptr, int dsize, int pdualignment); const unsigned char *dptr, int dsize, int pdualignment);
void iscsi_add_to_outqueue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu);
struct scsi_task; struct scsi_task;
void iscsi_pdu_set_cdb(struct iscsi_pdu *pdu, struct scsi_task *task); void iscsi_pdu_set_cdb(struct iscsi_pdu *pdu, struct scsi_task *task);
@@ -417,9 +418,6 @@ void iscsi_decrement_iface_rr(void);
void __attribute__((format(printf, 3, 4))) void __attribute__((format(printf, 3, 4)))
iscsi_log_message(struct iscsi_context *iscsi, int level, const char *format, ...); iscsi_log_message(struct iscsi_context *iscsi, int level, const char *format, ...);
void
iscsi_add_to_outqueue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu);
int iscsi_serial32_compare(uint32_t s1, uint32_t s2); int iscsi_serial32_compare(uint32_t s1, uint32_t s2);
uint32_t iscsi_itt_post_increment(struct iscsi_context *iscsi); uint32_t iscsi_itt_post_increment(struct iscsi_context *iscsi);
@@ -443,7 +441,7 @@ union socket_address;
typedef struct iscsi_transport { typedef struct iscsi_transport {
int (*connect)(struct iscsi_context *iscsi, union socket_address *sa, int ai_family); int (*connect)(struct iscsi_context *iscsi, union socket_address *sa, int ai_family);
int (*queue_pdu)(struct iscsi_context *iscsi, struct iscsi_pdu *pdu); void (*queue_pdu)(struct iscsi_context *iscsi, struct iscsi_pdu *pdu);
struct iscsi_pdu* (*new_pdu)(struct iscsi_context *iscsi, size_t size); struct iscsi_pdu* (*new_pdu)(struct iscsi_context *iscsi, size_t size);
int (*disconnect)(struct iscsi_context *iscsi); int (*disconnect)(struct iscsi_context *iscsi);
void (*free_pdu)(struct iscsi_context *iscsi, struct iscsi_pdu *pdu); void (*free_pdu)(struct iscsi_context *iscsi, struct iscsi_pdu *pdu);
+1 -6
View File
@@ -73,12 +73,7 @@ iscsi_discovery_async(struct iscsi_context *iscsi, iscsi_command_cb cb,
pdu->callback = cb; pdu->callback = cb;
pdu->private_data = private_data; pdu->private_data = private_data;
if (iscsi_queue_pdu(iscsi, pdu) != 0) { iscsi_queue_pdu(iscsi, pdu);
iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi "
"text pdu.");
iscsi->drv->free_pdu(iscsi, pdu);
return -1;
}
return 0; return 0;
} }
+2 -12
View File
@@ -128,12 +128,7 @@ iscsi_send_data_out(struct iscsi_context *iscsi, struct iscsi_pdu *cmd_pdu,
/* update data segment length */ /* update data segment length */
scsi_set_uint32(&pdu->outdata.data[4], pdu->payload_len); scsi_set_uint32(&pdu->outdata.data[4], pdu->payload_len);
if (iscsi_queue_pdu(iscsi, pdu) != 0) { iscsi_queue_pdu(iscsi, pdu);
iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi "
"scsi pdu.");
iscsi->drv->free_pdu(iscsi, pdu);
goto error;
}
tot_len -= len; tot_len -= len;
offset += len; offset += len;
@@ -280,12 +275,7 @@ iscsi_scsi_command_async(struct iscsi_context *iscsi, int lun,
pdu->callback = iscsi_scsi_response_cb; pdu->callback = iscsi_scsi_response_cb;
pdu->private_data = &pdu->scsi_cbdata; pdu->private_data = &pdu->scsi_cbdata;
if (iscsi_queue_pdu(iscsi, pdu) != 0) { iscsi_queue_pdu(iscsi, pdu);
iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi "
"scsi pdu.");
iscsi->drv->free_pdu(iscsi, pdu);
return -1;
}
iscsi->cmdsn++; iscsi->cmdsn++;
/* The F flag is not set. This means we haven't sent all the unsolicited /* The F flag is not set. This means we haven't sent all the unsolicited
+5 -5
View File
@@ -982,27 +982,27 @@ iscsi_iser_revive_queued_pdus(struct iscsi_context *iscsi) {
* Need to be compatible to TCP which has real queue, * Need to be compatible to TCP which has real queue,
* in iSER pdus with cmdsn not exceeds maxcmdsn are already sent. * in iSER pdus with cmdsn not exceeds maxcmdsn are already sent.
*/ */
static int static void
iscsi_iser_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) { iscsi_iser_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) {
if (pdu == NULL) { if (pdu == NULL) {
iscsi_set_error(iscsi, "trying to queue NULL pdu"); iscsi_set_error(iscsi, "trying to queue NULL pdu");
return -1; return;
} }
if (pdu->outdata.data[0] == ISCSI_PDU_NOP_OUT && if (pdu->outdata.data[0] == ISCSI_PDU_NOP_OUT &&
iscsi_iser_cm_event(iscsi) != 0) { iscsi_iser_cm_event(iscsi) != 0) {
iscsi_service_reconnect_if_loggedin(iscsi); iscsi_service_reconnect_if_loggedin(iscsi);
return -1; return;
} }
if (iscsi->outqueue != NULL || if (iscsi->outqueue != NULL ||
(iscsi_serial32_compare(pdu->cmdsn, iscsi->maxcmdsn) > 0 (iscsi_serial32_compare(pdu->cmdsn, iscsi->maxcmdsn) > 0
&& !(pdu->outdata.data[0] & ISCSI_PDU_IMMEDIATE))) { && !(pdu->outdata.data[0] & ISCSI_PDU_IMMEDIATE))) {
iscsi_add_to_outqueue(iscsi, pdu); iscsi_add_to_outqueue(iscsi, pdu);
return 0; return;
} }
return iscsi_iser_send_pdu(iscsi, pdu); iscsi_iser_send_pdu(iscsi, pdu);
} }
+2 -12
View File
@@ -1236,12 +1236,7 @@ iscsi_login_async(struct iscsi_context *iscsi, iscsi_command_cb cb,
pdu->callback = cb; pdu->callback = cb;
pdu->private_data = private_data; pdu->private_data = private_data;
if (iscsi_queue_pdu(iscsi, pdu) != 0) { iscsi_queue_pdu(iscsi, pdu);
iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi "
"pdu.");
iscsi->drv->free_pdu(iscsi, pdu);
return -1;
}
return 0; return 0;
} }
@@ -1587,12 +1582,7 @@ iscsi_logout_async(struct iscsi_context *iscsi, iscsi_command_cb cb,
pdu->callback = cb; pdu->callback = cb;
pdu->private_data = private_data; pdu->private_data = private_data;
if (iscsi_queue_pdu(iscsi, pdu) != 0) { iscsi_queue_pdu(iscsi, pdu);
iscsi_set_error(iscsi, "Out-of-memory: failed to queue iscsi "
"logout pdu.");
iscsi->drv->free_pdu(iscsi, pdu);
return -1;
}
return 0; return 0;
} }
+2 -10
View File
@@ -77,11 +77,7 @@ iscsi_nop_out_async(struct iscsi_context *iscsi, iscsi_command_cb cb,
} }
} }
if (iscsi_queue_pdu(iscsi, pdu) != 0) { iscsi_queue_pdu(iscsi, pdu);
iscsi_set_error(iscsi, "failed to queue iscsi nop-out pdu");
iscsi->drv->free_pdu(iscsi, pdu);
return -1;
}
iscsi->cmdsn++; iscsi->cmdsn++;
iscsi->nops_in_flight++; iscsi->nops_in_flight++;
@@ -122,11 +118,7 @@ iscsi_send_target_nop_out(struct iscsi_context *iscsi, uint32_t ttt, uint32_t lu
/* cmdsn is not increased if Immediate delivery*/ /* cmdsn is not increased if Immediate delivery*/
iscsi_pdu_set_cmdsn(pdu, iscsi->cmdsn); iscsi_pdu_set_cmdsn(pdu, iscsi->cmdsn);
if (iscsi_queue_pdu(iscsi, pdu) != 0) { iscsi_queue_pdu(iscsi, pdu);
iscsi_set_error(iscsi, "failed to queue iscsi nop-out pdu");
iscsi->drv->free_pdu(iscsi, pdu);
return -1;
}
ISCSI_LOG(iscsi, (iscsi->nops_in_flight > 1) ? 1 : 6, ISCSI_LOG(iscsi, (iscsi->nops_in_flight > 1) ? 1 : 6,
"NOP Out Send (nops_in_flight: %d, pdu->cmdsn %08x, pdu->itt %08x, pdu->ttt %08x, pdu->lun %8x, iscsi->maxcmdsn %08x, iscsi->expcmdsn %08x)", "NOP Out Send (nops_in_flight: %d, pdu->cmdsn %08x, pdu->itt %08x, pdu->ttt %08x, pdu->lun %8x, iscsi->maxcmdsn %08x, iscsi->expcmdsn %08x)",
+2 -8
View File
@@ -937,16 +937,10 @@ iscsi_timeout_scan(struct iscsi_context *iscsi)
} }
} }
int void
iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
{ {
int ret; iscsi->drv->queue_pdu(iscsi, pdu);
iscsi_mt_mutex_lock(&iscsi->iscsi_mutex);
ret = iscsi->drv->queue_pdu(iscsi, pdu);
iscsi_mt_mutex_unlock(&iscsi->iscsi_mutex);
return ret;
} }
void void
+1 -8
View File
@@ -1136,17 +1136,10 @@ iscsi_service(struct iscsi_context *iscsi, int revents)
return iscsi->drv->service(iscsi, revents); return iscsi->drv->service(iscsi, revents);
} }
static int iscsi_tcp_queue_pdu(struct iscsi_context *iscsi, static void iscsi_tcp_queue_pdu(struct iscsi_context *iscsi,
struct iscsi_pdu *pdu) struct iscsi_pdu *pdu)
{ {
if (pdu == NULL) {
iscsi_set_error(iscsi, "trying to queue NULL pdu");
return -1;
}
iscsi_add_to_outqueue(iscsi, pdu); iscsi_add_to_outqueue(iscsi, pdu);
return 0;
} }
void void
+1 -5
View File
@@ -80,11 +80,7 @@ iscsi_task_mgmt_async(struct iscsi_context *iscsi,
pdu->callback = cb; pdu->callback = cb;
pdu->private_data = private_data; pdu->private_data = private_data;
if (iscsi_queue_pdu(iscsi, pdu) != 0) { iscsi_queue_pdu(iscsi, pdu);
iscsi_set_error(iscsi, "failed to queue iscsi taskmgmt pdu");
iscsi->drv->free_pdu(iscsi, pdu);
return -1;
}
return 0; return 0;
} }
+1 -1
View File
@@ -739,7 +739,7 @@ static struct test_family families[] = {
*/ */
struct scsi_task *task; struct scsi_task *task;
unsigned char *read_write_buf; unsigned char *read_write_buf;
int (*orig_queue_pdu)(struct iscsi_context *iscsi, struct iscsi_pdu *pdu); void (*orig_queue_pdu)(struct iscsi_context *iscsi, struct iscsi_pdu *pdu);
static void static void
print_usage(void) print_usage(void)
+2 -2
View File
@@ -35,8 +35,8 @@
/* globals between setup, tests, and teardown */ /* globals between setup, tests, and teardown */
extern struct scsi_task *task; extern struct scsi_task *task;
extern unsigned char *read_write_buf; extern unsigned char *read_write_buf;
extern int (*orig_queue_pdu)(struct iscsi_context *iscsi, extern void (*orig_queue_pdu)(struct iscsi_context *iscsi,
struct iscsi_pdu *pdu); struct iscsi_pdu *pdu);
#ifndef HAVE_CU_SUITEINFO_PSETUPFUNC #ifndef HAVE_CU_SUITEINFO_PSETUPFUNC
/* libcunit version 1 */ /* libcunit version 1 */
@@ -28,13 +28,13 @@
static int new_nlb = -1; static int new_nlb = -1;
static int my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) static void my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
{ {
if (pdu->outdata.data[0] != ISCSI_PDU_SCSI_REQUEST && new_nlb >= 0) { if (pdu->outdata.data[0] != ISCSI_PDU_SCSI_REQUEST && new_nlb >= 0) {
/* change NUMBER OF LOGICAL BLOCKS to new_nlb */ /* change NUMBER OF LOGICAL BLOCKS to new_nlb */
pdu->outdata.data[32 + 13] = new_nlb; pdu->outdata.data[32 + 13] = new_nlb;
} }
return orig_queue_pdu(iscsi, pdu); orig_queue_pdu(iscsi, pdu);
} }
void void
+12 -12
View File
@@ -77,7 +77,7 @@ test_iscsi_strip_tag(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
return 0; return 0;
} }
static int static void
chap_mod_strip_replace_queue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, chap_mod_strip_replace_queue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
const char *new_chap_a) const char *new_chap_a)
{ {
@@ -93,41 +93,41 @@ chap_mod_strip_replace_queue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
goto out; goto out;
} }
if (ret < 0) { if (ret < 0) {
return ret; return;
} }
ret = iscsi_pdu_add_data(iscsi, pdu, (const unsigned char *)new_chap_a, ret = iscsi_pdu_add_data(iscsi, pdu, (const unsigned char *)new_chap_a,
strlen(new_chap_a) + 1); strlen(new_chap_a) + 1);
if (ret < 0) { if (ret < 0) {
return ret; return;
} }
logging(LOG_VERBOSE, "replaced Login PDU CHAP_A setting with %s", new_chap_a); logging(LOG_VERBOSE, "replaced Login PDU CHAP_A setting with %s", new_chap_a);
out: out:
return orig_queue_pdu(iscsi, pdu); orig_queue_pdu(iscsi, pdu);
} }
static int static void
chap_mod_many_types_queue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) chap_mod_many_types_queue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
{ {
return chap_mod_strip_replace_queue(iscsi, pdu, "CHAP_A=5,6,7,8"); chap_mod_strip_replace_queue(iscsi, pdu, "CHAP_A=5,6,7,8");
} }
static int static void
chap_mod_no_type_queue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) chap_mod_no_type_queue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
{ {
return chap_mod_strip_replace_queue(iscsi, pdu, "CHAP_A="); chap_mod_strip_replace_queue(iscsi, pdu, "CHAP_A=");
} }
static int static void
chap_mod_bad_type_queue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) chap_mod_bad_type_queue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
{ {
/* value starts with '5', to catch targets that only check one byte */ /* value starts with '5', to catch targets that only check one byte */
return chap_mod_strip_replace_queue(iscsi, pdu, "CHAP_A=56"); chap_mod_strip_replace_queue(iscsi, pdu, "CHAP_A=56");
} }
static int static int
test_iscsi_chap_login(int (*test_queue_pdu)(struct iscsi_context *iscsi, test_iscsi_chap_login(void (*test_queue_pdu)(struct iscsi_context *iscsi,
struct iscsi_pdu *pdu)) struct iscsi_pdu *pdu))
{ {
struct iscsi_context *iscsi; struct iscsi_context *iscsi;
struct iscsi_url *iscsi_url; struct iscsi_url *iscsi_url;
+2 -2
View File
@@ -26,7 +26,7 @@
static int change_cmdsn; static int change_cmdsn;
static int my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) static void my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
{ {
switch (change_cmdsn) { switch (change_cmdsn) {
case 1: case 1:
@@ -45,7 +45,7 @@ static int my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu
} }
change_cmdsn = 0; change_cmdsn = 0;
return orig_queue_pdu(iscsi, pdu); orig_queue_pdu(iscsi, pdu);
} }
void test_iscsi_cmdsn_toohigh(void) void test_iscsi_cmdsn_toohigh(void)
+2 -2
View File
@@ -26,7 +26,7 @@
static int change_cmdsn; static int change_cmdsn;
static int my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) static void my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
{ {
switch (change_cmdsn) { switch (change_cmdsn) {
case 1: case 1:
@@ -45,7 +45,7 @@ static int my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu
} }
change_cmdsn = 0; change_cmdsn = 0;
return orig_queue_pdu(iscsi, pdu); orig_queue_pdu(iscsi, pdu);
} }
void test_iscsi_cmdsn_toolow(void) void test_iscsi_cmdsn_toolow(void)
+2 -2
View File
@@ -26,7 +26,7 @@
static int change_datasn; static int change_datasn;
static int my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) static void my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
{ {
uint32_t datasn; uint32_t datasn;
@@ -57,7 +57,7 @@ static int my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu
break; break;
} }
out: out:
return orig_queue_pdu(iscsi, pdu); orig_queue_pdu(iscsi, pdu);
} }
void test_iscsi_datasn_invalid(void) void test_iscsi_datasn_invalid(void)
+1 -2
View File
@@ -148,8 +148,7 @@ test_iscsi_text_req_queue(struct iscsi_context *iscsi,
pdu->callback = cb; pdu->callback = cb;
pdu->private_data = state; pdu->private_data = state;
ret = iscsi_queue_pdu(iscsi, pdu); iscsi_queue_pdu(iscsi, pdu);
CU_ASSERT_EQUAL_FATAL(ret, 0);
state->dispatched++; state->dispatched++;
logging(LOG_VERBOSE, "queued Text request %d with %s", logging(LOG_VERBOSE, "queued Text request %d with %s",
state->dispatched, kv_data); state->dispatched, kv_data);
@@ -26,7 +26,7 @@
static int change_num; static int change_num;
static int my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) static void my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
{ {
switch (change_num) { switch (change_num) {
case 1: case 1:
@@ -44,7 +44,7 @@ static int my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu
} }
change_num = 0; change_num = 0;
return orig_queue_pdu(iscsi, pdu); orig_queue_pdu(iscsi, pdu);
} }
void test_sanitize_block_erase_reserved(void) void test_sanitize_block_erase_reserved(void)
@@ -26,7 +26,7 @@
static int change_num; static int change_num;
static int my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) static void my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
{ {
switch (change_num) { switch (change_num) {
case 1: case 1:
@@ -44,7 +44,7 @@ static int my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu
} }
change_num = 0; change_num = 0;
return orig_queue_pdu(iscsi, pdu); orig_queue_pdu(iscsi, pdu);
} }
void test_sanitize_crypto_erase_reserved(void) void test_sanitize_crypto_erase_reserved(void)
+2 -2
View File
@@ -27,7 +27,7 @@
static int change_num; static int change_num;
static int my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu) static void my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu)
{ {
switch (change_num) { switch (change_num) {
case 1: case 1:
@@ -45,7 +45,7 @@ static int my_iscsi_queue_pdu(struct iscsi_context *iscsi, struct iscsi_pdu *pdu
} }
change_num = 0; change_num = 0;
return orig_queue_pdu(iscsi, pdu); orig_queue_pdu(iscsi, pdu);
} }
void test_sanitize_overwrite_reserved(void) void test_sanitize_overwrite_reserved(void)