diff --git a/Makefile.am b/Makefile.am index b7ad4602..353d3dda 100644 --- a/Makefile.am +++ b/Makefile.am @@ -32,7 +32,7 @@ SONAME=$(firstword $(subst ., ,$(VERSION))) SOREL=$(shell printf "%d%02d%02d" $(subst ., ,$(VERSION))) lib_libiscsi_la_LDFLAGS = \ -version-info $(SONAME):$(SOREL):0 -bindir $(bindir) -no-undefined \ - -export-symbols lib/libiscsi.syms + -export-symbols $(srcdir)/lib/libiscsi.syms # libiscsi utilities diff --git a/test-tool/0103_read10_rdprotect.c b/test-tool/0103_read10_rdprotect.c index 046f3e68..af012999 100644 --- a/test-tool/0103_read10_rdprotect.c +++ b/test-tool/0103_read10_rdprotect.c @@ -72,13 +72,13 @@ int T0103_read10_rdprotect(const char *initiator, const char *url, int data_loss if (inq->periperal_device_type != SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS) { printf("LUN is not SBC device. Skipping test\n"); scsi_free_scsi_task(task); - return -1; + return -2; } if (inq->protect) { printf("LUN is formatted with protection information. Skipping test\n"); scsi_free_scsi_task(task); - return -1; + return -2; } scsi_free_scsi_task(task); diff --git a/test-tool/0104_read10_flags.c b/test-tool/0104_read10_flags.c index 5d04408f..5232712c 100644 --- a/test-tool/0104_read10_flags.c +++ b/test-tool/0104_read10_flags.c @@ -26,6 +26,7 @@ int T0104_read10_flags(const char *initiator, const char *url, int data_loss _U_ { struct iscsi_context *iscsi; struct scsi_task *task; + struct scsi_inquiry_standard *inq; int ret, lun; printf("0104_read10_flags:\n"); @@ -50,6 +51,24 @@ int T0104_read10_flags(const char *initiator, const char *url, int data_loss _U_ ret = 0; + /* This test is only valid for SBC devices */ + task = iscsi_inquiry_sync(iscsi, lun, 0, 0, 64); + if (task == NULL || task->status != SCSI_STATUS_GOOD) { + printf("Inquiry command failed : %s\n", iscsi_get_error(iscsi)); + return -1; + } + inq = scsi_datain_unmarshall(task); + if (inq == NULL) { + printf("failed to unmarshall inquiry datain blob\n"); + scsi_free_scsi_task(task); + return -1; + } + if (inq->periperal_device_type != SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS) { + printf("LUN is not SBC device. Skipping test\n"); + scsi_free_scsi_task(task); + return -2; + } + /* Try out DPO : 1 */ printf("Read10 with DPO==1 ... "); diff --git a/test-tool/0170_unmap_simple.c b/test-tool/0170_unmap_simple.c index fd6f08eb..d8fb0a91 100644 --- a/test-tool/0170_unmap_simple.c +++ b/test-tool/0170_unmap_simple.c @@ -67,7 +67,7 @@ int T0170_unmap_simple(const char *initiator, const char *url, int data_loss, in if (rc16->lbpme == 0){ printf("Logical unit is fully provisioned. Skipping test\n"); - ret = -1; + ret = -2; scsi_free_scsi_task(task); goto finished; } @@ -79,7 +79,7 @@ int T0170_unmap_simple(const char *initiator, const char *url, int data_loss, in if (!data_loss) { printf("data_loss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0171_unmap_zero.c b/test-tool/0171_unmap_zero.c index 4e2e2a72..b4dd26f5 100644 --- a/test-tool/0171_unmap_zero.c +++ b/test-tool/0171_unmap_zero.c @@ -69,7 +69,7 @@ int T0171_unmap_zero(const char *initiator, const char *url, int data_loss, int if (rc16->lbpme == 0){ printf("Logical unit is fully provisioned. Skipping test\n"); - ret = -1; + ret = -2; scsi_free_scsi_task(task); goto finished; } @@ -81,7 +81,7 @@ int T0171_unmap_zero(const char *initiator, const char *url, int data_loss, int if (!data_loss) { printf("data_loss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0180_writesame10_unmap.c b/test-tool/0180_writesame10_unmap.c index 88b83d9c..fdf9ce3c 100644 --- a/test-tool/0180_writesame10_unmap.c +++ b/test-tool/0180_writesame10_unmap.c @@ -140,7 +140,7 @@ int T0180_writesame10_unmap(const char *initiator, const char *url, int data_los if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0181_writesame10_unmap_unaligned.c b/test-tool/0181_writesame10_unmap_unaligned.c index 388fab23..60c14043 100644 --- a/test-tool/0181_writesame10_unmap_unaligned.c +++ b/test-tool/0181_writesame10_unmap_unaligned.c @@ -67,7 +67,7 @@ int T0181_writesame10_unmap_unaligned(const char *initiator, const char *url, in if (rc16->lbpme == 0){ printf("Logical unit is fully provisioned. Skipping test\n"); - ret = -1; + ret = -2; scsi_free_scsi_task(task); goto finished; } @@ -86,7 +86,7 @@ int T0181_writesame10_unmap_unaligned(const char *initiator, const char *url, in if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0182_writesame10_beyondeol.c b/test-tool/0182_writesame10_beyondeol.c index 3ea149bc..26cc7743 100644 --- a/test-tool/0182_writesame10_beyondeol.c +++ b/test-tool/0182_writesame10_beyondeol.c @@ -73,7 +73,7 @@ int T0182_writesame10_beyondeol(const char *initiator, const char *url, int data if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0183_writesame10_wrprotect.c b/test-tool/0183_writesame10_wrprotect.c index 33bc35ae..29c5c808 100644 --- a/test-tool/0183_writesame10_wrprotect.c +++ b/test-tool/0183_writesame10_wrprotect.c @@ -71,7 +71,7 @@ int T0183_writesame10_wrprotect(const char *initiator, const char *url, int data if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0184_writesame10_0blocks.c b/test-tool/0184_writesame10_0blocks.c index 62c539dd..d6d0f883 100644 --- a/test-tool/0184_writesame10_0blocks.c +++ b/test-tool/0184_writesame10_0blocks.c @@ -75,7 +75,7 @@ int T0184_writesame10_0blocks(const char *initiator, const char *url, int data_l if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0190_writesame16_unmap.c b/test-tool/0190_writesame16_unmap.c index baad5211..eaca2874 100644 --- a/test-tool/0190_writesame16_unmap.c +++ b/test-tool/0190_writesame16_unmap.c @@ -140,7 +140,7 @@ int T0190_writesame16_unmap(const char *initiator, const char *url, int data_los if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0191_writesame16_unmap_unaligned.c b/test-tool/0191_writesame16_unmap_unaligned.c index b2610ff2..cea2e6bd 100644 --- a/test-tool/0191_writesame16_unmap_unaligned.c +++ b/test-tool/0191_writesame16_unmap_unaligned.c @@ -67,7 +67,7 @@ int T0191_writesame16_unmap_unaligned(const char *initiator, const char *url, in if (rc16->lbpme == 0){ printf("Logical unit is fully provisioned. Skipping test\n"); - ret = -1; + ret = -2; scsi_free_scsi_task(task); goto finished; } @@ -86,7 +86,7 @@ int T0191_writesame16_unmap_unaligned(const char *initiator, const char *url, in if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0192_writesame16_beyondeol.c b/test-tool/0192_writesame16_beyondeol.c index c15beabf..52a8b716 100644 --- a/test-tool/0192_writesame16_beyondeol.c +++ b/test-tool/0192_writesame16_beyondeol.c @@ -73,7 +73,7 @@ int T0192_writesame16_beyondeol(const char *initiator, const char *url, int data if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0193_writesame16_wrprotect.c b/test-tool/0193_writesame16_wrprotect.c index 02051ca0..7db4f1da 100644 --- a/test-tool/0193_writesame16_wrprotect.c +++ b/test-tool/0193_writesame16_wrprotect.c @@ -71,7 +71,7 @@ int T0193_writesame16_wrprotect(const char *initiator, const char *url, int data if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0194_writesame16_0blocks.c b/test-tool/0194_writesame16_0blocks.c index 00b569c4..ddfbf62c 100644 --- a/test-tool/0194_writesame16_0blocks.c +++ b/test-tool/0194_writesame16_0blocks.c @@ -75,7 +75,7 @@ int T0194_writesame16_0blocks(const char *initiator, const char *url, int data_l if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0201_read16_rdprotect.c b/test-tool/0201_read16_rdprotect.c index cbe7fbd2..7f3df554 100644 --- a/test-tool/0201_read16_rdprotect.c +++ b/test-tool/0201_read16_rdprotect.c @@ -69,6 +69,7 @@ int T0201_read16_rdprotect(const char *initiator, const char *url, int data_loss if(rc16->prot_en != 0) { printf("device is formatted with protection information, skipping test\n"); scsi_free_scsi_task(task); + ret = -2; goto finished; } scsi_free_scsi_task(task); diff --git a/test-tool/0202_read16_flags.c b/test-tool/0202_read16_flags.c index f8fec8f9..71da1739 100644 --- a/test-tool/0202_read16_flags.c +++ b/test-tool/0202_read16_flags.c @@ -25,6 +25,7 @@ int T0202_read16_flags(const char *initiator, const char *url, int data_loss _U_ struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; + struct scsi_inquiry_standard *inq; int ret = 0, lun; uint32_t block_size; @@ -46,6 +47,24 @@ int T0202_read16_flags(const char *initiator, const char *url, int data_loss _U_ return -1; } + /* This test is only valid for SBC devices */ + task = iscsi_inquiry_sync(iscsi, lun, 0, 0, 64); + if (task == NULL || task->status != SCSI_STATUS_GOOD) { + printf("Inquiry command failed : %s\n", iscsi_get_error(iscsi)); + return -1; + } + inq = scsi_datain_unmarshall(task); + if (inq == NULL) { + printf("failed to unmarshall inquiry datain blob\n"); + scsi_free_scsi_task(task); + return -1; + } + if (inq->periperal_device_type != SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS) { + printf("LUN is not SBC device. Skipping test\n"); + scsi_free_scsi_task(task); + return -2; + } + /* find the size of the LUN */ task = iscsi_readcapacity16_sync(iscsi, lun); if (task == NULL) { diff --git a/test-tool/0211_read12_rdprotect.c b/test-tool/0211_read12_rdprotect.c index 8a3fa33c..6a9d9fab 100644 --- a/test-tool/0211_read12_rdprotect.c +++ b/test-tool/0211_read12_rdprotect.c @@ -69,6 +69,7 @@ int T0211_read12_rdprotect(const char *initiator, const char *url, int data_loss if(rc16->prot_en != 0) { printf("device is formatted with protection information, skipping test\n"); scsi_free_scsi_task(task); + ret = -2; goto finished; } scsi_free_scsi_task(task); diff --git a/test-tool/0212_read12_flags.c b/test-tool/0212_read12_flags.c index 69cb39b9..8efbca38 100644 --- a/test-tool/0212_read12_flags.c +++ b/test-tool/0212_read12_flags.c @@ -25,6 +25,7 @@ int T0212_read12_flags(const char *initiator, const char *url, int data_loss _U_ struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; + struct scsi_inquiry_standard *inq; int ret = 0, lun; uint32_t block_size; @@ -46,6 +47,24 @@ int T0212_read12_flags(const char *initiator, const char *url, int data_loss _U_ return -1; } + /* This test is only valid for SBC devices */ + task = iscsi_inquiry_sync(iscsi, lun, 0, 0, 64); + if (task == NULL || task->status != SCSI_STATUS_GOOD) { + printf("Inquiry command failed : %s\n", iscsi_get_error(iscsi)); + return -1; + } + inq = scsi_datain_unmarshall(task); + if (inq == NULL) { + printf("failed to unmarshall inquiry datain blob\n"); + scsi_free_scsi_task(task); + return -1; + } + if (inq->periperal_device_type != SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS) { + printf("LUN is not SBC device. Skipping test\n"); + scsi_free_scsi_task(task); + return -2; + } + /* find the size of the LUN */ task = iscsi_readcapacity16_sync(iscsi, lun); if (task == NULL) { diff --git a/test-tool/0220_write16_simple.c b/test-tool/0220_write16_simple.c index a5090f92..8e1e7eb3 100644 --- a/test-tool/0220_write16_simple.c +++ b/test-tool/0220_write16_simple.c @@ -73,7 +73,7 @@ int T0220_write16_simple(const char *initiator, const char *url, int data_loss, if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0221_write16_wrprotect.c b/test-tool/0221_write16_wrprotect.c index c2ddb7c9..a343f135 100644 --- a/test-tool/0221_write16_wrprotect.c +++ b/test-tool/0221_write16_wrprotect.c @@ -70,13 +70,14 @@ int T0221_write16_wrprotect(const char *initiator, const char *url, int data_los if(rc16->prot_en != 0) { printf("device is formatted with protection information, skipping test\n"); scsi_free_scsi_task(task); + ret = -2; goto finished; } scsi_free_scsi_task(task); if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0222_write16_flags.c b/test-tool/0222_write16_flags.c index b7ce77ff..284d2073 100644 --- a/test-tool/0222_write16_flags.c +++ b/test-tool/0222_write16_flags.c @@ -25,6 +25,7 @@ int T0222_write16_flags(const char *initiator, const char *url, int data_loss, i struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; + struct scsi_inquiry_standard *inq; int ret = 0, lun; uint32_t block_size; unsigned char data[256 * 512]; @@ -47,6 +48,24 @@ int T0222_write16_flags(const char *initiator, const char *url, int data_loss, i return -1; } + /* This test is only valid for SBC devices */ + task = iscsi_inquiry_sync(iscsi, lun, 0, 0, 64); + if (task == NULL || task->status != SCSI_STATUS_GOOD) { + printf("Inquiry command failed : %s\n", iscsi_get_error(iscsi)); + return -1; + } + inq = scsi_datain_unmarshall(task); + if (inq == NULL) { + printf("failed to unmarshall inquiry datain blob\n"); + scsi_free_scsi_task(task); + return -1; + } + if (inq->periperal_device_type != SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS) { + printf("LUN is not SBC device. Skipping test\n"); + scsi_free_scsi_task(task); + return -2; + } + /* find the size of the LUN */ task = iscsi_readcapacity16_sync(iscsi, lun); if (task == NULL) { @@ -91,7 +110,7 @@ int T0222_write16_flags(const char *initiator, const char *url, int data_loss, i if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0223_write16_0blocks.c b/test-tool/0223_write16_0blocks.c index dcd002db..ae3e1f6b 100644 --- a/test-tool/0223_write16_0blocks.c +++ b/test-tool/0223_write16_0blocks.c @@ -75,7 +75,7 @@ int T0223_write16_0blocks(const char *initiator, const char *url, int data_loss, if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0224_write16_beyondeol.c b/test-tool/0224_write16_beyondeol.c index e9507ec3..4e112a02 100644 --- a/test-tool/0224_write16_beyondeol.c +++ b/test-tool/0224_write16_beyondeol.c @@ -71,7 +71,7 @@ int T0224_write16_beyondeol(const char *initiator, const char *url, int data_los if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0230_write12_simple.c b/test-tool/0230_write12_simple.c index a5b52c61..9205c807 100644 --- a/test-tool/0230_write12_simple.c +++ b/test-tool/0230_write12_simple.c @@ -73,7 +73,7 @@ int T0230_write12_simple(const char *initiator, const char *url, int data_loss, if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0231_write12_wrprotect.c b/test-tool/0231_write12_wrprotect.c index b518c8c6..73d195ad 100644 --- a/test-tool/0231_write12_wrprotect.c +++ b/test-tool/0231_write12_wrprotect.c @@ -70,13 +70,14 @@ int T0231_write12_wrprotect(const char *initiator, const char *url, int data_los if(rc16->prot_en != 0) { printf("device is formatted with protection information, skipping test\n"); scsi_free_scsi_task(task); + ret = -2; goto finished; } scsi_free_scsi_task(task); if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0232_write12_flags.c b/test-tool/0232_write12_flags.c index 4e19a2ac..616cf2f5 100644 --- a/test-tool/0232_write12_flags.c +++ b/test-tool/0232_write12_flags.c @@ -25,6 +25,7 @@ int T0232_write12_flags(const char *initiator, const char *url, int data_loss, i struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; + struct scsi_inquiry_standard *inq; int ret = 0, lun; uint32_t block_size; unsigned char data[256 * 512]; @@ -47,6 +48,24 @@ int T0232_write12_flags(const char *initiator, const char *url, int data_loss, i return -1; } + /* This test is only valid for SBC devices */ + task = iscsi_inquiry_sync(iscsi, lun, 0, 0, 64); + if (task == NULL || task->status != SCSI_STATUS_GOOD) { + printf("Inquiry command failed : %s\n", iscsi_get_error(iscsi)); + return -1; + } + inq = scsi_datain_unmarshall(task); + if (inq == NULL) { + printf("failed to unmarshall inquiry datain blob\n"); + scsi_free_scsi_task(task); + return -1; + } + if (inq->periperal_device_type != SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS) { + printf("LUN is not SBC device. Skipping test\n"); + scsi_free_scsi_task(task); + return -2; + } + /* find the size of the LUN */ task = iscsi_readcapacity16_sync(iscsi, lun); if (task == NULL) { @@ -91,7 +110,7 @@ int T0232_write12_flags(const char *initiator, const char *url, int data_loss, i if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0233_write12_0blocks.c b/test-tool/0233_write12_0blocks.c index 0f8a608f..925c6ec2 100644 --- a/test-tool/0233_write12_0blocks.c +++ b/test-tool/0233_write12_0blocks.c @@ -75,7 +75,7 @@ int T0233_write12_0blocks(const char *initiator, const char *url, int data_loss, if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0234_write12_beyondeol.c b/test-tool/0234_write12_beyondeol.c index e38b2803..54f94ce6 100644 --- a/test-tool/0234_write12_beyondeol.c +++ b/test-tool/0234_write12_beyondeol.c @@ -71,7 +71,7 @@ int T0234_write12_beyondeol(const char *initiator, const char *url, int data_los if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0260_get_lba_status_simple.c b/test-tool/0260_get_lba_status_simple.c index 8ca98954..debcc5b6 100644 --- a/test-tool/0260_get_lba_status_simple.c +++ b/test-tool/0260_get_lba_status_simple.c @@ -68,7 +68,7 @@ int T0260_get_lba_status_simple(const char *initiator, const char *url, int data if (rc16->lbpme == 0){ printf("Logical unit is fully provisioned. Skipping test\n"); - ret = -1; + ret = -2; scsi_free_scsi_task(task); goto finished; } diff --git a/test-tool/0264_get_lba_status_beyondeol.c b/test-tool/0264_get_lba_status_beyondeol.c index 6f98acaf..c06e275b 100644 --- a/test-tool/0264_get_lba_status_beyondeol.c +++ b/test-tool/0264_get_lba_status_beyondeol.c @@ -67,7 +67,7 @@ int T0264_get_lba_status_beyondeol(const char *initiator, const char *url, int d if (rc16->lbpme == 0){ printf("Logical unit is fully provisioned. Skipping test\n"); - ret = -1; + ret = -2; scsi_free_scsi_task(task); goto finished; } diff --git a/test-tool/0290_write10_simple.c b/test-tool/0290_write10_simple.c index 6f74c8b0..1811f17b 100644 --- a/test-tool/0290_write10_simple.c +++ b/test-tool/0290_write10_simple.c @@ -73,7 +73,7 @@ int T0290_write10_simple(const char *initiator, const char *url, int data_loss, if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0291_write10_wrprotect.c b/test-tool/0291_write10_wrprotect.c index fd0debf7..c139b130 100644 --- a/test-tool/0291_write10_wrprotect.c +++ b/test-tool/0291_write10_wrprotect.c @@ -70,13 +70,14 @@ int T0291_write10_wrprotect(const char *initiator, const char *url, int data_los if(rc16->prot_en != 0) { printf("device is formatted with protection information, skipping test\n"); scsi_free_scsi_task(task); + ret = -2; goto finished; } scsi_free_scsi_task(task); if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0292_write10_flags.c b/test-tool/0292_write10_flags.c index 0a4102b1..f47621ae 100644 --- a/test-tool/0292_write10_flags.c +++ b/test-tool/0292_write10_flags.c @@ -25,6 +25,7 @@ int T0292_write10_flags(const char *initiator, const char *url, int data_loss, i struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; + struct scsi_inquiry_standard *inq; int ret = 0, lun; uint32_t block_size; unsigned char data[256 * 512]; @@ -47,6 +48,24 @@ int T0292_write10_flags(const char *initiator, const char *url, int data_loss, i return -1; } + /* This test is only valid for SBC devices */ + task = iscsi_inquiry_sync(iscsi, lun, 0, 0, 64); + if (task == NULL || task->status != SCSI_STATUS_GOOD) { + printf("Inquiry command failed : %s\n", iscsi_get_error(iscsi)); + return -1; + } + inq = scsi_datain_unmarshall(task); + if (inq == NULL) { + printf("failed to unmarshall inquiry datain blob\n"); + scsi_free_scsi_task(task); + return -1; + } + if (inq->periperal_device_type != SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS) { + printf("LUN is not SBC device. Skipping test\n"); + scsi_free_scsi_task(task); + return -2; + } + /* find the size of the LUN */ task = iscsi_readcapacity16_sync(iscsi, lun); if (task == NULL) { @@ -91,7 +110,7 @@ int T0292_write10_flags(const char *initiator, const char *url, int data_loss, i if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0293_write10_0blocks.c b/test-tool/0293_write10_0blocks.c index 889605e9..400f42a9 100644 --- a/test-tool/0293_write10_0blocks.c +++ b/test-tool/0293_write10_0blocks.c @@ -75,7 +75,7 @@ int T0293_write10_0blocks(const char *initiator, const char *url, int data_loss, if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0294_write10_beyondeol.c b/test-tool/0294_write10_beyondeol.c index 87c9c639..20a25f29 100644 --- a/test-tool/0294_write10_beyondeol.c +++ b/test-tool/0294_write10_beyondeol.c @@ -71,7 +71,7 @@ int T0294_write10_beyondeol(const char *initiator, const char *url, int data_los if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0300_readonly.c b/test-tool/0300_readonly.c index bcda83fd..b38c678e 100644 --- a/test-tool/0300_readonly.c +++ b/test-tool/0300_readonly.c @@ -25,6 +25,7 @@ int T0300_readonly(const char *initiator, const char *url, int data_loss, int sh struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; + struct scsi_inquiry_standard *inq; struct scsi_mode_sense *ms; int ret, lun; uint32_t block_size; @@ -88,11 +89,27 @@ int T0300_readonly(const char *initiator, const char *url, int data_loss, int sh if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); + ret = -2; goto finished; } - - + /* This test is only valid for SBC devices */ + task = iscsi_inquiry_sync(iscsi, lun, 0, 0, 64); + if (task == NULL || task->status != SCSI_STATUS_GOOD) { + printf("Inquiry command failed : %s\n", iscsi_get_error(iscsi)); + return -1; + } + inq = scsi_datain_unmarshall(task); + if (inq == NULL) { + printf("failed to unmarshall inquiry datain blob\n"); + scsi_free_scsi_task(task); + return -1; + } + if (inq->periperal_device_type != SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS) { + printf("LUN is not SBC device. Skipping test\n"); + scsi_free_scsi_task(task); + return -1; + } /* verify the device is readonly */ task = iscsi_modesense6_sync(iscsi, lun, 0, SCSI_MODESENSE_PC_CURRENT, @@ -121,6 +138,7 @@ int T0300_readonly(const char *initiator, const char *url, int data_loss, int sh } if (!(ms->device_specific_parameter & 0x80)) { printf("Device is not read-only. Skipping test\n"); + ret = -2; goto finished; } scsi_free_scsi_task(task); diff --git a/test-tool/0310_writeverify10_simple.c b/test-tool/0310_writeverify10_simple.c index ca12d8dd..c7aeca1b 100644 --- a/test-tool/0310_writeverify10_simple.c +++ b/test-tool/0310_writeverify10_simple.c @@ -73,7 +73,7 @@ int T0310_writeverify10_simple(const char *initiator, const char *url, int data_ if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0311_writeverify10_wrprotect.c b/test-tool/0311_writeverify10_wrprotect.c index 59f69df3..e8b7c023 100644 --- a/test-tool/0311_writeverify10_wrprotect.c +++ b/test-tool/0311_writeverify10_wrprotect.c @@ -69,6 +69,7 @@ int T0311_writeverify10_wrprotect(const char *initiator, const char *url, int da if(rc16->prot_en != 0) { printf("device is formatted with protection information, skipping test\n"); + ret = -2; scsi_free_scsi_task(task); goto finished; } @@ -76,7 +77,7 @@ int T0311_writeverify10_wrprotect(const char *initiator, const char *url, int da if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0314_writeverify10_beyondeol.c b/test-tool/0314_writeverify10_beyondeol.c index 73d6aa3e..4dd6b179 100644 --- a/test-tool/0314_writeverify10_beyondeol.c +++ b/test-tool/0314_writeverify10_beyondeol.c @@ -74,7 +74,7 @@ int T0314_writeverify10_beyondeol(const char *initiator, const char *url, int da if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0320_writeverify12_simple.c b/test-tool/0320_writeverify12_simple.c index 8751081f..44689d9b 100644 --- a/test-tool/0320_writeverify12_simple.c +++ b/test-tool/0320_writeverify12_simple.c @@ -73,7 +73,7 @@ int T0320_writeverify12_simple(const char *initiator, const char *url, int data_ if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0321_writeverify12_wrprotect.c b/test-tool/0321_writeverify12_wrprotect.c index 62cf2b39..5a32c28b 100644 --- a/test-tool/0321_writeverify12_wrprotect.c +++ b/test-tool/0321_writeverify12_wrprotect.c @@ -70,13 +70,14 @@ int T0321_writeverify12_wrprotect(const char *initiator, const char *url, int da if(rc16->prot_en != 0) { printf("device is formatted with protection information, skipping test\n"); scsi_free_scsi_task(task); + ret = -2; goto finished; } scsi_free_scsi_task(task); if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0324_writeverify12_beyondeol.c b/test-tool/0324_writeverify12_beyondeol.c index 48add60f..4684036c 100644 --- a/test-tool/0324_writeverify12_beyondeol.c +++ b/test-tool/0324_writeverify12_beyondeol.c @@ -74,7 +74,7 @@ int T0324_writeverify12_beyondeol(const char *initiator, const char *url, int da if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0330_writeverify16_simple.c b/test-tool/0330_writeverify16_simple.c index dabf4ae1..9cf7d372 100644 --- a/test-tool/0330_writeverify16_simple.c +++ b/test-tool/0330_writeverify16_simple.c @@ -73,7 +73,7 @@ int T0330_writeverify16_simple(const char *initiator, const char *url, int data_ if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0331_writeverify16_wrprotect.c b/test-tool/0331_writeverify16_wrprotect.c index 1c7b3091..688d9693 100644 --- a/test-tool/0331_writeverify16_wrprotect.c +++ b/test-tool/0331_writeverify16_wrprotect.c @@ -70,13 +70,14 @@ int T0331_writeverify16_wrprotect(const char *initiator, const char *url, int da if(rc16->prot_en != 0) { printf("device is formatted with protection information, skipping test\n"); scsi_free_scsi_task(task); + ret = -2; goto finished; } scsi_free_scsi_task(task); if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0334_writeverify16_beyondeol.c b/test-tool/0334_writeverify16_beyondeol.c index fd1c1f52..ab8cb670 100644 --- a/test-tool/0334_writeverify16_beyondeol.c +++ b/test-tool/0334_writeverify16_beyondeol.c @@ -74,7 +74,7 @@ int T0334_writeverify16_beyondeol(const char *initiator, const char *url, int da if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0340_compareandwrite_simple.c b/test-tool/0340_compareandwrite_simple.c index 97095652..6a965dff 100644 --- a/test-tool/0340_compareandwrite_simple.c +++ b/test-tool/0340_compareandwrite_simple.c @@ -74,7 +74,7 @@ int T0340_compareandwrite_simple(const char *initiator, const char *url, int dat if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0341_compareandwrite_mismatch.c b/test-tool/0341_compareandwrite_mismatch.c index 70523fd1..19dd0e22 100644 --- a/test-tool/0341_compareandwrite_mismatch.c +++ b/test-tool/0341_compareandwrite_mismatch.c @@ -74,7 +74,7 @@ int T0341_compareandwrite_mismatch(const char *initiator, const char *url, int d if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0343_compareandwrite_beyondeol.c b/test-tool/0343_compareandwrite_beyondeol.c index fdfc8501..eec48d77 100644 --- a/test-tool/0343_compareandwrite_beyondeol.c +++ b/test-tool/0343_compareandwrite_beyondeol.c @@ -74,7 +74,7 @@ int T0343_compareandwrite_beyondeol(const char *initiator, const char *url, int if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0350_orwrite_simple.c b/test-tool/0350_orwrite_simple.c index 7403a52a..fd883cb4 100644 --- a/test-tool/0350_orwrite_simple.c +++ b/test-tool/0350_orwrite_simple.c @@ -76,7 +76,7 @@ int T0350_orwrite_simple(const char *initiator, const char *url, int data_loss, if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0351_orwrite_wrprotect.c b/test-tool/0351_orwrite_wrprotect.c index 2d060aa1..3f339fbb 100644 --- a/test-tool/0351_orwrite_wrprotect.c +++ b/test-tool/0351_orwrite_wrprotect.c @@ -70,13 +70,14 @@ int T0351_orwrite_wrprotect(const char *initiator, const char *url, int data_los if(rc16->prot_en != 0) { printf("device is formatted with protection information, skipping test\n"); scsi_free_scsi_task(task); + ret = -2; goto finished; } scsi_free_scsi_task(task); if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0354_orwrite_beyondeol.c b/test-tool/0354_orwrite_beyondeol.c index 5ab1f432..287535fb 100644 --- a/test-tool/0354_orwrite_beyondeol.c +++ b/test-tool/0354_orwrite_beyondeol.c @@ -74,7 +74,7 @@ int T0354_orwrite_beyondeol(const char *initiator, const char *url, int data_los if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0360_startstopunit_simple.c b/test-tool/0360_startstopunit_simple.c index 2f70bf5f..79bb9648 100644 --- a/test-tool/0360_startstopunit_simple.c +++ b/test-tool/0360_startstopunit_simple.c @@ -100,7 +100,7 @@ int T0360_startstopunit_simple(const char *initiator, const char *url, int data_ if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0361_startstopunit_pwrcnd.c b/test-tool/0361_startstopunit_pwrcnd.c index 33d0e9d8..d165be19 100644 --- a/test-tool/0361_startstopunit_pwrcnd.c +++ b/test-tool/0361_startstopunit_pwrcnd.c @@ -100,7 +100,7 @@ int T0361_startstopunit_pwrcnd(const char *initiator, const char *url, int data_ if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0370_nomedia.c b/test-tool/0370_nomedia.c index e77ea355..638c29dd 100644 --- a/test-tool/0370_nomedia.c +++ b/test-tool/0370_nomedia.c @@ -131,6 +131,7 @@ int T0370_nomedia(const char *initiator, const char *url, int data_loss, int sho if (!removable) { printf("Media is not removable. Skipping test.\n"); + ret = -2; goto finished; } @@ -538,6 +539,7 @@ int T0370_nomedia(const char *initiator, const char *url, int data_loss, int sho if (!data_loss) { printf("--dataloss flag is not set. Skipping all WRITE tests\n"); + ret = -2; goto cleanup; } diff --git a/test-tool/0380_preventallow_simple.c b/test-tool/0380_preventallow_simple.c index 54d4b2d3..eb53f89c 100644 --- a/test-tool/0380_preventallow_simple.c +++ b/test-tool/0380_preventallow_simple.c @@ -100,7 +100,7 @@ int T0380_preventallow_simple(const char *initiator, const char *url, int data_l if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/0381_preventallow_eject.c b/test-tool/0381_preventallow_eject.c index 054ee3a6..9a345d23 100644 --- a/test-tool/0381_preventallow_eject.c +++ b/test-tool/0381_preventallow_eject.c @@ -102,7 +102,7 @@ int T0381_preventallow_eject(const char *initiator, const char *url, int data_lo if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } @@ -112,6 +112,7 @@ int T0381_preventallow_eject(const char *initiator, const char *url, int data_lo if (!removable) { printf("Media is not removable. Skipping tests\n"); + ret = -2; goto finished; } diff --git a/test-tool/0382_preventallow_itnexus_loss.c b/test-tool/0382_preventallow_itnexus_loss.c index c5806825..0ee7df6e 100644 --- a/test-tool/0382_preventallow_itnexus_loss.c +++ b/test-tool/0382_preventallow_itnexus_loss.c @@ -104,7 +104,7 @@ int T0382_preventallow_itnexus_loss(const char *initiator, const char *url, int if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } @@ -114,6 +114,7 @@ int T0382_preventallow_itnexus_loss(const char *initiator, const char *url, int if (!removable) { printf("Media is not removable. Skipping tests\n"); + ret = -2; goto finished; } diff --git a/test-tool/0383_preventallow_target_warm_reset.c b/test-tool/0383_preventallow_target_warm_reset.c index a4c9dced..7c9d01a2 100644 --- a/test-tool/0383_preventallow_target_warm_reset.c +++ b/test-tool/0383_preventallow_target_warm_reset.c @@ -122,7 +122,7 @@ int T0383_preventallow_target_warm_reset(const char *initiator, const char *url, if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } @@ -132,6 +132,7 @@ int T0383_preventallow_target_warm_reset(const char *initiator, const char *url, if (!removable) { printf("Media is not removable. Skipping tests\n"); + ret = -2; goto finished; } diff --git a/test-tool/0384_preventallow_target_cold_reset.c b/test-tool/0384_preventallow_target_cold_reset.c index 31603718..1010213e 100644 --- a/test-tool/0384_preventallow_target_cold_reset.c +++ b/test-tool/0384_preventallow_target_cold_reset.c @@ -122,7 +122,7 @@ int T0384_preventallow_target_cold_reset(const char *initiator, const char *url, if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } @@ -132,6 +132,7 @@ int T0384_preventallow_target_cold_reset(const char *initiator, const char *url, if (!removable) { printf("Media is not removable. Skipping tests\n"); + ret = -2; goto finished; } diff --git a/test-tool/0385_preventallow_lun_reset.c b/test-tool/0385_preventallow_lun_reset.c index 68bbb541..12711287 100644 --- a/test-tool/0385_preventallow_lun_reset.c +++ b/test-tool/0385_preventallow_lun_reset.c @@ -122,7 +122,7 @@ int T0385_preventallow_lun_reset(const char *initiator, const char *url, int dat if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } @@ -132,6 +132,7 @@ int T0385_preventallow_lun_reset(const char *initiator, const char *url, int dat if (!removable) { printf("Media is not removable. Skipping tests\n"); + ret = -2; goto finished; } diff --git a/test-tool/0386_preventallow_2_it_nexuses.c b/test-tool/0386_preventallow_2_it_nexuses.c index 24d11944..df205507 100644 --- a/test-tool/0386_preventallow_2_it_nexuses.c +++ b/test-tool/0386_preventallow_2_it_nexuses.c @@ -105,7 +105,7 @@ int T0386_preventallow_2_itl_nexuses(const char *initiator, const char *url, int if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } @@ -115,6 +115,7 @@ int T0386_preventallow_2_itl_nexuses(const char *initiator, const char *url, int if (!removable) { printf("Media is not removable. Skipping tests\n"); + ret = -2; goto finished; } diff --git a/test-tool/0390_mandatory_opcodes_sbc.c b/test-tool/0390_mandatory_opcodes_sbc.c index 81e6b805..0d023551 100644 --- a/test-tool/0390_mandatory_opcodes_sbc.c +++ b/test-tool/0390_mandatory_opcodes_sbc.c @@ -119,6 +119,7 @@ int T0390_mandatory_opcodes_sbc(const char *initiator, const char *url, int data if (inq->periperal_device_type != SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_DIRECT_ACCESS) { printf("Not a SBC device. Skipping test\n"); scsi_free_scsi_task(task); + ret = -2; goto finished; } @@ -126,7 +127,7 @@ int T0390_mandatory_opcodes_sbc(const char *initiator, const char *url, int data if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/1000_cmdsn_invalid.c b/test-tool/1000_cmdsn_invalid.c index a60a4059..d168ca98 100644 --- a/test-tool/1000_cmdsn_invalid.c +++ b/test-tool/1000_cmdsn_invalid.c @@ -110,7 +110,7 @@ int T1000_cmdsn_invalid(const char *initiator, const char *url, int data_loss, i if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/1010_datasn_invalid.c b/test-tool/1010_datasn_invalid.c index a7f2e0b6..e1cbe5c3 100644 --- a/test-tool/1010_datasn_invalid.c +++ b/test-tool/1010_datasn_invalid.c @@ -120,7 +120,7 @@ int T1010_datasn_invalid(const char *initiator, const char *url, int data_loss, if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/1020_bufferoffset_invalid.c b/test-tool/1020_bufferoffset_invalid.c index 50c935f5..12ca595e 100644 --- a/test-tool/1020_bufferoffset_invalid.c +++ b/test-tool/1020_bufferoffset_invalid.c @@ -111,7 +111,7 @@ int T1020_bufferoffset_invalid(const char *initiator, const char *url, int data_ if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); - ret = -1; + ret = -2; goto finished; } diff --git a/test-tool/iscsi-test.c b/test-tool/iscsi-test.c index 472fa3bc..4c27cf43 100644 --- a/test-tool/iscsi-test.c +++ b/test-tool/iscsi-test.c @@ -331,7 +331,7 @@ int main(int argc, const char *argv[]) int extra_argc = 0; const char *url = NULL; int show_help = 0, show_usage = 0, list_tests = 0; - int res, ret; + int res, num_failed, num_skipped; struct scsi_test *test; char *testname = NULL; @@ -390,7 +390,7 @@ int main(int argc, const char *argv[]) exit(10); } - ret = 0; + num_failed = num_skipped = 0; for (test = &tests[0]; test->name; test++) { if (testname != NULL && fnmatch(testname, test->name, 0)) { continue; @@ -399,13 +399,16 @@ int main(int argc, const char *argv[]) res = test->test(initiator, url, data_loss, show_info); if (res == 0) { printf("TEST %s [OK]\n", test->name); + } else if (res == -2) { + printf("TEST %s [SKIPPED]\n", test->name); + num_skipped++; } else { printf("TEST %s [FAILED]\n", test->name); - ret++; + num_failed++; } printf("\n"); } - return ret; + return num_failed ? num_failed : num_skipped ? 77 : 0; } diff --git a/test-tool/iscsi-test.h b/test-tool/iscsi-test.h index ab95d1e2..9b76079a 100644 --- a/test-tool/iscsi-test.h +++ b/test-tool/iscsi-test.h @@ -25,6 +25,8 @@ struct iscsi_async_state { int finished; }; void wait_until_test_finished(struct iscsi_context *iscsi, struct iscsi_async_state *test_state); + +struct iscsi_pdu; void (*local_iscsi_queue_pdu)(struct iscsi_context *iscsi, struct iscsi_pdu *pdu); int T0100_read10_simple(const char *initiator, const char *url, int data_loss, int show_info);