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