From ed1c3e1129423c21c7adcf252e601e8541a85c01 Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Mon, 10 Sep 2012 19:08:57 -0700 Subject: [PATCH] TESTS: Fix all 0block tests Remove the test for accessing 0blocks (transfer length==0) at the end of the device since they were invalid. SBC says that : If the LBA plus the transfer length exceeds the capacity of the medium, then the device server shall terminate the command with CHECK CONDITION status with the sense key set to ILLEGAL REQUEST and the additional sense code set to LOGICAL BLOCK ADDRESS OUT OF RANGE. This means that if TL==0 then a LBA that is the first LBA beyond the end of device is actually valid. Improve output for error conditions and harminize all tests --- test-tool/0102_read10_0blocks.c | 88 +++++++++------ test-tool/0184_writesame10_0blocks.c | 93 +++++++++------- test-tool/0194_writesame16_0blocks.c | 84 ++++++++------ test-tool/0203_read16_0blocks.c | 81 ++++++++------ test-tool/0213_read12_0blocks.c | 89 +++++++++------ test-tool/0223_write16_0blocks.c | 87 ++++++++------- test-tool/0233_write12_0blocks.c | 92 +++++++++------ test-tool/0243_prefetch10_0blocks.c | 157 +++++++++++++++++--------- test-tool/0253_prefetch16_0blocks.c | 161 ++++++++++++++++++--------- test-tool/0293_write10_0blocks.c | 96 +++++++++------- 10 files changed, 632 insertions(+), 396 deletions(-) diff --git a/test-tool/0102_read10_0blocks.c b/test-tool/0102_read10_0blocks.c index 0847e2e..0b26598 100644 --- a/test-tool/0102_read10_0blocks.c +++ b/test-tool/0102_read10_0blocks.c @@ -32,12 +32,11 @@ int T0102_read10_0blocks(const char *initiator, const char *url, int data_loss _ printf("0102_read10_0blocks:\n"); printf("====================\n"); if (show_info) { - printf("Test that READ10 works correctly when reading 0 number of blocks.\n"); - printf("1, Read at 0 should work.\n"); - printf("2, Read at end-of-lun should work.\n"); - printf("3, Read beyond end-of-lun should fail.\n"); - printf("4, Read at LBA:2^31 should fail (only on LUNs < 2TB).\n"); - printf("5, Read at LBA:-1 should fail (only on LUNs < 2TB).\n"); + printf("Test that READ10 works correctly when transfer length is 0 blocks.\n"); + printf("1, Read at LBA:0 should work.\n"); + printf("2, Read at one block beyond end-of-lun should fail. (only on LUNs with less than 2^31 blocks)\n"); + printf("3, Read at LBA:2^31 should fail (only on LUNs with less than 2^31 blocks).\n"); + printf("4, Read at LBA:-1 should fail (only on LUNs with less than 2^31 blocks).\n"); printf("\n"); return 0; } @@ -74,7 +73,7 @@ int T0102_read10_0blocks(const char *initiator, const char *url, int data_loss _ scsi_free_scsi_task(task); - printf("READ10 0blocks at LBA:0 "); + printf("READ10 0blocks at LBA:0 ... "); task = iscsi_read10_sync(iscsi, lun, 0, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); @@ -89,73 +88,82 @@ int T0102_read10_0blocks(const char *initiator, const char *url, int data_loss _ scsi_free_scsi_task(task); goto test2; } + scsi_free_scsi_task(task); printf("[OK]\n"); test2: - printf("READ10 0blocks at LBA: "); - task = iscsi_read10_sync(iscsi, lun, num_blocks, 0, block_size, 0, 0, 0, 0, 0); - if (task == NULL) { - printf("[FAILED]\n"); - printf("Failed to send READ10 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; + printf("READ10 0blocks at one block beyond ... "); + if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); + printf("LUN is too big, skipping test\n"); goto test3; } - if (task->status != SCSI_STATUS_GOOD) { - printf("[FAILED]\n"); - printf("READ10 command: failed with sense. %s\n", iscsi_get_error(iscsi)); - ret = -1; - scsi_free_scsi_task(task); - goto test3; - } - printf("[OK]\n"); - - -test3: - printf("READ10 0blocks at LBA: "); task = iscsi_read10_sync(iscsi, lun, num_blocks + 1, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send READ10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test4; + goto test3; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("READ10 command: Should fail when reading 0blocks beyond end\n"); ret = -1; scsi_free_scsi_task(task); - goto test4; + goto test3; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("READ10 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test3; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test4: +test3: printf("READ10 0blocks at LBA 2^31 ... "); if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); printf("LUN is too big, skipping test\n"); - goto test5; + goto test4; } task = iscsi_read10_sync(iscsi, lun, 0x80000000, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send READ10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test5; + goto test4; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("READ10 command: Should fail when reading 0blocks at 2^31\n"); ret = -1; scsi_free_scsi_task(task); - goto test5; + goto test4; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("READ10 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test4; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test5: +test4: printf("READ10 0blocks at LBA -1 ... "); if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); printf("LUN is too big, skipping test\n"); goto test5; } @@ -164,19 +172,29 @@ test5: printf("[FAILED]\n"); printf("Failed to send READ10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test6; + goto test5; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("READ10 command: Should fail when reading 0blocks at -1\n"); ret = -1; scsi_free_scsi_task(task); - goto test6; + goto test5; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("READ10 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test5; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test6: +test5: finished: diff --git a/test-tool/0184_writesame10_0blocks.c b/test-tool/0184_writesame10_0blocks.c index 37b9e35..c43ab4e 100644 --- a/test-tool/0184_writesame10_0blocks.c +++ b/test-tool/0184_writesame10_0blocks.c @@ -33,12 +33,11 @@ int T0184_writesame10_0blocks(const char *initiator, const char *url, int data_l printf("0184_writesame10_0blocks:\n"); printf("=======================\n"); if (show_info) { - printf("Test that WRITESAME10 works correctly when writing 0 blocks\n"); - printf("1, Write at LBA:0 should work.\n"); - printf("2, Write at LBA:end-of-lun should work.\n"); - printf("3, Write at LBA:end-of-lun+1 should fail.\n"); - printf("4, Write at LBA 2^31 (only on LUNs < 2TB)\n"); - printf("5, Write at LBA -1 (only on LUN < 2TB)\n"); + printf("Test that WRITESAME10 works correctly when transfer length is 0 blocks.\n"); + printf("1, Writesame at LBA:0 should work.\n"); + printf("2, Writesame at one block beyond end-of-lun should fail. (only on LUNs with less than 2^31 blocks)\n"); + printf("3, Writesame at LBA:2^31 should fail (only on LUNs with less than 2^31 blocks).\n"); + printf("4, Writesame at LBA:-1 should fail (only on LUNs with less than 2^31 blocks).\n"); printf("\n"); return 0; } @@ -64,7 +63,7 @@ int T0184_writesame10_0blocks(const char *initiator, const char *url, int data_l } rc16 = scsi_datain_unmarshall(task); if (rc16 == NULL) { - printf("failed to unmarshall READCAPACITY10 data. %s\n", iscsi_get_error(iscsi)); + printf("failed to unmarshall READCAPACITY16 data. %s\n", iscsi_get_error(iscsi)); ret = -1; scsi_free_scsi_task(task); goto finished; @@ -82,7 +81,7 @@ int T0184_writesame10_0blocks(const char *initiator, const char *url, int data_l ret = 0; - printf("Writesame10 0blocks at LBA:0 "); + printf("Writesame10 0blocks at LBA:0 ... "); task = iscsi_writesame10_sync(iscsi, lun, buf, block_size, 0, 0, 0, 0, 0, 0, 0, 0); if (task == NULL) { @@ -107,54 +106,51 @@ int T0184_writesame10_0blocks(const char *initiator, const char *url, int data_l scsi_free_scsi_task(task); goto test2; } + scsi_free_scsi_task(task); printf("[OK]\n"); test2: - printf("Writesame10 0blocks at LBA: "); - task = iscsi_writesame10_sync(iscsi, lun, buf, block_size, - num_blocks, 0, 0, 0, 0, 0, 0, 0); - if (task == NULL) { - printf("[FAILED]\n"); - printf("Failed to send WRITESAME10 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; + printf("Writesame10 0blocks at one block beyond ... "); + if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); + printf("LUN is too big, skipping test\n"); goto test3; } - if (task->status != SCSI_STATUS_GOOD) { - printf("[FAILED]\n"); - printf("WRITESAME10 command: failed with sense. %s\n", iscsi_get_error(iscsi)); - ret = -1; - scsi_free_scsi_task(task); - goto test3; - } - printf("[OK]\n"); - - -test3: - printf("Writesame10 0blocks at LBA: "); task = iscsi_writesame10_sync(iscsi, lun, buf, block_size, num_blocks + 1, 0, 0, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send WRITESAME10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test4; + goto test3; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("WRITESAME10 command: Should fail when writing 0blocks beyond end\n"); ret = -1; scsi_free_scsi_task(task); - goto test4; + goto test3; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("WRITESAME10 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test3; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test4: +test3: printf("Writesame10 0blocks at LBA 2^31 ... "); if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); printf("LUN is too big, skipping test\n"); - goto test5; + goto test4; } task = iscsi_writesame10_sync(iscsi, lun, buf, block_size, 0x80000000, 0, 0, 0, 0, 0, 0, 0); @@ -162,23 +158,34 @@ test4: printf("[FAILED]\n"); printf("Failed to send WRITESAME10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test5; + goto test4; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("WRITESAME10 command: Should fail when writing 0blocks at 2^31\n"); ret = -1; scsi_free_scsi_task(task); - goto test5; + goto test4; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("WRITESAME10 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test4; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test5: +test4: printf("Writesame10 0blocks at LBA -1 ... "); if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); printf("LUN is too big, skipping test\n"); - goto test6; + goto test5; } task = iscsi_writesame10_sync(iscsi, lun, buf, block_size, -1, 0, 0, 0, 0, 0, 0, 0); @@ -186,19 +193,29 @@ test5: printf("[FAILED]\n"); printf("Failed to send WRITESAME10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test6; + goto test5; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("WRITESAME10 command: Should fail when writing 0blocks at -1\n"); ret = -1; scsi_free_scsi_task(task); - goto test6; + goto test5; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("WRITESAME10 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test5; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test6: +test5: finished: diff --git a/test-tool/0194_writesame16_0blocks.c b/test-tool/0194_writesame16_0blocks.c index ca8189a..487dc91 100644 --- a/test-tool/0194_writesame16_0blocks.c +++ b/test-tool/0194_writesame16_0blocks.c @@ -33,12 +33,11 @@ int T0194_writesame16_0blocks(const char *initiator, const char *url, int data_l printf("0194_writesame16_0blocks:\n"); printf("=======================\n"); if (show_info) { - printf("Test that WRITESAME16 works correctly when writing 0 blocks\n"); - printf("1, Write at LBA:0 should work.\n"); - printf("2, Write at LBA:end-of-lun should work.\n"); - printf("3, Write at LBA:end-of-lun+1 should fail.\n"); - printf("4, Write at LBA 2^63\n"); - printf("5, Write at LBA -1\n"); + printf("Test that WRITESAME16 works correctly when transfer length is 0 blocks.\n"); + printf("1, Writesame at LBA:0 should work.\n"); + printf("2, Writesame at one block beyond end-of-lun should fail.\n"); + printf("3, Writesame at LBA 2^63 should fail.\n"); + printf("4, Writesame at LBA -1 should fail.\n"); printf("\n"); return 0; } @@ -82,7 +81,7 @@ int T0194_writesame16_0blocks(const char *initiator, const char *url, int data_l ret = 0; - printf("Writesame16 0blocks at LBA:0 "); + printf("Writesame16 0blocks at LBA:0 ... "); task = iscsi_writesame16_sync(iscsi, lun, buf, block_size, 0, 0, 0, 0, 0, 0, 0, 0); if (task == NULL) { @@ -107,50 +106,41 @@ int T0194_writesame16_0blocks(const char *initiator, const char *url, int data_l scsi_free_scsi_task(task); goto test2; } + scsi_free_scsi_task(task); printf("[OK]\n"); test2: - printf("Writesame16 0blocks at LBA: "); - task = iscsi_writesame16_sync(iscsi, lun, buf, block_size, - num_blocks, 0, 0, 0, 0, 0, 0, 0); - if (task == NULL) { - printf("[FAILED]\n"); - printf("Failed to send WRITESAME16 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; - goto test3; - } - if (task->status != SCSI_STATUS_GOOD) { - printf("[FAILED]\n"); - printf("WRITESAME16 command: failed with sense. %s\n", iscsi_get_error(iscsi)); - ret = -1; - scsi_free_scsi_task(task); - goto test3; - } - printf("[OK]\n"); - - -test3: - printf("Writesame16 0blocks at LBA: "); + printf("Writesame16 0blocks at one block beyond ... "); task = iscsi_writesame16_sync(iscsi, lun, buf, block_size, num_blocks + 1, 0, 0, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send WRITESAME16 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test4; + goto test3; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("WRITESAME16 command: Should fail when writing 0blocks beyond end\n"); ret = -1; scsi_free_scsi_task(task); - goto test4; + goto test3; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("WRITESAME16 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test3; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test4: +test3: printf("Writesame16 0blocks at LBA 2^63 ... "); task = iscsi_writesame16_sync(iscsi, lun, buf, block_size, 0x8000000000000000, 0, 0, 0, 0, 0, 0, 0); @@ -158,19 +148,29 @@ test4: printf("[FAILED]\n"); printf("Failed to send WRITESAME16 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test5; + goto test4; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("WRITESAME16 command: Should fail when writing 0blocks at 2^63\n"); ret = -1; scsi_free_scsi_task(task); - goto test5; + goto test4; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("WRITESAME16 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test4; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test5: +test4: printf("Writesame16 0blocks at LBA -1 ... "); task = iscsi_writesame16_sync(iscsi, lun, buf, block_size, -1, 0, 0, 0, 0, 0, 0, 0); @@ -178,19 +178,29 @@ test5: printf("[FAILED]\n"); printf("Failed to send WRITESAME16 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test6; + goto test5; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("WRITESAME16 command: Should fail when writing 0blocks at -1\n"); ret = -1; scsi_free_scsi_task(task); - goto test6; + goto test5; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("WRITESAME16 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test5; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test6: +test5: finished: iscsi_logout_sync(iscsi); diff --git a/test-tool/0203_read16_0blocks.c b/test-tool/0203_read16_0blocks.c index f1769a3..4528273 100644 --- a/test-tool/0203_read16_0blocks.c +++ b/test-tool/0203_read16_0blocks.c @@ -32,12 +32,11 @@ int T0203_read16_0blocks(const char *initiator, const char *url, int data_loss _ printf("0203_read16_0blocks:\n"); printf("====================\n"); if (show_info) { - printf("Test that READ16 works correctly when reading 0 number of blocks.\n"); + printf("Test that READ16 works correctly when transfer length is 0 blocks.\n"); printf("1, Read at 0 should work.\n"); - printf("2, Read at end-of-lun should work.\n"); - printf("3, Read beyond end-of-lun should fail.\n"); - printf("4, Read at LBA:2^63 should fail.\n"); - printf("5, Read at LBA:-1 should fail.\n"); + printf("2, Read at one block beyond end-of-lun should fail.\n"); + printf("3, Read at LBA:2^63 should fail.\n"); + printf("4, Read at LBA:-1 should fail.\n"); printf("\n"); return 0; } @@ -74,7 +73,7 @@ int T0203_read16_0blocks(const char *initiator, const char *url, int data_loss _ scsi_free_scsi_task(task); - printf("READ16 0blocks at LBA:0 "); + printf("READ16 0blocks at LBA:0 ... "); task = iscsi_read16_sync(iscsi, lun, 0, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); @@ -89,86 +88,98 @@ int T0203_read16_0blocks(const char *initiator, const char *url, int data_loss _ scsi_free_scsi_task(task); goto test2; } + scsi_free_scsi_task(task); printf("[OK]\n"); test2: - printf("READ16 0blocks at LBA: "); - task = iscsi_read16_sync(iscsi, lun, num_blocks, 0, block_size, 0, 0, 0, 0, 0); - if (task == NULL) { - printf("[FAILED]\n"); - printf("Failed to send READ16 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; - goto test3; - } - if (task->status != SCSI_STATUS_GOOD) { - printf("[FAILED]\n"); - printf("READ16 command: failed with sense. %s\n", iscsi_get_error(iscsi)); - ret = -1; - scsi_free_scsi_task(task); - goto test3; - } - printf("[OK]\n"); - - -test3: - printf("READ16 0blocks at LBA: "); + printf("READ16 0blocks at LBA: ... "); task = iscsi_read16_sync(iscsi, lun, num_blocks + 1, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send READ16 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test4; + goto test3; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("READ16 command: Should fail when reading 0blocks beyond end\n"); ret = -1; scsi_free_scsi_task(task); - goto test4; + goto test3; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("READ16 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test3; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test4: +test3: printf("READ16 0blocks at LBA 2^63 ... "); task = iscsi_read16_sync(iscsi, lun, 0x8000000000000000, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send READ16 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test5; + goto test4; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("READ16 command: Should fail when reading 0blocks at 2^63\n"); ret = -1; scsi_free_scsi_task(task); - goto test5; + goto test4; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("READ16 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test4; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test5: +test4: printf("READ16 0blocks at LBA -1 ... "); task = iscsi_read16_sync(iscsi, lun, -1, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send READ16 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test6; + goto test5; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("READ16 command: Should fail when reading 0blocks at -1\n"); ret = -1; scsi_free_scsi_task(task); - goto test6; + goto test5; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("READ16 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test5; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test6: +test5: finished: diff --git a/test-tool/0213_read12_0blocks.c b/test-tool/0213_read12_0blocks.c index 8f294ce..d07d952 100644 --- a/test-tool/0213_read12_0blocks.c +++ b/test-tool/0213_read12_0blocks.c @@ -32,12 +32,12 @@ int T0213_read12_0blocks(const char *initiator, const char *url, int data_loss _ printf("0213_read12_0blocks:\n"); printf("====================\n"); if (show_info) { - printf("Test that READ12 works correctly when reading 0 number of blocks.\n"); - printf("1, Read at 0 should work.\n"); - printf("2, Read at end-of-lun should work.\n"); - printf("3, Read beyond end-of-lun should fail.\n"); - printf("4, Read at LBA:2^31 should fail (only on LUNs < 2TB).\n"); - printf("5, Read at LBA:-1 should fail (only on LUNs < 2TB).\n"); + printf("Test that READ12 works correctly when transfer length is 0 blocks.\n"); + printf("1, Read at LBA:0 should work.\n"); + printf("2, Read at one block beyond end-of-lun should fail. (only on LUNs with less than 2^31 blocks)\n"); + printf("3, Read at LBA:2^31 should fail (only on LUNs with less than 2^31 blocks).\n"); + printf("4, Read at LBA:-1 should fail (only on LUNs with less than 2^31 blocks).\n"); + printf("\n"); printf("\n"); return 0; } @@ -74,7 +74,7 @@ int T0213_read12_0blocks(const char *initiator, const char *url, int data_loss _ scsi_free_scsi_task(task); - printf("READ12 0blocks at LBA:0 "); + printf("READ12 0blocks at LBA:0 ... "); task = iscsi_read12_sync(iscsi, lun, 0, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); @@ -89,73 +89,82 @@ int T0213_read12_0blocks(const char *initiator, const char *url, int data_loss _ scsi_free_scsi_task(task); goto test2; } + scsi_free_scsi_task(task); printf("[OK]\n"); test2: - printf("READ12 0blocks at LBA: "); - task = iscsi_read12_sync(iscsi, lun, num_blocks, 0, block_size, 0, 0, 0, 0, 0); - if (task == NULL) { - printf("[FAILED]\n"); - printf("Failed to send READ12 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; + printf("READ12 0blocks at one block beyond ... "); + if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); + printf("LUN is too big, skipping test\n"); goto test3; } - if (task->status != SCSI_STATUS_GOOD) { - printf("[FAILED]\n"); - printf("READ12 command: failed with sense. %s\n", iscsi_get_error(iscsi)); - ret = -1; - scsi_free_scsi_task(task); - goto test3; - } - printf("[OK]\n"); - - -test3: - printf("READ12 0blocks at LBA: "); task = iscsi_read12_sync(iscsi, lun, num_blocks + 1, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send READ12 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test4; + goto test3; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("READ12 command: Should fail when reading 0blocks beyond end\n"); ret = -1; scsi_free_scsi_task(task); - goto test4; + goto test3; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("READ12 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test3; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test4: +test3: printf("READ12 0blocks at LBA 2^31 ... "); if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); printf("LUN is too big, skipping test\n"); - goto test5; + goto test4; } task = iscsi_read12_sync(iscsi, lun, 0x80000000, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send READ12 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test5; + goto test4; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("READ12 command: Should fail when reading 0blocks at 2^31\n"); ret = -1; scsi_free_scsi_task(task); - goto test5; + goto test4; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("READ12 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test4; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test5: +test4: printf("READ12 0blocks at LBA -1 ... "); if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); printf("LUN is too big, skipping test\n"); goto test5; } @@ -164,19 +173,29 @@ test5: printf("[FAILED]\n"); printf("Failed to send READ12 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test6; + goto test5; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("READ12 command: Should fail when reading 0blocks at -1\n"); ret = -1; scsi_free_scsi_task(task); - goto test6; + goto test5; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("READ12 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test5; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test6: +test5: finished: diff --git a/test-tool/0223_write16_0blocks.c b/test-tool/0223_write16_0blocks.c index ae3e1f6..9740d28 100644 --- a/test-tool/0223_write16_0blocks.c +++ b/test-tool/0223_write16_0blocks.c @@ -32,12 +32,11 @@ int T0223_write16_0blocks(const char *initiator, const char *url, int data_loss, printf("0223_write16_0blocks:\n"); printf("====================\n"); if (show_info) { - printf("Test that WRITE16 works correctly when writing 0 number of blocks.\n"); - printf("1, Read at LBA:0 should work.\n"); - printf("2, Read at LBA:end-of-lun should work.\n"); - printf("3, Read at LBA:end-of-lun+1 should fail.\n"); - printf("4, Read at LBA:2^63 should fail.\n"); - printf("5, Read at LBA:-1 should fail.\n"); + printf("Test that WRITE16 works correctly when transfer length is 0 blocks.\n"); + printf("1, Write at LBA:0 should work.\n"); + printf("2, Write at one block beyond end-of-lun should fail.\n"); + printf("3, Write at LBA:2^63 should fail.\n"); + printf("4, Write at LBA:-1 should fail.\n"); printf("\n"); return 0; } @@ -80,11 +79,11 @@ int T0223_write16_0blocks(const char *initiator, const char *url, int data_loss, } - printf("WRITE16 0blocks at LBA:0 "); + printf("WRITE16 0blocks at LBA:0 ... "); task = iscsi_write16_sync(iscsi, lun, 0, NULL, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); - printf("Failed to send write16 command: %s\n", iscsi_get_error(iscsi)); + printf("Failed to send WRITE16 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto test2; } @@ -95,85 +94,97 @@ int T0223_write16_0blocks(const char *initiator, const char *url, int data_loss, scsi_free_scsi_task(task); goto test2; } + scsi_free_scsi_task(task); printf("[OK]\n"); test2: - printf("WRITE16 0blocks at LBA: "); - task = iscsi_write16_sync(iscsi, lun, num_blocks, NULL, 0, block_size, 0, 0, 0, 0, 0); - if (task == NULL) { - printf("[FAILED]\n"); - printf("Failed to send write16 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; - goto test3; - } - if (task->status != SCSI_STATUS_GOOD) { - printf("[FAILED]\n"); - printf("WRITE16 command: failed with sense. %s\n", iscsi_get_error(iscsi)); - ret = -1; - scsi_free_scsi_task(task); - goto test3; - } - printf("[OK]\n"); - - -test3: - printf("WRITE16 0blocks at LBA: "); + printf("WRITE16 0blocks at one block beyond ... "); task = iscsi_write16_sync(iscsi, lun, num_blocks + 1, NULL, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); - printf("Failed to send write16 command: %s\n", iscsi_get_error(iscsi)); + printf("Failed to send WRITE16 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test4; + goto test3; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("WRITE16 command: Should fail when writing 0blocks beyond end\n"); ret = -1; scsi_free_scsi_task(task); - goto test4; + goto test3; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("WRITE16 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test3; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test4: +test3: printf("WRITE16 0blocks at LBA 2^63 ... "); task = iscsi_write16_sync(iscsi, lun, 0x8000000000000000, NULL, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send WRITE16 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test5; + goto test4; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("WRITE16 command: Should fail when writing 0blocks at 2^31\n"); ret = -1; scsi_free_scsi_task(task); - goto test5; + goto test4; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("WRITE16 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test4; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test5: +test4: printf("WRITE16 0blocks at LBA -1 ... "); task = iscsi_write16_sync(iscsi, lun, -1, NULL, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send WRITE16 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test6; + goto test5; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("WRITE16 command: Should fail when writing 0blocks at -1\n"); ret = -1; scsi_free_scsi_task(task); - goto test6; + goto test5; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("WRITE16 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test5; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test6: +test5: finished: iscsi_logout_sync(iscsi); diff --git a/test-tool/0233_write12_0blocks.c b/test-tool/0233_write12_0blocks.c index 925c6ec..412cdd5 100644 --- a/test-tool/0233_write12_0blocks.c +++ b/test-tool/0233_write12_0blocks.c @@ -32,12 +32,11 @@ int T0233_write12_0blocks(const char *initiator, const char *url, int data_loss, printf("0233_write12_0blocks:\n"); printf("====================\n"); if (show_info) { - printf("Test that WRITE12 works correctly when writing 0 number of blocks.\n"); - printf("1, Read at LBA:0 should work.\n"); - printf("2, Read at LBA:end-of-lun should work.\n"); - printf("3, Read at LBA:end-of-lun+1 should fail.\n"); - printf("4, Read at LBA:2^63 should fail (only on LUNs < 2TB).\n"); - printf("5, Read at LBA:-1 should fail (only on LUNs < 2TB).\n"); + printf("Test that WRITE12 works correctly when transfer length is 0 blocks.\n"); + printf("1, Write at LBA:0 should work.\n"); + printf("2, Write at one block beyond end-of-lun should fail. (only on LUNs with less than 2^31 blocks)\n"); + printf("3, Write at LBA:2^31 should fail (only on LUNs with less than 2^31 blocks).\n"); + printf("4, Write at LBA:-1 should fail (only on LUNs with less than 2^31 blocks).\n"); printf("\n"); return 0; } @@ -80,11 +79,11 @@ int T0233_write12_0blocks(const char *initiator, const char *url, int data_loss, } - printf("WRITE12 0blocks at LBA:0 "); + printf("WRITE12 0blocks at LBA:0 ... "); task = iscsi_write12_sync(iscsi, lun, 0, NULL, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); - printf("Failed to send write12 command: %s\n", iscsi_get_error(iscsi)); + printf("Failed to send WRITE12 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto test2; } @@ -95,72 +94,81 @@ int T0233_write12_0blocks(const char *initiator, const char *url, int data_loss, scsi_free_scsi_task(task); goto test2; } + scsi_free_scsi_task(task); printf("[OK]\n"); test2: - printf("WRITE12 0blocks at LBA: "); - task = iscsi_write12_sync(iscsi, lun, num_blocks, NULL, 0, block_size, 0, 0, 0, 0, 0); - if (task == NULL) { - printf("[FAILED]\n"); - printf("Failed to send write12 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; + printf("WRITE12 0blocks at one block beyond ... "); + if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); + printf("LUN is too big, skipping test\n"); goto test3; } - if (task->status != SCSI_STATUS_GOOD) { - printf("[FAILED]\n"); - printf("WRITE12 command: failed with sense. %s\n", iscsi_get_error(iscsi)); - ret = -1; - scsi_free_scsi_task(task); - goto test3; - } - printf("[OK]\n"); - - -test3: - printf("WRITE12 0blocks at LBA: "); task = iscsi_write12_sync(iscsi, lun, num_blocks + 1, NULL, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); - printf("Failed to send write12 command: %s\n", iscsi_get_error(iscsi)); + printf("Failed to send WRITE12 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test4; + goto test3; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("WRITE12 command: Should fail when writing 0blocks beyond end\n"); ret = -1; scsi_free_scsi_task(task); - goto test4; + goto test3; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("WRITE12 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test3; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test4: +test3: printf("WRITE12 0blocks at LBA 2^31 ... "); if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); printf("LUN is too big, skipping test\n"); - goto test5; + goto test4; } task = iscsi_write12_sync(iscsi, lun, 0x80000000, NULL, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send WRITE12 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test5; + goto test4; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("WRITE12 command: Should fail when writing 0blocks at 2^31\n"); ret = -1; scsi_free_scsi_task(task); - goto test5; + goto test4; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("WRITE12 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test4; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test5: +test4: printf("WRITE12 0blocks at LBA -1 ... "); if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); printf("LUN is too big, skipping test\n"); goto test5; } @@ -169,19 +177,29 @@ test5: printf("[FAILED]\n"); printf("Failed to send WRITE12 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test6; + goto test5; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("WRITE12 command: Should fail when writing 0blocks at -1\n"); ret = -1; scsi_free_scsi_task(task); - goto test6; + goto test5; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("WRITE12 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test5; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test6: +test5: finished: iscsi_logout_sync(iscsi); diff --git a/test-tool/0243_prefetch10_0blocks.c b/test-tool/0243_prefetch10_0blocks.c index 6109cb9..cf88a74 100644 --- a/test-tool/0243_prefetch10_0blocks.c +++ b/test-tool/0243_prefetch10_0blocks.c @@ -25,15 +25,18 @@ int T0243_prefetch10_0blocks(const char *initiator, const char *url, int data_lo struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; - int ret, i, lun; + int ret, lun; uint64_t num_blocks; printf("0243_prefetch10_0blocks:\n"); printf("===================\n"); if (show_info) { - printf("Test PREFETCH10 when prefetching 0 blocks.\n"); - printf("1, Verify we can prefetch 0 blocks at LBA 0.\n"); - printf("2, Verify prefetch of 0 blocks past EOL fails.\n"); + printf("Test that PREFETCH10 works correctly when transfer length is 0 blocks.\n"); + printf("Transfer Length == 0 means to PREFETCH until the end of the LUN.\n"); + printf("1, Prefetch at LBA:0 should work.\n"); + printf("2, Prefetch at one block beyond end-of-lun should fail. (only on LUNs with less than 2^31 blocks)\n"); + printf("3, Prefetch at LBA:2^31 should fail (only on LUNs with less than 2^31 blocks).\n"); + printf("4, Prefetch at LBA:-1 should fail (only on LUNs with less than 2^31 blocks).\n"); printf("\n"); return 0; } @@ -69,66 +72,118 @@ int T0243_prefetch10_0blocks(const char *initiator, const char *url, int data_lo ret = 0; - /* prefetch 0 blocks at the start of the LUN */ - printf("Prefetching 0 blocks at LBA==0 ... "); - for (i = 1; i <= 256; i++) { - task = iscsi_prefetch10_sync(iscsi, lun, 0, 0, 0, 0); - if (task == NULL) { - printf("[FAILED]\n"); - printf("Failed to send prefetch10 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; - goto test2; - } - if (task->status == SCSI_STATUS_CHECK_CONDITION - && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST - && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { - printf("[SKIPPED]\n"); - printf("Opcode is not implemented on target\n"); - scsi_free_scsi_task(task); - ret = -2; - goto finished; - } - if (task->status != SCSI_STATUS_GOOD) { - printf("[FAILED]\n"); - printf("Prefetch10 command: failed with sense. %s\n", iscsi_get_error(iscsi)); - ret = -1; - scsi_free_scsi_task(task); - goto test2; - } - scsi_free_scsi_task(task); + + /* prefetch 0blocks at the start of the LUN */ + printf("PREFETCH10 0blocks at LBA==0 ... "); + task = iscsi_prefetch10_sync(iscsi, lun, 0, 0, 0, 0); + if (task == NULL) { + printf("[FAILED]\n"); + printf("Failed to send PREFETCH10 command: %s\n", iscsi_get_error(iscsi)); + ret = -1; + goto test2; } + if (task->status == SCSI_STATUS_CHECK_CONDITION + && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST + && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { + printf("[SKIPPED]\n"); + printf("Opcode is not implemented on target\n"); + scsi_free_scsi_task(task); + ret = -2; + goto finished; + } + if (task->status != SCSI_STATUS_GOOD) { + printf("[FAILED]\n"); + printf("PREFETCH10 command: failed with sense. %s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test2; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test2: +test2: /* Prefetch 0 blocks beyond end of the LUN */ - printf("Prefetching 0 blocks beyond eol... "); + printf("PREFETCH10 0blocks at one block beyond ... "); if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); printf("LUN is too big, skipping test\n"); goto test3; } - for (i = 1; i < 256; i++) { - task = iscsi_prefetch10_sync(iscsi, lun, num_blocks + 1, 0, 0, 0); - if (task == NULL) { - printf("[FAILED]\n"); - printf("Failed to send prefetch10 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; - goto test3; - } - if (task->status != SCSI_STATUS_CHECK_CONDITION - || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST - || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { - printf("[FAILED]\n"); - printf("PREFETCH10 failed but with the wrong sense code. It should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE.\n"); - ret = -1; - scsi_free_scsi_task(task); - goto test3; - } - scsi_free_scsi_task(task); + task = iscsi_prefetch10_sync(iscsi, lun, num_blocks + 1, 0, 0, 0); + if (task == NULL) { + printf("[FAILED]\n"); + printf("Failed to send PREFETCH10 command: %s\n", iscsi_get_error(iscsi)); + ret = -1; + goto test3; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("PREFETCH10 failed but with the wrong sense code. It should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test3; + } + scsi_free_scsi_task(task); printf("[OK]\n"); test3: + /* Prefetch 0blocks at LBA:2^31 */ + printf("PREFETCH10 0blocks at LBA:2^31 ... "); + if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); + printf("LUN is too big, skipping test\n"); + goto test4; + } + task = iscsi_prefetch10_sync(iscsi, lun, 0x80000000, 0, 0, 0); + if (task == NULL) { + printf("[FAILED]\n"); + printf("Failed to send PREFETCH10 command: %s\n", iscsi_get_error(iscsi)); + ret = -1; + goto test4; + } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("PREFETCH10 failed but with the wrong sense code. It should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test4; + } + scsi_free_scsi_task(task); + printf("[OK]\n"); + +test4: + /* Prefetch 0blocks at LBA:-1 */ + printf("PREFETCH10 0blocks at LBA:-1 ... "); + if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); + printf("LUN is too big, skipping test\n"); + goto test5; + } + task = iscsi_prefetch10_sync(iscsi, lun, 0xffffffff, 0, 0, 0); + if (task == NULL) { + printf("[FAILED]\n"); + printf("Failed to send PREFETCH10 command: %s\n", iscsi_get_error(iscsi)); + ret = -1; + goto test5; + } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("PREFETCH10 failed but with the wrong sense code. It should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test5; + } + scsi_free_scsi_task(task); + printf("[OK]\n"); + +test5: finished: iscsi_logout_sync(iscsi); diff --git a/test-tool/0253_prefetch16_0blocks.c b/test-tool/0253_prefetch16_0blocks.c index 70f3822..4206390 100644 --- a/test-tool/0253_prefetch16_0blocks.c +++ b/test-tool/0253_prefetch16_0blocks.c @@ -25,15 +25,17 @@ int T0253_prefetch16_0blocks(const char *initiator, const char *url, int data_lo struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; - int ret, i, lun; + int ret, lun; uint64_t num_blocks; printf("0253_prefetch16_0blocks:\n"); printf("===================\n"); if (show_info) { - printf("Test PREFETCH16 when prefetching 0 blocks.\n"); - printf("1, Verify we can prefetch 0 blocks at LBA 0.\n"); - printf("2, Verify prefetch of 0 blocks past EOL fails.\n"); + printf("Test that PREFETCH16 works correctly when transfer length is 0 blocks.\n"); + printf("1, Prefetch at LBA:0 should work.\n"); + printf("2, Prefetch at one block beyond end-of-lun should fail.\n"); + printf("3, Prefetch at LBA:2^63 should fail.\n"); + printf("4, Prefetch at LBA:-1 should fail.\n"); printf("\n"); return 0; } @@ -70,65 +72,122 @@ int T0253_prefetch16_0blocks(const char *initiator, const char *url, int data_lo ret = 0; /* prefetch 0 blocks at the start of the LUN */ - printf("Prefetching 0 blocks at LBA==0 ... "); - for (i = 1; i <= 256; i++) { - task = iscsi_prefetch16_sync(iscsi, lun, 0, 0, 0, 0); - if (task == NULL) { - printf("[FAILED]\n"); - printf("Failed to send prefetch16 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; - goto test2; - } - if (task->status == SCSI_STATUS_CHECK_CONDITION - && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST - && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { - printf("[SKIPPED]\n"); - printf("Opcode is not implemented on target\n"); - scsi_free_scsi_task(task); - ret = -2; - goto finished; - } - if (task->status != SCSI_STATUS_GOOD) { - printf("[FAILED]\n"); - printf("Prefetch16 command: failed with sense. %s\n", iscsi_get_error(iscsi)); - ret = -1; - scsi_free_scsi_task(task); - goto test2; - } - scsi_free_scsi_task(task); + printf("PREFETCH16 0blocks at LBA==0 ... "); + task = iscsi_prefetch16_sync(iscsi, lun, 0, 0, 0, 0); + if (task == NULL) { + printf("[FAILED]\n"); + printf("Failed to send PREFETCH16 command: %s\n", iscsi_get_error(iscsi)); + ret = -1; + goto test2; } + if (task->status == SCSI_STATUS_CHECK_CONDITION + && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST + && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { + printf("[SKIPPED]\n"); + printf("Opcode is not implemented on target\n"); + scsi_free_scsi_task(task); + ret = -2; + goto finished; + } + if (task->status != SCSI_STATUS_GOOD) { + printf("[FAILED]\n"); + printf("PREFETCH16 command: failed with sense. %s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test2; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test2: +test2: /* Prefetch 0 blocks beyond end of the LUN */ - printf("Prefetching 0 blocks beyond eol... "); - if (num_blocks > 0x80000000) { - printf("LUN is too big, skipping test\n"); + printf("PREFETCH16 0blocks at one block beyond ... "); + task = iscsi_prefetch16_sync(iscsi, lun, num_blocks + 1, 0, 0, 0); + if (task == NULL) { + printf("[FAILED]\n"); + printf("Failed to send PREFETCH16 command: %s\n", iscsi_get_error(iscsi)); + ret = -1; goto test3; } - for (i = 1; i < 256; i++) { - task = iscsi_prefetch16_sync(iscsi, lun, num_blocks + 1, 0, 0, 0); - if (task == NULL) { - printf("[FAILED]\n"); - printf("Failed to send prefetch16 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; - goto test3; - } - if (task->status != SCSI_STATUS_CHECK_CONDITION - || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST - || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { - printf("[FAILED]\n"); - printf("PREFETCH16 failed but with the wrong sense code. It should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE.\n"); - ret = -1; - scsi_free_scsi_task(task); - goto test3; - } + if (task->status == SCSI_STATUS_GOOD) { + printf("[FAILED]\n"); + printf("PREFETCH16 command: Should fail when reading 0blocks beyond end\n"); + ret = -1; scsi_free_scsi_task(task); + goto test3; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("PREFETCH16 failed but with the wrong sense code. It should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test3; + } + scsi_free_scsi_task(task); printf("[OK]\n"); test3: + /* Prefetch 0 blocks at 2^63 */ + printf("PREFETCH16 0blocks at LBA:2^63 ... "); + task = iscsi_prefetch16_sync(iscsi, lun, 0x8000000000000000ULL, 0, 0, 0); + if (task == NULL) { + printf("[FAILED]\n"); + printf("Failed to send PREFETCH16 command: %s\n", iscsi_get_error(iscsi)); + ret = -1; + goto test4; + } + if (task->status == SCSI_STATUS_GOOD) { + printf("[FAILED]\n"); + printf("PREFETCH16 command: Should fail when prefetching at LBA 2^63\n"); + ret = -1; + scsi_free_scsi_task(task); + goto test4; + } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("PREFETCH16 failed but with the wrong sense code. It should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test4; + } + scsi_free_scsi_task(task); + printf("[OK]\n"); + +test4: + /* Prefetch 0 blocks at -1 */ + printf("PREFETCH16 0blocks at LBA:-1 ... "); + task = iscsi_prefetch16_sync(iscsi, lun, 0xffffffffffffffffULL, 0, 0, 0); + if (task == NULL) { + printf("[FAILED]\n"); + printf("Failed to send PREFETCH16 command: %s\n", iscsi_get_error(iscsi)); + ret = -1; + goto test5; + } + if (task->status == SCSI_STATUS_GOOD) { + printf("[FAILED]\n"); + printf("PREFETCH16 command: Should fail when prefetching at LBA -1\n"); + ret = -1; + scsi_free_scsi_task(task); + goto test5; + } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("PREFETCH16 failed but with the wrong sense code. It should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test5; + } + scsi_free_scsi_task(task); + printf("[OK]\n"); + +test5: finished: iscsi_logout_sync(iscsi); diff --git a/test-tool/0293_write10_0blocks.c b/test-tool/0293_write10_0blocks.c index 400f42a..e2998c2 100644 --- a/test-tool/0293_write10_0blocks.c +++ b/test-tool/0293_write10_0blocks.c @@ -32,12 +32,11 @@ int T0293_write10_0blocks(const char *initiator, const char *url, int data_loss, printf("0293_write10_0blocks:\n"); printf("====================\n"); if (show_info) { - printf("Test that WRITE10 works correctly when writing 0 number of blocks.\n"); - printf("1, Read at LBA:0 should work.\n"); - printf("2, Read at LBA:end-of-lun should work.\n"); - printf("3, Read at LBA:end-of-lun+1 should fail.\n"); - printf("4, Read at LBA:2^63 should fail (only on LUNs < 2TB).\n"); - printf("5, Read at LBA:-1 should fail (only on LUNs < 2TB).\n"); + printf("Test that WRITE10 works correctly when transfer length is 0 blocks.\n"); + printf("1, Write at LBA:0 should work.\n"); + printf("2, Write at one block beyond end-of-lun should fail. (only on LUNs with less than 2^31 blocks)\n"); + printf("3, Write at LBA:2^31 should fail (only on LUNs with less than 2^31 blocks).\n"); + printf("4, Write at LBA:-1 should fail (only on LUNs with less than 2^31 blocks).\n"); printf("\n"); return 0; } @@ -80,11 +79,11 @@ int T0293_write10_0blocks(const char *initiator, const char *url, int data_loss, } - printf("WRITE10 0blocks at LBA:0 "); + printf("WRITE10 0blocks at LBA:0 ... "); task = iscsi_write10_sync(iscsi, lun, 0, NULL, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); - printf("Failed to send write10 command: %s\n", iscsi_get_error(iscsi)); + printf("Failed to send WRITE10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto test2; } @@ -95,72 +94,81 @@ int T0293_write10_0blocks(const char *initiator, const char *url, int data_loss, scsi_free_scsi_task(task); goto test2; } + scsi_free_scsi_task(task); printf("[OK]\n"); test2: - printf("WRITE10 0blocks at LBA: "); - task = iscsi_write10_sync(iscsi, lun, num_blocks, NULL, 0, block_size, 0, 0, 0, 0, 0); - if (task == NULL) { - printf("[FAILED]\n"); - printf("Failed to send write10 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; + printf("WRITE10 0blocks at one block beyond ... "); + if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); + printf("LUN is too big, skipping test\n"); goto test3; } - if (task->status != SCSI_STATUS_GOOD) { - printf("[FAILED]\n"); - printf("WRITE10 command: failed with sense. %s\n", iscsi_get_error(iscsi)); - ret = -1; - scsi_free_scsi_task(task); - goto test3; - } - printf("[OK]\n"); - - -test3: - printf("WRITE10 0blocks at LBA: "); task = iscsi_write10_sync(iscsi, lun, num_blocks + 1, NULL, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); - printf("Failed to send write10 command: %s\n", iscsi_get_error(iscsi)); + printf("Failed to send WRITE10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test4; + goto test3; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("WRITE10 command: Should fail when writing 0blocks beyond end\n"); ret = -1; scsi_free_scsi_task(task); - goto test4; + goto test3; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("WRITE10 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test3; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test4: - printf("WRITE10 0blocks at LBA 2^31 ... "); +test3: + printf("WRITE10 0blocks at LBA:2^31 ... "); if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); printf("LUN is too big, skipping test\n"); - goto test5; + goto test4; } task = iscsi_write10_sync(iscsi, lun, 0x80000000, NULL, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send WRITE10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test5; + goto test4; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("WRITE10 command: Should fail when writing 0blocks at 2^31\n"); ret = -1; scsi_free_scsi_task(task); - goto test5; + goto test4; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("WRITE10 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test4; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test5: - printf("WRITE10 0blocks at LBA -1 ... "); +test4: + printf("WRITE10 0blocks at LBA:-1 ... "); if (num_blocks > 0x80000000) { + printf("[SKIPPED]\n"); printf("LUN is too big, skipping test\n"); goto test5; } @@ -169,19 +177,29 @@ test5: printf("[FAILED]\n"); printf("Failed to send WRITE10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; - goto test6; + goto test5; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("WRITE10 command: Should fail when writing 0blocks at -1\n"); ret = -1; scsi_free_scsi_task(task); - goto test6; + goto test5; } + if (task->status != SCSI_STATUS_CHECK_CONDITION + || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST + || task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { + printf("[FAILED]\n"); + printf("WRITE10 failed but ascq was wrong. Should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi)); + ret = -1; + scsi_free_scsi_task(task); + goto test5; + } + scsi_free_scsi_task(task); printf("[OK]\n"); -test6: +test5: finished: iscsi_logout_sync(iscsi);