diff --git a/Makefile.am b/Makefile.am index 8c357ff..e651750 100644 --- a/Makefile.am +++ b/Makefile.am @@ -58,7 +58,7 @@ bin_iscsi_test_SOURCES = test-tool/iscsi-test.c \ test-tool/0102_read10_0blocks.c test-tool/0103_read10_rdprotect.c \ test-tool/0104_read10_flags.c test-tool/0105_read10_invalid.c \ test-tool/0110_readcapacity10_simple.c \ - test-tool/0111_readcapacity10_pmi.c test-tool/0120_read6_simple.c \ + test-tool/0120_read6_simple.c \ test-tool/0121_read6_beyond_eol.c test-tool/0122_read6_invalid.c \ test-tool/0130_verify10_simple.c test-tool/0131_verify10_mismatch.c \ test-tool/0132_verify10_mismatch_no_cmp.c \ diff --git a/test-tool/0100_read10_simple.c b/test-tool/0100_read10_simple.c index 09abb0e..83bff59 100644 --- a/test-tool/0100_read10_simple.c +++ b/test-tool/0100_read10_simple.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0100_read10_simple(const char *initiator, const char *url) +int T0100_read10_simple(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -28,6 +28,16 @@ int T0100_read10_simple(const char *initiator, const char *url) int ret, i, lun; uint32_t block_size, num_blocks; + printf("0100_read10_simple:\n"); + printf("===================\n"); + if (show_info) { + printf("Test basic READ10 functionality.\n"); + printf("1, Verify we can read the first 1-256 blocks of the LUN.\n"); + printf("2, Verify we can read the last 1-256 blocks of the LUN.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0101_read10_beyond_eol.c b/test-tool/0101_read10_beyond_eol.c index 8953290..7daace5 100644 --- a/test-tool/0101_read10_beyond_eol.c +++ b/test-tool/0101_read10_beyond_eol.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0101_read10_beyond_eol(const char *initiator, const char *url) +int T0101_read10_beyond_eol(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -28,6 +28,16 @@ int T0101_read10_beyond_eol(const char *initiator, const char *url) int ret, i, lun; uint32_t block_size, num_blocks; + printf("0101_read10_beyond_eol:\n"); + printf("=======================\n"); + if (show_info) { + printf("Test that READ10 fails if reading beyond end-of-lun.\n"); + printf("1, Read 1-256 blocks one block beyond end-of-lun.\n"); + printf("2, Read 2-256 blocks all but one beyond end-of-lun.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); @@ -79,16 +89,11 @@ int T0101_read10_beyond_eol(const char *initiator, const char *url) scsi_free_scsi_task(task); goto finished; } - if (task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST) { - printf("[FAILED]\n"); - printf("Read10 beyond end-of-lun did not return sense key ILLEGAL_REQUEST.\n"); - ret = -1; - scsi_free_scsi_task(task); - goto finished; - } - if (task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { - printf("[FAILED]\n"); - printf("Read10 beyond end-of-lun did not return sense ascq LBA OUT OF RANGE.\n"); + 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.\n"); ret = -1; scsi_free_scsi_task(task); goto finished; @@ -115,16 +120,11 @@ int T0101_read10_beyond_eol(const char *initiator, const char *url) scsi_free_scsi_task(task); goto finished; } - if (task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST) { - printf("[FAILED]\n"); - printf("Read10 beyond end-of-lun did not return sense key ILLEGAL_REQUEST.\n"); - ret = -1; - scsi_free_scsi_task(task); - goto finished; - } - if (task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { - printf("[FAILED]\n"); - printf("Read10 beyond end-of-lun did not return sense ascq LBA OUT OF RANGE.\n"); + 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.\n"); ret = -1; scsi_free_scsi_task(task); goto finished; diff --git a/test-tool/0102_read10_0blocks.c b/test-tool/0102_read10_0blocks.c index 08d0a96..cfb8353 100644 --- a/test-tool/0102_read10_0blocks.c +++ b/test-tool/0102_read10_0blocks.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0102_read10_0blocks(const char *initiator, const char *url) +int T0102_read10_0blocks(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -28,6 +28,18 @@ int T0102_read10_0blocks(const char *initiator, const char *url) int ret, lun; uint32_t block_size, num_blocks; + 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 LBA:0 should work.\n"); + printf("2, Read at LBA:end-of-lun+1 should fail.\n"); + printf("3, Read at LBA:end-of-lun+2 should fail.\n"); + printf("4, Read at LBA:-1 should fail.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); @@ -90,9 +102,18 @@ int T0102_read10_0blocks(const char *initiator, const char *url) ret = -1; goto finished; } - if (task->status != SCSI_STATUS_GOOD) { + if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); - printf("Read10 of 0 one block beyond end-of-lun failed with sense.\n"); + printf("Read10 of 0 blocks one block beyond end-of-lun should fail.\n"); + ret = -1; + scsi_free_scsi_task(task); + goto finished; + } + 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.\n"); ret = -1; scsi_free_scsi_task(task); goto finished; @@ -110,9 +131,18 @@ int T0102_read10_0blocks(const char *initiator, const char *url) ret = -1; goto finished; } - if (task->status != SCSI_STATUS_GOOD) { + if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); - printf("Read10 of 0 two blocks beyond end-of-lun failed with sense.\n"); + printf("Read10 of 0 blocks two blocks beyond end-of-lun should fail.\n"); + ret = -1; + scsi_free_scsi_task(task); + goto finished; + } + 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.\n"); ret = -1; scsi_free_scsi_task(task); goto finished; @@ -130,9 +160,18 @@ int T0102_read10_0blocks(const char *initiator, const char *url) ret = -1; goto finished; } - if (task->status != SCSI_STATUS_GOOD) { + if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); - printf("Read10 of 0 at lba:-1 failed with sense.\n"); + printf("Read10 of 0 blocks at lba:-1 should fail.\n"); + ret = -1; + scsi_free_scsi_task(task); + goto finished; + } + 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.\n"); ret = -1; scsi_free_scsi_task(task); goto finished; diff --git a/test-tool/0103_read10_rdprotect.c b/test-tool/0103_read10_rdprotect.c index a3ab6f8..77db979 100644 --- a/test-tool/0103_read10_rdprotect.c +++ b/test-tool/0103_read10_rdprotect.c @@ -22,7 +22,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0103_read10_rdprotect(const char *initiator, const char *url) +int T0103_read10_rdprotect(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -30,6 +30,15 @@ int T0103_read10_rdprotect(const char *initiator, const char *url) struct scsi_inquiry_standard *inq; int ret, i, lun; + printf("0103_read10_rdprotect:\n"); + printf("======================\n"); + if (show_info) { + printf("Test how READ10 handles the rdprotect bits\n"); + printf("1, Any non-zero valued for rdprotect should fail.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0104_read10_flags.c b/test-tool/0104_read10_flags.c index e0c0ee2..5d04408 100644 --- a/test-tool/0104_read10_flags.c +++ b/test-tool/0104_read10_flags.c @@ -22,12 +22,25 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0104_read10_flags(const char *initiator, const char *url) +int T0104_read10_flags(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; int ret, lun; + printf("0104_read10_flags:\n"); + printf("=======================\n"); + if (show_info) { + printf("Test how READ10 handles DPO, FUA and FUA_NV flags.\n"); + printf("1, DPO:1 should work\n"); + printf("2, FUA:1 and FUA_NV:0 should work\n"); + printf("3, FUA:1 and FUA_NV:1 should work\n"); + printf("4, FUA:0 and FUA_NV:1 should work\n"); + printf("5, DPO:1 , FUA:1 and FUA_NV:1 should work\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0105_read10_invalid.c b/test-tool/0105_read10_invalid.c index 05885b8..f2ff2a9 100644 --- a/test-tool/0105_read10_invalid.c +++ b/test-tool/0105_read10_invalid.c @@ -22,7 +22,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0105_read10_invalid(const char *initiator, const char *url) +int T0105_read10_invalid(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -30,6 +30,19 @@ int T0105_read10_invalid(const char *initiator, const char *url) char buf[512]; int ret, lun; + printf("0105_read10_invalid:\n"); + printf("=======================\n"); + if (show_info) { + printf("Test various protocol violations.\n"); + printf("1, Read 1 block but set xferlength to 0. Should result in residual overflow of 512 bytes.\n"); + printf("2, Read 1 block but set xferlength to 1024. Should result in residual underflow of 512 bytes.\n"); + printf("3, Read 1 block but set xferlength to 200. Should result in residual overflow of 312 bytes.\n"); + printf("4, Read 2 blocks but set xferlength to 512. Should result in residual overflow of 512 bytes.\n"); + printf("5, Read 1 block but send one block as data-out write on the iSCSI level. Should result in both residual overflow and underflow of 512 bytes.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0110_readcapacity10_simple.c b/test-tool/0110_readcapacity10_simple.c index 1aa6e17..cfbfa9a 100644 --- a/test-tool/0110_readcapacity10_simple.c +++ b/test-tool/0110_readcapacity10_simple.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0110_readcapacity10_simple(const char *initiator, const char *url) +int T0110_readcapacity10_simple(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -29,6 +29,15 @@ int T0110_readcapacity10_simple(const char *initiator, const char *url) ret = 0; + printf("0110_readcapacity10_simple:\n"); + printf("===========================\n"); + if (show_info) { + printf("Test that basic READCAPACITY10 works\n"); + printf("1, Readcapacity10 should work.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0111_readcapacity10_pmi.c b/test-tool/0111_readcapacity10_pmi.c deleted file mode 100644 index ff200ad..0000000 --- a/test-tool/0111_readcapacity10_pmi.c +++ /dev/null @@ -1,182 +0,0 @@ -/* - Copyright (C) 2010 by Ronnie Sahlberg - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see . -*/ - -#include -#include "iscsi.h" -#include "scsi-lowlevel.h" -#include "iscsi-test.h" - -int T0111_readcapacity10_pmi(const char *initiator, const char *url) -{ - struct iscsi_context *iscsi; - struct scsi_task *task; - int ret, lun; - struct scsi_readcapacity10 *rc10; - uint32_t block_size, num_blocks; - - ret = 0; - - iscsi = iscsi_context_login(initiator, url, &lun); - if (iscsi == NULL) { - printf("Failed to login to target\n"); - return -1; - } - - /* find the size of the LUN */ - task = iscsi_readcapacity10_sync(iscsi, lun, 0, 0); - if (task == NULL) { - printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; - goto finished; - } - if (task->status != SCSI_STATUS_GOOD) { - printf("Readcapacity command: failed with sense. %s\n", iscsi_get_error(iscsi)); - ret = -1; - scsi_free_scsi_task(task); - goto finished; - } - rc10 = scsi_datain_unmarshall(task); - if (rc10 == NULL) { - printf("failed to unmarshall readcapacity10 data. %s\n", iscsi_get_error(iscsi)); - ret = -1; - scsi_free_scsi_task(task); - goto finished; - } - block_size = rc10->block_size; - num_blocks = rc10->lba; - scsi_free_scsi_task(task); - - - - /* lba != 0 and pmi == 0 is an error */ - printf("Readcapacity10 PMI==0 LBA!=0 ... "); - task = iscsi_readcapacity10_sync(iscsi, lun, 10, 0); - if (task == NULL) { - printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; - goto finished; - } - if (task->status != SCSI_STATUS_CHECK_CONDITION - || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST - || task->sense.ascq !=SCSI_SENSE_ASCQ_INVALID_FIELD_IN_CDB ) { - printf("[FAILED]\n"); - printf("Readcapacity10 PMI==0 and LBA!=0 should fail with sense code.\n"); - ret = -1; - scsi_free_scsi_task(task); - goto finished; - } - scsi_free_scsi_task(task); - printf("[OK]\n"); - - - /* PMI==1 LBA==0 */ - printf("Readcapacity10 PMI==1 LBA==0 ... "); - task = iscsi_readcapacity10_sync(iscsi, lun, 0, 1); - if (task == NULL) { - printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; - goto finished; - } - if (task->status != SCSI_STATUS_GOOD) { - printf("[FAILED]\n"); - printf("Readcapacity10 PMI==1 and LBA==0 should not fail with sense code.\n"); - ret = -1; - scsi_free_scsi_task(task); - goto finished; - } - scsi_free_scsi_task(task); - printf("[OK]\n"); - - /* PMI==1 LBA==EOL-1 */ - printf("Readcapacity10 PMI==1 LBA==EOL-1 ... "); - task = iscsi_readcapacity10_sync(iscsi, lun, num_blocks-1, 1); - if (task == NULL) { - printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; - goto finished; - } - if (task->status != SCSI_STATUS_GOOD) { - printf("[FAILED]\n"); - printf("Readcapacity10 PMI==1 and LBA==EOL-1 should not fail with sense code.\n"); - ret = -1; - scsi_free_scsi_task(task); - goto finished; - } - scsi_free_scsi_task(task); - printf("[OK]\n"); - - /* PMI==1 LBA==EOL */ - printf("Readcapacity10 PMI==1 LBA==EOL ... "); - task = iscsi_readcapacity10_sync(iscsi, lun, num_blocks, 1); - if (task == NULL) { - printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; - goto finished; - } - if (task->status != SCSI_STATUS_GOOD) { - printf("[FAILED]\n"); - printf("Readcapacity10 PMI==1 and LBA==EOL should not fail with sense code.\n"); - ret = -1; - scsi_free_scsi_task(task); - goto finished; - } - scsi_free_scsi_task(task); - printf("[OK]\n"); - - - /* PMI==1 LBA==EOL+1 */ - printf("Readcapacity10 PMI==1 LBA==EOL+1 ... "); - task = iscsi_readcapacity10_sync(iscsi, lun, num_blocks+1, 1); - if (task == NULL) { - printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; - goto finished; - } - if (task->status != SCSI_STATUS_GOOD) { - printf("[FAILED]\n"); - printf("Readcapacity10 PMI==1 and LBA==EOL+1 should not fail with sense code.\n"); - ret = -1; - scsi_free_scsi_task(task); - goto finished; - } - scsi_free_scsi_task(task); - printf("[OK]\n"); - - /* PMI==1 LBA==-1 */ - printf("Readcapacity10 PMI==1 LBA==-1 ... "); - task = iscsi_readcapacity10_sync(iscsi, lun, 0xffffffff, 1); - if (task == NULL) { - printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi)); - ret = -1; - goto finished; - } - if (task->status != SCSI_STATUS_GOOD) { - printf("[FAILED]\n"); - printf("Readcapacity10 PMI==1 and LBA==-1 should not fail with sense code.\n"); - ret = -1; - scsi_free_scsi_task(task); - goto finished; - } - scsi_free_scsi_task(task); - printf("[OK]\n"); - - -finished: - iscsi_logout_sync(iscsi); - iscsi_destroy_context(iscsi); - return ret; -} diff --git a/test-tool/0120_read6_simple.c b/test-tool/0120_read6_simple.c index 14c93da..62bc632 100644 --- a/test-tool/0120_read6_simple.c +++ b/test-tool/0120_read6_simple.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0120_read6_simple(const char *initiator, const char *url) +int T0120_read6_simple(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -28,6 +28,15 @@ int T0120_read6_simple(const char *initiator, const char *url) int ret, i, lun; uint32_t block_size, num_blocks; + printf("0120_read6_simple:\n"); + printf("===================\n"); + if (show_info) { + printf("Test basic READ6 functionality.\n"); + printf("1, Verify we can read the first 1-256 blocks of the LUN using READ6.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0121_read6_beyond_eol.c b/test-tool/0121_read6_beyond_eol.c index 089b52d..f5cee95 100644 --- a/test-tool/0121_read6_beyond_eol.c +++ b/test-tool/0121_read6_beyond_eol.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0121_read6_beyond_eol(const char *initiator, const char *url) +int T0121_read6_beyond_eol(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -28,6 +28,17 @@ int T0121_read6_beyond_eol(const char *initiator, const char *url) int ret, i, lun; uint32_t block_size, num_blocks; + printf("0121_read6_beyond_eol:\n"); + printf("======================\n"); + if (show_info) { + printf("Test that READ6 fails if reading beyond end-of-lun.\n"); + printf("1, Read 1-256 blocks one block beyond end-of-lun.\n"); + printf("2, Read 2-256 blocks all but one beyond end-of-lun.\n"); + printf("3, Read 0(==256) blocks 128 blocks beyond end-of-lun.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0122_read6_invalid.c b/test-tool/0122_read6_invalid.c index 22b7a19..64ca63f 100644 --- a/test-tool/0122_read6_invalid.c +++ b/test-tool/0122_read6_invalid.c @@ -22,7 +22,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0122_read6_invalid(const char *initiator, const char *url) +int T0122_read6_invalid(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -30,6 +30,19 @@ int T0122_read6_invalid(const char *initiator, const char *url) char buf[512]; int ret, lun; + printf("0122_read6_invalid:\n"); + printf("=======================\n"); + if (show_info) { + printf("Test various protocol violations.\n"); + printf("1, Read 1 block but set xferlength to 0. Should result in residual overflow of 512 bytes.\n"); + printf("2, Read 1 block but set xferlength to 1024. Should result in residual underflow of 512 bytes.\n"); + printf("3, Read 1 block but set xferlength to 200. Should result in residual overflow of 312 bytes.\n"); + printf("4, Read 2 blocks but set xferlength to 512. Should result in residual overflow of 512 bytes.\n"); + printf("5, Read 1 block but send one block as data-out write on the iSCSI level. Should result in both residual overflow and underflow of 512 bytes.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0130_verify10_simple.c b/test-tool/0130_verify10_simple.c index a7c2c58..fef6019 100644 --- a/test-tool/0130_verify10_simple.c +++ b/test-tool/0130_verify10_simple.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0130_verify10_simple(const char *initiator, const char *url) +int T0130_verify10_simple(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -29,6 +29,15 @@ int T0130_verify10_simple(const char *initiator, const char *url) int ret, i, lun; uint32_t block_size, num_blocks; + printf("0130_verify10_simple:\n"); + printf("=====================\n"); + if (show_info) { + printf("Test basic VERIFY10 functionality.\n"); + printf("1, Read and verify the first 1-256 blocks of the LUN using READ10/VERIFY10.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0131_verify10_mismatch.c b/test-tool/0131_verify10_mismatch.c index 8fa5cc2..69cb8d8 100644 --- a/test-tool/0131_verify10_mismatch.c +++ b/test-tool/0131_verify10_mismatch.c @@ -21,7 +21,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0131_verify10_mismatch(const char *initiator, const char *url) +int T0131_verify10_mismatch(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -30,6 +30,15 @@ int T0131_verify10_mismatch(const char *initiator, const char *url) int ret, i, lun; uint32_t block_size, num_blocks; + printf("0131_verify10_mismatch:\n"); + printf("=======================\n"); + if (show_info) { + printf("Test basic VERIFY10 functionality.\n"); + printf("1, Verify the first 1-256 blocks with a deliberate error detects the mismatch.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0132_verify10_mismatch_no_cmp.c b/test-tool/0132_verify10_mismatch_no_cmp.c index 1e18efb..729d180 100644 --- a/test-tool/0132_verify10_mismatch_no_cmp.c +++ b/test-tool/0132_verify10_mismatch_no_cmp.c @@ -21,7 +21,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0132_verify10_mismatch_no_cmp(const char *initiator, const char *url) +int T0132_verify10_mismatch_no_cmp(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -30,6 +30,15 @@ int T0132_verify10_mismatch_no_cmp(const char *initiator, const char *url) int ret, i, lun; uint32_t block_size, num_blocks; + printf("0132_verify10_mismatch_no_cmp:\n"); + printf("==============================\n"); + if (show_info) { + printf("Test VERIFY10 BYTCHK:0 should not detect mismatches.\n"); + printf("1, Verify the first 1-256 blocks does nto detect a mismatch if BYTCHK is 0\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); @@ -67,7 +76,7 @@ int T0132_verify10_mismatch_no_cmp(const char *initiator, const char *url) /* read and verify the first 1 - 256 blocks at the start of the LUN */ printf("Read+verify first 1-256 blocks ... "); for (i = 1; i <= 256; i++) { - char *buf; + unsigned char *buf; task = iscsi_read10_sync(iscsi, lun, 0, i * block_size, block_size); if (task == NULL) { diff --git a/test-tool/0160_readcapacity16_simple.c b/test-tool/0160_readcapacity16_simple.c index 77d4498..fb27014 100644 --- a/test-tool/0160_readcapacity16_simple.c +++ b/test-tool/0160_readcapacity16_simple.c @@ -20,13 +20,22 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0160_readcapacity16_simple(const char *initiator, const char *url) +int T0160_readcapacity16_simple(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; int ret, lun; + printf("0160_readcapacity16_simple:\n"); + printf("===========================\n"); + if (show_info) { + printf("Test that basic READCAPACITY16 works\n"); + printf("1, Readcapacity16 should work.\n"); + printf("\n"); + return 0; + } + ret = 0; iscsi = iscsi_context_login(initiator, url, &lun); diff --git a/test-tool/0170_unmap_simple.c b/test-tool/0170_unmap_simple.c index b9cc0ae..fd6f08e 100644 --- a/test-tool/0170_unmap_simple.c +++ b/test-tool/0170_unmap_simple.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0170_unmap_simple(const char *initiator, const char *url) +int T0170_unmap_simple(const char *initiator, const char *url, int data_loss, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -28,6 +28,16 @@ int T0170_unmap_simple(const char *initiator, const char *url) int ret, i, lun; uint32_t block_size, num_blocks; + printf("0170_unmap_simple:\n"); + printf("==================\n"); + if (show_info) { + printf("Test basic UNMAP functionality.\n"); + printf("1, Test UNMAP the first 1-256 blocks of the LUN.\n"); + printf("2, Test UNMAP the last 1-256 blocks of the LUN.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0171_unmap_zero.c b/test-tool/0171_unmap_zero.c index 82f73bb..4e2e2a7 100644 --- a/test-tool/0171_unmap_zero.c +++ b/test-tool/0171_unmap_zero.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0171_unmap_zero(const char *initiator, const char *url) +int T0171_unmap_zero(const char *initiator, const char *url, int data_loss, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -28,6 +28,18 @@ int T0171_unmap_zero(const char *initiator, const char *url) int ret, i, lun; uint32_t block_size, num_blocks; + printf("0171_unmap_zero:\n"); + printf("================\n"); + if (show_info) { + printf("Test UNMAP of 0 blocks.\n"); + printf("1, Try to UNMAP 0 blocks at LBA 0 to LBA 255\n"); + printf("2, Try to UNMAP 0 blocks at 0 to 255 blocks from end-of-lun\n"); + printf("3, Try to UNMAP 0 blocks at 1 to 256 blocks beyond end-of-lun\n"); + printf("4, Send UNMAP without any block descriptors\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); @@ -75,7 +87,7 @@ int T0171_unmap_zero(const char *initiator, const char *url) ret = 0; - /* unmap no blocks at the first 0 - 256 blocks at the start of the LUN */ + /* unmap no blocks at LBA 0 - 255 */ printf("Unmapping of no block at lbas 0-255 blocks ... "); for (i=0; i<=255; i++) { struct unmap_list list[1]; diff --git a/test-tool/0180_writesame10_unmap.c b/test-tool/0180_writesame10_unmap.c index 8547dc7..ca74b03 100644 --- a/test-tool/0180_writesame10_unmap.c +++ b/test-tool/0180_writesame10_unmap.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0180_writesame10_unmap(const char *initiator, const char *url) +int T0180_writesame10_unmap(const char *initiator, const char *url, int data_loss, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -29,6 +29,16 @@ int T0180_writesame10_unmap(const char *initiator, const char *url) uint32_t block_size, num_blocks; int lbppb; + printf("0180_writesame10_unmap:\n"); + printf("=======================\n"); + if (show_info) { + printf("Test basic WRITESAME10-UNMAP functionality.\n"); + printf("1, UNMAP the first 1-256 blocks at the start of the LUN\n"); + printf("2, UNMAP the last 1-256 blocks at the end of the LUN\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0181_writesame10_unmap_unaligned.c b/test-tool/0181_writesame10_unmap_unaligned.c index 858ea6d..388fab2 100644 --- a/test-tool/0181_writesame10_unmap_unaligned.c +++ b/test-tool/0181_writesame10_unmap_unaligned.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0181_writesame10_unmap_unaligned(const char *initiator, const char *url) +int T0181_writesame10_unmap_unaligned(const char *initiator, const char *url, int data_loss, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -29,6 +29,15 @@ int T0181_writesame10_unmap_unaligned(const char *initiator, const char *url) uint32_t block_size, num_blocks; int lbppb; + printf("0181_writesame10_unmap_unaligned:\n"); + printf("=================================\n"); + if (show_info) { + printf("Test unaligned WRITESAME10-UNMAP functionality.\n"); + printf("1, UNMAP the first 1-lbppb blocks at the start of the LUN\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0190_writesame16_unmap.c b/test-tool/0190_writesame16_unmap.c index 10c5ef4..594321b 100644 --- a/test-tool/0190_writesame16_unmap.c +++ b/test-tool/0190_writesame16_unmap.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0190_writesame16_unmap(const char *initiator, const char *url) +int T0190_writesame16_unmap(const char *initiator, const char *url, int data_loss, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -29,6 +29,16 @@ int T0190_writesame16_unmap(const char *initiator, const char *url) uint32_t block_size, num_blocks; int lbppb; + printf("0190_writesame16_unmap:\n"); + printf("=======================\n"); + if (show_info) { + printf("Test basic WRITESAME16-UNMAP functionality.\n"); + printf("1, UNMAP the first 1-256 blocks at the start of the LUN\n"); + printf("2, UNMAP the last 1-256 blocks at the end of the LUN\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0191_writesame16_unmap_unaligned.c b/test-tool/0191_writesame16_unmap_unaligned.c index 5e84b86..b2610ff 100644 --- a/test-tool/0191_writesame16_unmap_unaligned.c +++ b/test-tool/0191_writesame16_unmap_unaligned.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0191_writesame16_unmap_unaligned(const char *initiator, const char *url) +int T0191_writesame16_unmap_unaligned(const char *initiator, const char *url, int data_loss, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -29,6 +29,15 @@ int T0191_writesame16_unmap_unaligned(const char *initiator, const char *url) uint32_t block_size, num_blocks; int lbppb; + printf("0191_writesame16_unmap_unaligned:\n"); + printf("=================================\n"); + if (show_info) { + printf("Test unaligned WRITESAME16-UNMAP functionality.\n"); + printf("1, UNMAP the first 1-lbppb blocks at the start of the LUN\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0200_read16_simple.c b/test-tool/0200_read16_simple.c index 3d5c1c4..923416e 100644 --- a/test-tool/0200_read16_simple.c +++ b/test-tool/0200_read16_simple.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0200_read16_simple(const char *initiator, const char *url) +int T0200_read16_simple(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -28,6 +28,16 @@ int T0200_read16_simple(const char *initiator, const char *url) int ret, i, lun; uint32_t block_size, num_blocks; + printf("0200_read16_simple:\n"); + printf("===================\n"); + if (show_info) { + printf("Test basic READ16 functionality.\n"); + printf("1, Verify we can read the first 1-256 blocks of the LUN.\n"); + printf("2, Verify we can read the last 1-256 blocks of the LUN.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0201_read16_rdprotect.c b/test-tool/0201_read16_rdprotect.c index db88941..cbe7fbd 100644 --- a/test-tool/0201_read16_rdprotect.c +++ b/test-tool/0201_read16_rdprotect.c @@ -20,13 +20,22 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0201_read16_rdprotect(const char *initiator, const char *url) +int T0201_read16_rdprotect(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; int ret = 0, i, lun; - uint32_t block_size, num_blocks; + uint32_t block_size; + + printf("0201_read16_rdprotect:\n"); + printf("======================\n"); + if (show_info) { + printf("Test how READ16 handles the rdprotect bits\n"); + printf("1, Any non-zero valued for rdprotect should fail.\n"); + printf("\n"); + return 0; + } iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { diff --git a/test-tool/0202_read16_flags.c b/test-tool/0202_read16_flags.c index 87171e8..f8fec8f 100644 --- a/test-tool/0202_read16_flags.c +++ b/test-tool/0202_read16_flags.c @@ -20,14 +20,26 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0202_read16_flags(const char *initiator, const char *url) +int T0202_read16_flags(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; - int ret = 0, i, lun; + int ret = 0, lun; uint32_t block_size; + printf("0202_read16_flags:\n"); + printf("==================\n"); + if (show_info) { + printf("Test how READ16 handles the flag bits\n"); + printf("1, Reading with DPO should work\n"); + printf("2, Reading with FUA should work\n"); + printf("3, Reading with FUA_NV should work\n"); + printf("4, Reading with FUA+FUA_NV should work\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0203_read16_0blocks.c b/test-tool/0203_read16_0blocks.c index 4f08bf6..256720f 100644 --- a/test-tool/0203_read16_0blocks.c +++ b/test-tool/0203_read16_0blocks.c @@ -20,15 +20,26 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0203_read16_0blocks(const char *initiator, const char *url) +int T0203_read16_0blocks(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; - int ret = 0, i, lun; + int ret = 0, lun; uint32_t block_size; uint64_t num_blocks; + printf("0203_read16_0blocks:\n"); + printf("====================\n"); + if (show_info) { + printf("Test that READ16 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("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0204_read16_beyondeol.c b/test-tool/0204_read16_beyondeol.c index 406696f..2981e07 100644 --- a/test-tool/0204_read16_beyondeol.c +++ b/test-tool/0204_read16_beyondeol.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0204_read16_beyondeol(const char *initiator, const char *url) +int T0204_read16_beyondeol(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -29,6 +29,15 @@ int T0204_read16_beyondeol(const char *initiator, const char *url) uint32_t block_size; uint64_t num_blocks; + printf("0204_read16_beyond_eol:\n"); + printf("=======================\n"); + if (show_info) { + printf("Test that READ16 fails if reading beyond end-of-lun.\n"); + printf("1, Read 1-256 blocks one block beyond end-of-lun.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0210_read12_simple.c b/test-tool/0210_read12_simple.c index 781d440..2c8d0fc 100644 --- a/test-tool/0210_read12_simple.c +++ b/test-tool/0210_read12_simple.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0210_read12_simple(const char *initiator, const char *url) +int T0210_read12_simple(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -28,6 +28,16 @@ int T0210_read12_simple(const char *initiator, const char *url) int ret, i, lun; uint32_t block_size, num_blocks; + printf("0210_read12_simple:\n"); + printf("===================\n"); + if (show_info) { + printf("Test basic READ12 functionality.\n"); + printf("1, Verify we can read the first 1-256 blocks of the LUN.\n"); + printf("2, Verify we can read the last 1-256 blocks of the LUN.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0211_read12_rdprotect.c b/test-tool/0211_read12_rdprotect.c index 18a732c..8a3fa33 100644 --- a/test-tool/0211_read12_rdprotect.c +++ b/test-tool/0211_read12_rdprotect.c @@ -20,13 +20,22 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0211_read12_rdprotect(const char *initiator, const char *url) +int T0211_read12_rdprotect(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; int ret = 0, i, lun; - uint32_t block_size, num_blocks; + uint32_t block_size; + + printf("0211_read12_rdprotect:\n"); + printf("======================\n"); + if (show_info) { + printf("Test how READ12 handles the rdprotect bits\n"); + printf("1, Any non-zero valued for rdprotect should fail.\n"); + printf("\n"); + return 0; + } iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { diff --git a/test-tool/0212_read12_flags.c b/test-tool/0212_read12_flags.c index 3673c75..69cb39b 100644 --- a/test-tool/0212_read12_flags.c +++ b/test-tool/0212_read12_flags.c @@ -20,14 +20,26 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0212_read12_flags(const char *initiator, const char *url) +int T0212_read12_flags(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; - int ret = 0, i, lun; + int ret = 0, lun; uint32_t block_size; + printf("0212_read12_flags:\n"); + printf("==================\n"); + if (show_info) { + printf("Test how READ12 handles the flag bits\n"); + printf("1, Reading with DPO should work\n"); + printf("2, Reading with FUA should work\n"); + printf("3, Reading with FUA_NV should work\n"); + printf("4, Reading with FUA+FUA_NV should work\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0213_read12_0blocks.c b/test-tool/0213_read12_0blocks.c index 3cf443a..c139ce3 100644 --- a/test-tool/0213_read12_0blocks.c +++ b/test-tool/0213_read12_0blocks.c @@ -20,15 +20,26 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0213_read12_0blocks(const char *initiator, const char *url) +int T0213_read12_0blocks(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; - int ret = 0, i, lun; + int ret = 0, lun; uint32_t block_size; uint64_t num_blocks; + 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("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0214_read12_beyondeol.c b/test-tool/0214_read12_beyondeol.c index 590e698..9578d90 100644 --- a/test-tool/0214_read12_beyondeol.c +++ b/test-tool/0214_read12_beyondeol.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0214_read12_beyondeol(const char *initiator, const char *url) +int T0214_read12_beyondeol(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -29,6 +29,15 @@ int T0214_read12_beyondeol(const char *initiator, const char *url) uint32_t block_size; uint64_t num_blocks; + printf("0214_read12_beyond_eol:\n"); + printf("=======================\n"); + if (show_info) { + printf("Test that READ12 fails if reading beyond end-of-lun.\n"); + printf("1, Read 1-256 blocks one block beyond end-of-lun.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0220_write16_simple.c b/test-tool/0220_write16_simple.c index fbb4501..a5090f9 100644 --- a/test-tool/0220_write16_simple.c +++ b/test-tool/0220_write16_simple.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0220_write16_simple(const char *initiator, const char *url) +int T0220_write16_simple(const char *initiator, const char *url, int data_loss, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -30,6 +30,16 @@ int T0220_write16_simple(const char *initiator, const char *url) uint64_t num_blocks; unsigned char data[512 * 256]; + printf("0220_write16_simple:\n"); + printf("===================\n"); + if (show_info) { + printf("Test basic WRITE16 functionality.\n"); + printf("1, Verify we can write the first 1-256 blocks of the LUN.\n"); + printf("2, Verify we can write the last 1-256 blocks of the LUN.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0221_write16_wrprotect.c b/test-tool/0221_write16_wrprotect.c index e063eb7..b488be8 100644 --- a/test-tool/0221_write16_wrprotect.c +++ b/test-tool/0221_write16_wrprotect.c @@ -20,15 +20,24 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0221_write16_wrprotect(const char *initiator, const char *url) +int T0221_write16_wrprotect(const char *initiator, const char *url, int data_loss, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; int ret = 0, i, lun; - uint32_t block_size, num_blocks; + uint32_t block_size; unsigned char data[256 * 512]; + printf("0221_write16_wrprotect:\n"); + printf("======================\n"); + if (show_info) { + printf("Test how WRITE16 handles the wrprotect bits\n"); + printf("1, Any non-zero valued for wrprotect should fail.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0222_write16_flags.c b/test-tool/0222_write16_flags.c index 2dfba19..b7ce77f 100644 --- a/test-tool/0222_write16_flags.c +++ b/test-tool/0222_write16_flags.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0222_write16_flags(const char *initiator, const char *url) +int T0222_write16_flags(const char *initiator, const char *url, int data_loss, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -29,6 +29,18 @@ int T0222_write16_flags(const char *initiator, const char *url) uint32_t block_size; unsigned char data[256 * 512]; + printf("0222_write16_flags:\n"); + printf("===================\n"); + if (show_info) { + printf("Test how WRITE16 handles the flags\n"); + printf("1, Write with DPU should work.\n"); + printf("2, Write with FUA should work.\n"); + printf("3, Write with FUA_NV should work.\n"); + printf("4, Write with FUA+FUA_NV should work.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0223_write16_0blocks.c b/test-tool/0223_write16_0blocks.c index f6d5aa4..6797dd3 100644 --- a/test-tool/0223_write16_0blocks.c +++ b/test-tool/0223_write16_0blocks.c @@ -20,15 +20,26 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0223_write16_0blocks(const char *initiator, const char *url) +int T0223_write16_0blocks(const char *initiator, const char *url, int data_loss, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; - int ret = 0, i, lun; + int ret = 0, lun; uint32_t block_size; uint64_t num_blocks; + 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("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0224_write16_beyondeol.c b/test-tool/0224_write16_beyondeol.c index 12e0713..e9507ec 100644 --- a/test-tool/0224_write16_beyondeol.c +++ b/test-tool/0224_write16_beyondeol.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0224_write16_beyondeol(const char *initiator, const char *url) +int T0224_write16_beyondeol(const char *initiator, const char *url, int data_loss, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -30,6 +30,15 @@ int T0224_write16_beyondeol(const char *initiator, const char *url) uint64_t num_blocks; unsigned char data[258 * 512]; + printf("0224_write16_beyond_eol:\n"); + printf("=======================\n"); + if (show_info) { + printf("Test that WRITE16 fails if writing beyond end-of-lun.\n"); + printf("1, Writing 1-256 blocks beyond end-of-lun should fail.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0230_write12_simple.c b/test-tool/0230_write12_simple.c index f07a9ec..a5b52c6 100644 --- a/test-tool/0230_write12_simple.c +++ b/test-tool/0230_write12_simple.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0230_write12_simple(const char *initiator, const char *url) +int T0230_write12_simple(const char *initiator, const char *url, int data_loss, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -30,6 +30,16 @@ int T0230_write12_simple(const char *initiator, const char *url) uint64_t num_blocks; unsigned char data[512 * 256]; + printf("0230_write12_simple:\n"); + printf("===================\n"); + if (show_info) { + printf("Test basic WRITE12 functionality.\n"); + printf("1, Verify we can write the first 1-256 blocks of the LUN.\n"); + printf("2, Verify we can write the last 1-256 blocks of the LUN.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0231_write12_wrprotect.c b/test-tool/0231_write12_wrprotect.c index ab2d80b..b518c8c 100644 --- a/test-tool/0231_write12_wrprotect.c +++ b/test-tool/0231_write12_wrprotect.c @@ -20,15 +20,24 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0231_write12_wrprotect(const char *initiator, const char *url) +int T0231_write12_wrprotect(const char *initiator, const char *url, int data_loss, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; int ret = 0, i, lun; - uint32_t block_size, num_blocks; + uint32_t block_size; unsigned char data[256 * 512]; + printf("0231_write12_wrprotect:\n"); + printf("======================\n"); + if (show_info) { + printf("Test how WRITE12 handles the wrprotect bits\n"); + printf("1, Any non-zero valued for wrprotect should fail.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0232_write12_flags.c b/test-tool/0232_write12_flags.c index f078f4f..4e19a2a 100644 --- a/test-tool/0232_write12_flags.c +++ b/test-tool/0232_write12_flags.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0232_write12_flags(const char *initiator, const char *url) +int T0232_write12_flags(const char *initiator, const char *url, int data_loss, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -29,6 +29,18 @@ int T0232_write12_flags(const char *initiator, const char *url) uint32_t block_size; unsigned char data[256 * 512]; + printf("0232_write12_flags:\n"); + printf("===================\n"); + if (show_info) { + printf("Test how WRITE12 handles the flags\n"); + printf("1, Write with DPU should work.\n"); + printf("2, Write with FUA should work.\n"); + printf("3, Write with FUA_NV should work.\n"); + printf("4, Write with FUA+FUA_NV should work.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0233_write12_0blocks.c b/test-tool/0233_write12_0blocks.c index 78c27e3..9a1716b 100644 --- a/test-tool/0233_write12_0blocks.c +++ b/test-tool/0233_write12_0blocks.c @@ -20,15 +20,26 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0233_write12_0blocks(const char *initiator, const char *url) +int T0233_write12_0blocks(const char *initiator, const char *url, int data_loss, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; - int ret = 0, i, lun; + int ret = 0, lun; uint32_t block_size; uint64_t num_blocks; + 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("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0234_write12_beyondeol.c b/test-tool/0234_write12_beyondeol.c index 31195b9..e38b280 100644 --- a/test-tool/0234_write12_beyondeol.c +++ b/test-tool/0234_write12_beyondeol.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0234_write12_beyondeol(const char *initiator, const char *url) +int T0234_write12_beyondeol(const char *initiator, const char *url, int data_loss, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -30,6 +30,15 @@ int T0234_write12_beyondeol(const char *initiator, const char *url) uint64_t num_blocks; unsigned char data[258 * 512]; + printf("0234_write12_beyond_eol:\n"); + printf("=======================\n"); + if (show_info) { + printf("Test that WRITE12 fails if writing beyond end-of-lun.\n"); + printf("1, Writing 1-256 blocks beyond end-of-lun should fail.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0240_prefetch10_simple.c b/test-tool/0240_prefetch10_simple.c index af3c3d9..9e571e5 100644 --- a/test-tool/0240_prefetch10_simple.c +++ b/test-tool/0240_prefetch10_simple.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0240_prefetch10_simple(const char *initiator, const char *url) +int T0240_prefetch10_simple(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -29,6 +29,16 @@ int T0240_prefetch10_simple(const char *initiator, const char *url) uint32_t block_size; uint64_t num_blocks; + printf("0240_prefetch10_simple:\n"); + printf("===================\n"); + if (show_info) { + printf("Test basic PREFETCH10 functionality.\n"); + printf("1, Verify we can prefetch the first 1-256 blocks of the LUN.\n"); + printf("2, Verify we can prefetch the last 1-256 blocks of the LUN.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0250_prefetch16_simple.c b/test-tool/0250_prefetch16_simple.c index 99d8352..cad63e6 100644 --- a/test-tool/0250_prefetch16_simple.c +++ b/test-tool/0250_prefetch16_simple.c @@ -20,7 +20,7 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0250_prefetch16_simple(const char *initiator, const char *url) +int T0250_prefetch16_simple(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; @@ -29,6 +29,16 @@ int T0250_prefetch16_simple(const char *initiator, const char *url) uint32_t block_size; uint64_t num_blocks; + printf("0250_prefetch16_simple:\n"); + printf("===================\n"); + if (show_info) { + printf("Test basic PREFETCH16 functionality.\n"); + printf("1, Verify we can prefetch the first 1-256 blocks of the LUN.\n"); + printf("2, Verify we can prefetch the last 1-256 blocks of the LUN.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0260_get_lba_status_simple.c b/test-tool/0260_get_lba_status_simple.c index fe8498d..8ca9895 100644 --- a/test-tool/0260_get_lba_status_simple.c +++ b/test-tool/0260_get_lba_status_simple.c @@ -20,15 +20,25 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0260_get_lba_status_simple(const char *initiator, const char *url) +int T0260_get_lba_status_simple(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; - int ret, i, lun; + int ret, lun; uint32_t block_size; uint64_t num_blocks; + printf("0260_get_lba_status_simple:\n"); + printf("===================\n"); + if (show_info) { + printf("Test basic GET_LBA_STATUS functionality.\n"); + printf("1, Verify we can read a descriptor at the start of the lun.\n"); + printf("2, Verify we can read a descriptor at the end of the lun.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/0264_get_lba_status_beyondeol.c b/test-tool/0264_get_lba_status_beyondeol.c index a68c10a..6f98aca 100644 --- a/test-tool/0264_get_lba_status_beyondeol.c +++ b/test-tool/0264_get_lba_status_beyondeol.c @@ -20,15 +20,24 @@ #include "scsi-lowlevel.h" #include "iscsi-test.h" -int T0264_get_lba_status_beyondeol(const char *initiator, const char *url) +int T0264_get_lba_status_beyondeol(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; - int ret, i, lun; + int ret, lun; uint32_t block_size; uint64_t num_blocks; + printf("0264_get_lba_status_beyondeol:\n"); + printf("==============================\n"); + if (show_info) { + printf("Test GET_LBA_STATUS functionality for beyond end-of-lun requests\n"); + printf("1, Reading a descriptor beyond the end of the lun should fail.\n"); + printf("\n"); + return 0; + } + iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); diff --git a/test-tool/iscsi-test.c b/test-tool/iscsi-test.c index b85bbfe..c9e1fd8 100644 --- a/test-tool/iscsi-test.c +++ b/test-tool/iscsi-test.c @@ -29,11 +29,12 @@ #include "iscsi-test.h" const char *initiator = "iqn.2010-11.iscsi-test"; -int data_loss = 0; +static int data_loss = 0; +static int show_info = 0; struct scsi_test { const char *name; - int (*test)(const char *initiator, const char *url); + int (*test)(const char *initiator, const char *url, int data_loss, int show_info); }; struct scsi_test tests[] = { @@ -47,7 +48,6 @@ struct scsi_test tests[] = { /* readcapacity10*/ { "T0110_readcapacity10_simple", T0110_readcapacity10_simple }, -{ "T0111_readcapacity10_pmi", T0111_readcapacity10_pmi }, /* read6*/ { "T0120_read6_simple", T0120_read6_simple }, @@ -128,6 +128,7 @@ void print_help(void) fprintf(stderr, " -i, --initiator-name=iqn-name Initiatorname to use\n"); fprintf(stderr, " -t, --test=test-name Which test to run. Default is to run all tests.\n"); fprintf(stderr, " -l, --list List all tests.\n"); + fprintf(stderr, " --dataloss All destructive tests.\n"); fprintf(stderr, "\n"); fprintf(stderr, "Help options:\n"); fprintf(stderr, " -?, --help Show this help message\n"); @@ -206,6 +207,7 @@ int main(int argc, const char *argv[]) { "list", 'l', POPT_ARG_NONE, &list_tests, 0, "List all tests", NULL }, { "initiator-name", 'i', POPT_ARG_STRING, &initiator, 0, "Initiatorname to use", "iqn-name" }, { "test", 't', POPT_ARG_STRING, &testname, 0, "Which test to run", "testname" }, + { "info", 'i', POPT_ARG_NONE, &show_info, 0, "Show information about the test", "testname" }, { "dataloss", 0, POPT_ARG_NONE, &data_loss, 0, "Allow destructuve tests", NULL }, POPT_TABLEEND }; @@ -254,9 +256,7 @@ int main(int argc, const char *argv[]) continue; } - printf("=========\n"); - printf("Running test %s\n", test->name); - res = test->test(initiator, url); + res = test->test(initiator, url, data_loss, show_info); if (res == 0) { printf("TEST %s [OK]\n", test->name); } else { diff --git a/test-tool/iscsi-test.h b/test-tool/iscsi-test.h index 8fbfbfd..690352e 100644 --- a/test-tool/iscsi-test.h +++ b/test-tool/iscsi-test.h @@ -18,65 +18,62 @@ */ struct iscsi_context *iscsi_context_login(const char *initiatorname, const char *url, int *lun); -extern int data_loss; +int T0100_read10_simple(const char *initiator, const char *url, int data_loss, int show_info); +int T0101_read10_beyond_eol(const char *initiator, const char *url, int data_loss, int show_info); +int T0102_read10_0blocks(const char *initiator, const char *url, int data_loss, int show_info); +int T0103_read10_rdprotect(const char *initiator, const char *url, int data_loss, int show_info); +int T0104_read10_flags(const char *initiator, const char *url, int data_loss, int show_info); +int T0105_read10_invalid(const char *initiator, const char *url, int data_loss, int show_info); -int T0100_read10_simple(const char *initiator, const char *url); -int T0101_read10_beyond_eol(const char *initiator, const char *url); -int T0102_read10_0blocks(const char *initiator, const char *url); -int T0103_read10_rdprotect(const char *initiator, const char *url); -int T0104_read10_flags(const char *initiator, const char *url); -int T0105_read10_invalid(const char *initiator, const char *url); +int T0110_readcapacity10_simple(const char *initiator, const char *url, int data_loss, int show_info); -int T0110_readcapacity10_simple(const char *initiator, const char *url); -int T0111_readcapacity10_pmi(const char *initiator, const char *url); +int T0120_read6_simple(const char *initiator, const char *url, int data_loss, int show_info); +int T0121_read6_beyond_eol(const char *initiator, const char *url, int data_loss, int show_info); +int T0122_read6_invalid(const char *initiator, const char *url, int data_loss, int show_info); -int T0120_read6_simple(const char *initiator, const char *url); -int T0121_read6_beyond_eol(const char *initiator, const char *url); -int T0122_read6_invalid(const char *initiator, const char *url); +int T0130_verify10_simple(const char *initiator, const char *url, int data_loss, int show_info); +int T0131_verify10_mismatch(const char *initiator, const char *url, int data_loss, int show_info); +int T0132_verify10_mismatch_no_cmp(const char *initiator, const char *url, int data_loss, int show_info); -int T0130_verify10_simple(const char *initiator, const char *url); -int T0131_verify10_mismatch(const char *initiator, const char *url); -int T0132_verify10_mismatch_no_cmp(const char *initiator, const char *url); +int T0160_readcapacity16_simple(const char *initiator, const char *url, int data_loss, int show_info); -int T0160_readcapacity16_simple(const char *initiator, const char *url); +int T0170_unmap_simple(const char *initiator, const char *url, int data_loss, int show_info); +int T0171_unmap_zero(const char *initiator, const char *url, int data_loss, int show_info); -int T0170_unmap_simple(const char *initiator, const char *url); -int T0171_unmap_zero(const char *initiator, const char *url); +int T0180_writesame10_unmap(const char *initiator, const char *url, int data_loss, int show_info); +int T0181_writesame10_unmap_unaligned(const char *initiator, const char *url, int data_loss, int show_info); -int T0180_writesame10_unmap(const char *initiator, const char *url); -int T0181_writesame10_unmap_unaligned(const char *initiator, const char *url); +int T0190_writesame16_unmap(const char *initiator, const char *url, int data_loss, int show_info); +int T0191_writesame16_unmap_unaligned(const char *initiator, const char *url, int data_loss, int show_info); -int T0190_writesame16_unmap(const char *initiator, const char *url); -int T0191_writesame16_unmap_unaligned(const char *initiator, const char *url); +int T0200_read16_simple(const char *initiator, const char *url, int data_loss, int show_info); +int T0201_read16_rdprotect(const char *initiator, const char *url, int data_loss, int show_info); +int T0202_read16_flags(const char *initiator, const char *url, int data_loss, int show_info); +int T0203_read16_0blocks(const char *initiator, const char *url, int data_loss, int show_info); +int T0204_read16_beyondeol(const char *initiator, const char *url, int data_loss, int show_info); -int T0200_read16_simple(const char *initiator, const char *url); -int T0201_read16_rdprotect(const char *initiator, const char *url); -int T0202_read16_flags(const char *initiator, const char *url); -int T0203_read16_0blocks(const char *initiator, const char *url); -int T0204_read16_beyondeol(const char *initiator, const char *url); +int T0210_read12_simple(const char *initiator, const char *url, int data_loss, int show_info); +int T0211_read12_rdprotect(const char *initiator, const char *url, int data_loss, int show_info); +int T0212_read12_flags(const char *initiator, const char *url, int data_loss, int show_info); +int T0213_read12_0blocks(const char *initiator, const char *url, int data_loss, int show_info); +int T0214_read12_beyondeol(const char *initiator, const char *url, int data_loss, int show_info); -int T0210_read12_simple(const char *initiator, const char *url); -int T0211_read12_rdprotect(const char *initiator, const char *url); -int T0212_read12_flags(const char *initiator, const char *url); -int T0213_read12_0blocks(const char *initiator, const char *url); -int T0214_read12_beyondeol(const char *initiator, const char *url); +int T0220_write16_simple(const char *initiator, const char *url, int data_loss, int show_info); +int T0221_write16_wrprotect(const char *initiator, const char *url, int data_loss, int show_info); +int T0222_write16_flags(const char *initiator, const char *url, int data_loss, int show_info); +int T0223_write16_0blocks(const char *initiator, const char *url, int data_loss, int show_info); +int T0224_write16_beyondeol(const char *initiator, const char *url, int data_loss, int show_info); -int T0220_write16_simple(const char *initiator, const char *url); -int T0221_write16_wrprotect(const char *initiator, const char *url); -int T0222_write16_flags(const char *initiator, const char *url); -int T0223_write16_0blocks(const char *initiator, const char *url); -int T0224_write16_beyondeol(const char *initiator, const char *url); +int T0230_write12_simple(const char *initiator, const char *url, int data_loss, int show_info); +int T0231_write12_wrprotect(const char *initiator, const char *url, int data_loss, int show_info); +int T0232_write12_flags(const char *initiator, const char *url, int data_loss, int show_info); +int T0233_write12_0blocks(const char *initiator, const char *url, int data_loss, int show_info); +int T0234_write12_beyondeol(const char *initiator, const char *url, int data_loss, int show_info); -int T0230_write12_simple(const char *initiator, const char *url); -int T0231_write12_wrprotect(const char *initiator, const char *url); -int T0232_write12_flags(const char *initiator, const char *url); -int T0233_write12_0blocks(const char *initiator, const char *url); -int T0234_write12_beyondeol(const char *initiator, const char *url); +int T0240_prefetch10_simple(const char *initiator, const char *url, int data_loss, int show_info); -int T0240_prefetch10_simple(const char *initiator, const char *url); +int T0250_prefetch16_simple(const char *initiator, const char *url, int data_loss, int show_info); -int T0250_prefetch16_simple(const char *initiator, const char *url); - -int T0260_get_lba_status_simple(const char *initiator, const char *url); -int T0264_get_lba_status_beyondeol(const char *initiator, const char *url); +int T0260_get_lba_status_simple(const char *initiator, const char *url, int data_loss, int show_info); +int T0264_get_lba_status_beyondeol(const char *initiator, const char *url, int data_loss, int show_info);