diff --git a/Makefile.am b/Makefile.am index b7ad460..353d3dd 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 046f3e6..af01299 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 5d04408..5232712 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 fd6f08e..d8fb0a9 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 4e2e2a7..b4dd26f 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 88b83d9..fdf9ce3 100644 --- a/test-tool/0180_writesame10_unmap.c +++ b/test-tool/0180_writesame10_unmap.c @@ -140,7 +140,7 @@ test2: 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 388fab2..60c1404 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 3ea149b..26cc774 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 33bc35a..29c5c80 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 62c539d..d6d0f88 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 baad521..eaca287 100644 --- a/test-tool/0190_writesame16_unmap.c +++ b/test-tool/0190_writesame16_unmap.c @@ -140,7 +140,7 @@ test2: 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 b2610ff..cea2e6b 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 c15beab..52a8b71 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 02051ca..7db4f1d 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 00b569c..ddfbf62 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 cbe7fbd..7f3df55 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 f8fec8f..71da173 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 8a3fa33..6a9d9fa 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 69cb39b..8efbca3 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 a5090f9..8e1e7eb 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 c2ddb7c..a343f13 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 b7ce77f..284d207 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 dcd002d..ae3e1f6 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 e9507ec..4e112a0 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 a5b52c6..9205c80 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 b518c8c..73d195a 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 4e19a2a..616cf2f 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 0f8a608..925c6ec 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 e38b280..54f94ce 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 8ca9895..debcc5b 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 6f98aca..c06e275 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 6f74c8b..1811f17 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 fd0debf..c139b13 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 0a4102b..f47621a 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 889605e..400f42a 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 87c9c63..20a25f2 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 bcda83f..b38c678 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 ca12d8d..c7aeca1 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 59f69df..e8b7c02 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 73d6aa3..4dd6b17 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 8751081..44689d9 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 62cf2b3..5a32c28 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 48add60..4684036 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 dabf4ae..9cf7d37 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 1c7b309..688d969 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 fd1c1f5..ab8cb67 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 9709565..6a965df 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 70523fd..19dd0e2 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 fdfc850..eec48d7 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 7403a52..fd883cb 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 2d060aa..3f339fb 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 5ab1f43..287535f 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 2f70bf5..79bb964 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 33d0e9d..d165be1 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 e77ea35..638c29d 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 @@ test16: 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 54d4b2d..eb53f89 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 054ee3a..9a345d2 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 c580682..0ee7df6 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 a4c9dce..7c9d01a 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 3160371..1010213 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 68bbb54..1271128 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 24d1194..df20550 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 81e6b80..0d02355 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 a60a405..d168ca9 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 a7f2e0b..e1cbe5c 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 50c935f..12ca595 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 472fa3b..4c27cf4 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 ab95d1e..9b76079 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);