Merge pull request #263 from bvanassche/master

Various fixes for the libiscsi test tool
This commit is contained in:
Ronnie Sahlberg
2018-03-07 13:19:39 +10:00
committed by GitHub
10 changed files with 71 additions and 27 deletions

View File

@@ -406,6 +406,7 @@ void cscd_ident_inq(struct iscsi_context *iscsi,
tgt_desig = desig; tgt_desig = desig;
prev_type = desig->designator_type; prev_type = desig->designator_type;
} }
/* fall through */
default: default:
continue; continue;
} }

View File

@@ -204,9 +204,9 @@ static int check_result(const char *opcode, struct scsi_device *sdev,
return -2; return -2;
} }
if (status == SCSI_STATUS_GOOD && task->status != SCSI_STATUS_GOOD) { if (status == SCSI_STATUS_GOOD && task->status != SCSI_STATUS_GOOD) {
logging(LOG_NORMAL, "[FAILED] %s command failed with " logging(LOG_NORMAL,
"sense. %s(0x%02x)/%s(0x%04x)", "[FAILED] %s command failed with status %d / sense key %s(0x%02x) / ASCQ %s(0x%04x)",
opcode, opcode, task->status,
scsi_sense_key_str(task->sense.key), task->sense.key, scsi_sense_key_str(task->sense.key), task->sense.key,
scsi_sense_ascq_str(task->sense.ascq), task->sense.ascq); scsi_sense_ascq_str(task->sense.ascq), task->sense.ascq);
return -1; return -1;

View File

@@ -33,6 +33,8 @@ struct tests_async_reset_state {
uint32_t reset_ok; uint32_t reset_ok;
}; };
static int reconnect_succeeded;
static void static void
test_async_write_cb(struct iscsi_context *iscsi __attribute__((unused)), test_async_write_cb(struct iscsi_context *iscsi __attribute__((unused)),
int status, void *command_data, int status, void *command_data,
@@ -63,7 +65,9 @@ test_async_reset_cb(struct iscsi_context *iscsi __attribute__((unused)),
struct tests_async_reset_state *state = private_data; struct tests_async_reset_state *state = private_data;
/* command_data NULL if a reconnect occured. see iscsi_reconnect_cb() */ /* command_data NULL if a reconnect occured. see iscsi_reconnect_cb() */
CU_ASSERT_PTR_NOT_NULL_FATAL(command_data); reconnect_succeeded = command_data != NULL;
if (!reconnect_succeeded)
return;
tmf_response = *(uint32_t *)command_data; tmf_response = *(uint32_t *)command_data;
logging(LOG_VERBOSE, "LU RESET: TMF response %d for" logging(LOG_VERBOSE, "LU RESET: TMF response %d for"
@@ -150,6 +154,9 @@ test_async_lu_reset_simple(void)
0xffffffff, 0, 0xffffffff, 0,
test_async_reset_cb, &state); test_async_reset_cb, &state);
CU_ASSERT_EQUAL(ret, 0); CU_ASSERT_EQUAL(ret, 0);
CU_ASSERT_EQUAL(reconnect_succeeded, 1);
if (!reconnect_succeeded)
goto out;
logging(LOG_VERBOSE, "LU RESET queued"); logging(LOG_VERBOSE, "LU RESET queued");
@@ -191,6 +198,7 @@ test_async_lu_reset_simple(void)
CU_FAIL("unexpected WRITE/RESET state"); CU_FAIL("unexpected WRITE/RESET state");
} }
out:
scsi_free_scsi_task(state.wtask); scsi_free_scsi_task(state.wtask);
/* Avoid that callbacks get invoked after this test finished */ /* Avoid that callbacks get invoked after this test finished */

View File

@@ -31,7 +31,7 @@
void void
test_compareandwrite_miscompare(void) test_compareandwrite_miscompare(void)
{ {
int i; int i, n;
unsigned j; unsigned j;
int maxbl; int maxbl;
@@ -44,10 +44,16 @@ test_compareandwrite_miscompare(void)
/* Assume we are not limited */ /* Assume we are not limited */
maxbl = 256; maxbl = 256;
} }
n = 256;
if (n + 0U > num_blocks)
n = num_blocks;
logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, LOG_BLANK_LINE);
logging(LOG_VERBOSE, "Test COMPARE_AND_WRITE of 1-256 blocks at the " logging(LOG_VERBOSE, "Test COMPARE_AND_WRITE of 1-%d blocks at the "
"start of the LUN. One Byte miscompare in the final block."); "start of the LUN. One Byte miscompare in the final block.",
for (i = 1; i < 256; i++) { n);
for (i = 1; i <= n; i++) {
logging(LOG_VERBOSE, "Write %d blocks of 'A' at LBA:0", i); logging(LOG_VERBOSE, "Write %d blocks of 'A' at LBA:0", i);
memset(scratch, 'A', 2 * i * block_size); memset(scratch, 'A', 2 * i * block_size);
if (maximum_transfer_length && maximum_transfer_length < i) { if (maximum_transfer_length && maximum_transfer_length < i) {
@@ -98,9 +104,9 @@ test_compareandwrite_miscompare(void)
} }
logging(LOG_VERBOSE, "Test COMPARE_AND_WRITE of 1-256 blocks at the " logging(LOG_VERBOSE, "Test COMPARE_AND_WRITE of 1-%d blocks at the "
"end of the LUN"); "end of the LUN", n);
for (i = 1; i < 256; i++) { for (i = 1; i <= n; i++) {
logging(LOG_VERBOSE, "Write %d blocks of 'A' at LBA:%" PRIu64, logging(LOG_VERBOSE, "Write %d blocks of 'A' at LBA:%" PRIu64,
i, num_blocks - i); i, num_blocks - i);
memset(scratch, 'A', 2 * i * block_size); memset(scratch, 'A', 2 * i * block_size);

View File

@@ -31,7 +31,7 @@
void void
test_compareandwrite_simple(void) test_compareandwrite_simple(void)
{ {
int i; int i, n;
unsigned j; unsigned j;
int maxbl; int maxbl;
@@ -45,10 +45,16 @@ test_compareandwrite_simple(void)
maxbl = 256; maxbl = 256;
} }
n = 256;
if (n + 0U > num_blocks)
n = num_blocks;
if (maxbl + 0U > num_blocks)
maxbl = num_blocks;
logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, LOG_BLANK_LINE);
logging(LOG_VERBOSE, "Test COMPARE_AND_WRITE of 1-256 blocks at the " logging(LOG_VERBOSE, "Test COMPARE_AND_WRITE of 1-%d blocks at the "
"start of the LUN"); "start of the LUN", n);
for (i = 1; i < 256; i++) { for (i = 1; i <= n; i++) {
logging(LOG_VERBOSE, "Write %d blocks of 'A' at LBA:0", i); logging(LOG_VERBOSE, "Write %d blocks of 'A' at LBA:0", i);
memset(scratch, 'A', 2 * i * block_size); memset(scratch, 'A', 2 * i * block_size);
if (maximum_transfer_length && maximum_transfer_length < i) { if (maximum_transfer_length && maximum_transfer_length < i) {
@@ -97,9 +103,9 @@ test_compareandwrite_simple(void)
} }
logging(LOG_VERBOSE, "Test COMPARE_AND_WRITE of 1-256 blocks at the " logging(LOG_VERBOSE, "Test COMPARE_AND_WRITE of 1-%d blocks at the "
"end of the LUN"); "end of the LUN", n);
for (i = 1; i < 256; i++) { for (i = 1; i <= n; i++) {
logging(LOG_VERBOSE, "Write %d blocks of 'A' at LBA:%" PRIu64, logging(LOG_VERBOSE, "Write %d blocks of 'A' at LBA:%" PRIu64,
i, num_blocks - i); i, num_blocks - i);
memset(scratch, 'A', 2 * i * block_size); memset(scratch, 'A', 2 * i * block_size);
@@ -115,7 +121,7 @@ test_compareandwrite_simple(void)
"BlockLimits.MaximumCompareAndWriteLength(%d). " "BlockLimits.MaximumCompareAndWriteLength(%d). "
"Command should fail with INVALID_FIELD_IN_CDB", "Command should fail with INVALID_FIELD_IN_CDB",
i, maxbl); i, maxbl);
COMPAREANDWRITE(sd, 0, COMPAREANDWRITE(sd, num_blocks - i,
scratch, 2 * i * block_size, scratch, 2 * i * block_size,
block_size, 0, 0, 0, 0, block_size, 0, 0, 0, 0,
EXPECT_INVALID_FIELD_IN_CDB); EXPECT_INVALID_FIELD_IN_CDB);

View File

@@ -32,15 +32,19 @@
void void
test_compareandwrite_unwritten(void) test_compareandwrite_unwritten(void)
{ {
int i; int i, n;
CHECK_FOR_DATALOSS; CHECK_FOR_DATALOSS;
CHECK_FOR_SBC; CHECK_FOR_SBC;
n = 256;
if (n + 0U > num_blocks)
n = num_blocks;
logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, LOG_BLANK_LINE);
logging(LOG_VERBOSE, "Test COMPARE_AND_WRITE of 1-256 blocks at the " logging(LOG_VERBOSE, "Test COMPARE_AND_WRITE of 1-%d blocks at the "
"start of the LUN, 1 block at a time"); "start of the LUN, 1 block at a time", n);
for (i = 1; i < 256; i++) { for (i = 1; i <= n; i++) {
int caw_ret; int caw_ret;
unsigned char read_buf[block_size]; unsigned char read_buf[block_size];

View File

@@ -69,6 +69,10 @@ test_extendedcopy_descr_limits(void)
RECEIVE_COPY_RESULTS(&edl_task, sd, SCSI_COPY_RESULTS_OP_PARAMS, 0, RECEIVE_COPY_RESULTS(&edl_task, sd, SCSI_COPY_RESULTS_OP_PARAMS, 0,
(void **)&opp, EXPECT_STATUS_GOOD); (void **)&opp, EXPECT_STATUS_GOOD);
CU_ASSERT_NOT_EQUAL(opp, NULL);
if (!opp)
return;
/* Allocate buffer to accommodate (MAX+1) target and /* Allocate buffer to accommodate (MAX+1) target and
* segment descriptors */ * segment descriptors */
alloc_len = XCOPY_DESC_OFFSET + alloc_len = XCOPY_DESC_OFFSET +

View File

@@ -34,7 +34,7 @@ test_multipathio_compareandwrite(void)
{ {
int io_bl = 1; /* 1 block CAW IOs */ int io_bl = 1; /* 1 block CAW IOs */
int path; int path;
int i, ret; int i, n, ret;
int maxbl; int maxbl;
CHECK_FOR_DATALOSS; CHECK_FOR_DATALOSS;
@@ -52,6 +52,10 @@ test_multipathio_compareandwrite(void)
return; return;
} }
n = 256;
if (n + 0U > num_blocks)
n = num_blocks;
logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, LOG_BLANK_LINE);
logging(LOG_VERBOSE, "Initialising data prior to COMPARE_AND_WRITE"); logging(LOG_VERBOSE, "Initialising data prior to COMPARE_AND_WRITE");
@@ -66,7 +70,7 @@ test_multipathio_compareandwrite(void)
CU_ASSERT_EQUAL(ret, 0); CU_ASSERT_EQUAL(ret, 0);
logging(LOG_VERBOSE, "Test multipath COMPARE_AND_WRITE"); logging(LOG_VERBOSE, "Test multipath COMPARE_AND_WRITE");
for (i = 0; i < 256; i++) { for (i = 0; i <= n; i++) {
for (path = 0; path < mp_num_sds; path++) { for (path = 0; path < mp_num_sds; path++) {
logging(LOG_VERBOSE, logging(LOG_VERBOSE,

View File

@@ -51,7 +51,7 @@ test_prin_report_caps_simple(void)
int ret = 0; int ret = 0;
const unsigned long long key = rand_key(); const unsigned long long key = rand_key();
struct scsi_task *tsk; struct scsi_task *tsk;
struct scsi_persistent_reserve_in_report_capabilities *rcaps; struct scsi_persistent_reserve_in_report_capabilities *rcaps = NULL;
struct test_prin_report_caps_types *type; struct test_prin_report_caps_types *type;
CHECK_FOR_DATALOSS; CHECK_FOR_DATALOSS;
@@ -71,6 +71,10 @@ test_prin_report_caps_simple(void)
ret = prin_report_caps(sd, &tsk, &rcaps); ret = prin_report_caps(sd, &tsk, &rcaps);
CU_ASSERT_EQUAL(ret, 0); CU_ASSERT_EQUAL(ret, 0);
CU_ASSERT_NOT_EQUAL(rcaps, NULL);
if (!rcaps)
return;
logging(LOG_VERBOSE, logging(LOG_VERBOSE,
"Checking PERSISTENT RESERVE IN REPORT CAPABILITIES fields."); "Checking PERSISTENT RESERVE IN REPORT CAPABILITIES fields.");

View File

@@ -33,7 +33,7 @@ test_prout_clear_simple(void)
uint32_t old_gen; uint32_t old_gen;
const unsigned long long key = rand_key(); const unsigned long long key = rand_key();
struct scsi_task *tsk; struct scsi_task *tsk;
struct scsi_persistent_reserve_in_read_keys *rk; struct scsi_persistent_reserve_in_read_keys *rk = NULL;
CHECK_FOR_DATALOSS; CHECK_FOR_DATALOSS;
@@ -51,6 +51,9 @@ test_prout_clear_simple(void)
ret = prin_read_keys(sd, &tsk, &rk); ret = prin_read_keys(sd, &tsk, &rk);
CU_ASSERT_EQUAL(ret, 0); CU_ASSERT_EQUAL(ret, 0);
CU_ASSERT_NOT_EQUAL(rk, NULL);
if (!rk)
goto out;
CU_ASSERT_NOT_EQUAL(rk->num_keys, 0); CU_ASSERT_NOT_EQUAL(rk->num_keys, 0);
/* retain PR generation number to check for increments */ /* retain PR generation number to check for increments */
@@ -78,11 +81,15 @@ test_prout_clear_simple(void)
ret = prin_read_keys(sd, &tsk, &rk); ret = prin_read_keys(sd, &tsk, &rk);
CU_ASSERT_EQUAL(ret, 0); CU_ASSERT_EQUAL(ret, 0);
CU_ASSERT_NOT_EQUAL(rk, NULL);
if (!rk)
goto out;
CU_ASSERT_EQUAL(rk->num_keys, 0); CU_ASSERT_EQUAL(rk->num_keys, 0);
/* generation incremented once for CLEAR (not for RESERVE) */ /* generation incremented once for CLEAR (not for RESERVE) */
CU_ASSERT_EQUAL(rk->prgeneration, old_gen + 1); CU_ASSERT_EQUAL(rk->prgeneration, old_gen + 1);
out:
scsi_free_scsi_task(tsk); scsi_free_scsi_task(tsk);
rk = NULL; /* freed with tsk */ rk = NULL; /* freed with tsk */
} }