diff --git a/test-tool/0184_writesame10_0blocks.c b/test-tool/0184_writesame10_0blocks.c index 3376c60..e8d2c23 100644 --- a/test-tool/0184_writesame10_0blocks.c +++ b/test-tool/0184_writesame10_0blocks.c @@ -74,6 +74,12 @@ int T0184_writesame10_0blocks(const char *initiator, const char *url) ret = -2; goto finished; } + if (inq_bl == NULL) { + printf("[SKIPPED]\n"); + printf("Target does not support block limits VPD\n"); + ret = -2; + goto finished; + } if ((!inq_bl->wsnz && task->status != SCSI_STATUS_GOOD) || (inq_bl->wsnz && task->status != SCSI_STATUS_CHECK_CONDITION)) { printf("[FAILED]\n"); diff --git a/test-tool/iscsi-test.c b/test-tool/iscsi-test.c index 8723c06..ab4ad3c 100644 --- a/test-tool/iscsi-test.c +++ b/test-tool/iscsi-test.c @@ -315,6 +315,7 @@ int main(int argc, char *argv[]) struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_task *inq_task; + struct scsi_task *inq_bl_task; struct scsi_task *rc16_task; struct scsi_readcapacity10 *rc10; int full_size; @@ -481,6 +482,30 @@ int main(int argc, char *argv[]) return -1; } + /* try reading block limits vpd */ + inq_bl_task = iscsi_inquiry_sync(iscsi, lun, 1, SCSI_INQUIRY_PAGECODE_BLOCK_LIMITS, 64); + if (inq_bl_task && inq_bl_task->status != SCSI_STATUS_GOOD) { + scsi_free_scsi_task(inq_bl_task); + inq_bl_task = NULL; + } + if (inq_bl_task) { + full_size = scsi_datain_getfullsize(inq_bl_task); + if (full_size > inq_bl_task->datain.size) { + scsi_free_scsi_task(inq_bl_task); + + if ((inq_bl_task = iscsi_inquiry_sync(iscsi, lun, 1, SCSI_INQUIRY_PAGECODE_BLOCK_LIMITS, full_size)) == NULL) { + printf("Inquiry command failed : %s\n", iscsi_get_error(iscsi)); + return -1; + } + } + + inq_bl = scsi_datain_unmarshall(inq_bl_task); + if (inq_bl == NULL) { + printf("failed to unmarshall inquiry datain blob\n"); + return -1; + } + } + num_failed = num_skipped = 0; for (test = &tests[0]; test->name; test++) { @@ -518,6 +543,7 @@ int main(int argc, char *argv[]) scsi_free_scsi_task(inq_task); scsi_free_scsi_task(rc16_task); + scsi_free_scsi_task(inq_bl_task); iscsi_logout_sync(iscsi); iscsi_destroy_context(iscsi);