diff --git a/test-tool/iscsi-support.c b/test-tool/iscsi-support.c index 2fcc0b8..e22e621 100644 --- a/test-tool/iscsi-support.c +++ b/test-tool/iscsi-support.c @@ -1764,171 +1764,47 @@ read16(struct iscsi_context *iscsi, int lun, uint64_t lba, } int -readcapacity10(struct iscsi_context *iscsi, int lun, uint32_t lba, int pmi) +readcapacity10(struct iscsi_context *iscsi, int lun, uint32_t lba, int pmi, int status, enum scsi_sense_key key, int *ascq, int num_ascq) { struct scsi_task *task; + int ret; - logging(LOG_VERBOSE, "Send READCAPACITY10 LBA:%d pmi:%d", + logging(LOG_VERBOSE, "Send READCAPACITY10 (Expecting %s) LBA:%d" + " pmi:%d", + scsi_status_str(status), lba, pmi); - task = iscsi_readcapacity10_sync(iscsi, lun, lba, pmi); - if (task == NULL) { - logging(LOG_NORMAL, "[FAILED] Failed to send READCAPACITY10 command: %s", - iscsi_get_error(iscsi)); - return -1; - } - if (task->status != SCSI_STATUS_GOOD) { - logging(LOG_NORMAL, "[FAILED] READCAPACITY10 command: " - "failed with sense. %s", iscsi_get_error(iscsi)); - scsi_free_scsi_task(task); - return -1; - } + task = scsi_cdb_readcapacity10(lba, pmi); + assert(task != NULL); - scsi_free_scsi_task(task); - logging(LOG_VERBOSE, "[OK] READCAPACITY10 returned SUCCESS."); - return 0; + task = iscsi_scsi_command_sync(iscsi, lun, task, NULL); + + ret = check_result("READCAPACITY10", iscsi, task, status, key, ascq, num_ascq); + if (task) { + scsi_free_scsi_task(task); + } + return ret; } int -readcapacity10_nomedium(struct iscsi_context *iscsi, int lun, uint32_t lba, int pmi) +readcapacity16(struct iscsi_context *iscsi, int lun, int alloc_len, int status, enum scsi_sense_key key, int *ascq, int num_ascq) { struct scsi_task *task; + int ret; - logging(LOG_VERBOSE, "Send READCAPACITY10 (Expecting MEDIUM_NOT_PRESENT) " - "LBA:%d pmi:%d", - lba, pmi); - - task = iscsi_readcapacity10_sync(iscsi, lun, lba, pmi); - if (task == NULL) { - logging(LOG_NORMAL, "[FAILED] Failed to send READCAPACITY10 command: %s", - iscsi_get_error(iscsi)); - return -1; - } - if (task->status == SCSI_STATUS_GOOD) { - logging(LOG_NORMAL, "[FAILED] READCAPACITY10 command successful. But should have failed with NOT_READY/MEDIUM_NOT_PRESENT*"); - scsi_free_scsi_task(task); - return -1; - } - if (task->status != SCSI_STATUS_CHECK_CONDITION - || task->sense.key != SCSI_SENSE_NOT_READY - || (task->sense.ascq != SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT - && task->sense.ascq != SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT_TRAY_OPEN - && task->sense.ascq != SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT_TRAY_CLOSED)) { - logging(LOG_NORMAL, "[FAILED] READCAPACITY10 Should have failed " - "with NOT_READY/MEDIUM_NOT_PRESENT* But failed " - "with %s", iscsi_get_error(iscsi)); - scsi_free_scsi_task(task); - return -1; - } - - scsi_free_scsi_task(task); - logging(LOG_VERBOSE, "[OK] READCAPACITY10 returned MEDIUM_NOT_PRESENT."); - return 0; -} - -int -readcapacity16(struct iscsi_context *iscsi, int lun, int alloc_len) -{ - struct scsi_task *task; - - - logging(LOG_VERBOSE, "Send READCAPACITY16 alloc_len:%d", alloc_len); + logging(LOG_VERBOSE, "Send READCAPACITY16 (Expecting %s)", + scsi_status_str(status)); task = scsi_cdb_serviceactionin16(SCSI_READCAPACITY16, alloc_len); - if (task == NULL) { - logging(LOG_NORMAL, "Out-of-memory: Failed to create " - "READCAPACITY16 cdb."); - return -1; - } + assert(task != NULL); + task = iscsi_scsi_command_sync(iscsi, lun, task, NULL); - if (task == NULL) { - logging(LOG_NORMAL, "[FAILED] Failed to send READCAPACITY16 command: %s", - iscsi_get_error(iscsi)); - return -1; - } - if (task->status == SCSI_STATUS_CHECK_CONDITION - && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST - && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { - scsi_free_scsi_task(task); - if (inq->protect) { - logging(LOG_NORMAL, "[FAILED] READCAPACITY16 is not " - "available but INQ->PROTECT is set. " - "ReadCapacity16 is mandatory when INQ->PROTECT " - "is set."); - return -1; - } - if (sbc3_support) { - logging(LOG_NORMAL, "[FAILED] READCAPACITY16 is not available but the device claims SBC-3 support."); - return -1; - } else { - logging(LOG_NORMAL, "[SKIPPED] READCAPACITY16 is not implemented and SBC-3 is not claimed."); - return -2; - } - } - if (task->status != SCSI_STATUS_GOOD) { - logging(LOG_NORMAL, "[FAILED] READCAPACITY16 command: " - "failed with sense. %s", iscsi_get_error(iscsi)); - scsi_free_scsi_task(task); - return -1; - } - scsi_free_scsi_task(task); - logging(LOG_VERBOSE, "[OK] READCAPACITY16 returned SUCCESS."); - return 0; -} - -int -readcapacity16_nomedium(struct iscsi_context *iscsi, int lun, int alloc_len) -{ - struct scsi_task *task; - - logging(LOG_VERBOSE, "Send READCAPACITY16 (Expecting MEDIUM_NOT_PRESENT) " - "alloc_len:%d", alloc_len); - - task = scsi_cdb_serviceactionin16(SCSI_READCAPACITY16, alloc_len); - if (task == NULL) { - logging(LOG_NORMAL, "[FAILED] Failed to send READCAPACITY16 command: %s", - iscsi_get_error(iscsi)); - return -1; - } - task = iscsi_scsi_command_sync(iscsi, lun, task, NULL); - if (task == NULL) { - logging(LOG_NORMAL, "[FAILED] Failed to send READCAPACITY16 command: %s", - iscsi_get_error(iscsi)); - return -1; - } - if (task->status == SCSI_STATUS_CHECK_CONDITION - && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST - && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) { + ret = check_result("READCAPACITY16", iscsi, task, status, key, ascq, num_ascq); + if (task) { scsi_free_scsi_task(task); - if (sbc3_support) { - logging(LOG_NORMAL, "[FAILED] READCAPACITY16 is not available but the device claims SBC-3 support."); - return -1; - } else { - logging(LOG_NORMAL, "[SKIPPED] READCAPACITY16 is not implemented and SBC-3 is not claimed."); - return -2; - } } - if (task->status == SCSI_STATUS_GOOD) { - logging(LOG_NORMAL, "[FAILED] READCAPACITY16 command successful. But should have failed with NOT_READY/MEDIUM_NOT_PRESENT*"); - scsi_free_scsi_task(task); - return -1; - } - if (task->status != SCSI_STATUS_CHECK_CONDITION - || task->sense.key != SCSI_SENSE_NOT_READY - || (task->sense.ascq != SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT - && task->sense.ascq != SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT_TRAY_OPEN - && task->sense.ascq != SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT_TRAY_CLOSED)) { - logging(LOG_NORMAL, "[FAILED] READCAPACITY16 Should have failed " - "with NOT_READY/MEDIUM_NOT_PRESENT* But failed " - "with %s", iscsi_get_error(iscsi)); - scsi_free_scsi_task(task); - return -1; - } - - scsi_free_scsi_task(task); - logging(LOG_VERBOSE, "[OK] READCAPACITY16 returned MEDIUM_NOT_PRESENT."); - return 0; + return ret; } int diff --git a/test-tool/iscsi-support.h b/test-tool/iscsi-support.h index dc40b03..4bbb2a3 100644 --- a/test-tool/iscsi-support.h +++ b/test-tool/iscsi-support.h @@ -267,10 +267,8 @@ struct scsi_task *read10_task(struct iscsi_context *iscsi, int lun, uint32_t lba int read10(struct iscsi_context *iscsi, int lun, uint32_t lba, uint32_t datalen, int blocksize, int rdprotect, int dpo, int fua, int fua_nv, int group, unsigned char *data, int status, enum scsi_sense_key key, int *ascq, int num_ascq); int read12(struct iscsi_context *iscsi, int lun, uint32_t lba, uint32_t datalen, int blocksize, int rdprotect, int dpo, int fua, int fua_nv, int group, unsigned char *data, int status, enum scsi_sense_key key, int *ascq, int num_ascq); int read16(struct iscsi_context *iscsi, int lun, uint64_t lba, uint32_t datalen, int blocksize, int rdprotect, int dpo, int fua, int fua_nv, int group, unsigned char *data, int status, enum scsi_sense_key key, int *ascq, int num_ascq); -int readcapacity10(struct iscsi_context *iscsi, int lun, uint32_t lba, int pmi); -int readcapacity10_nomedium(struct iscsi_context *iscsi, int lun, uint32_t lba, int pmi); -int readcapacity16(struct iscsi_context *iscsi, int lun, int alloc_len); -int readcapacity16_nomedium(struct iscsi_context *iscsi, int lun, int alloc_len); +int readcapacity10(struct iscsi_context *iscsi, int lun, uint32_t lba, int pmi, int status, enum scsi_sense_key key, int *ascq, int num_ascq); +int readcapacity16(struct iscsi_context *iscsi, int lun, int alloc_len, int status, enum scsi_sense_key key, int *ascq, int num_ascq); int report_supported_opcodes(struct iscsi_context *iscsi, int lun, int rctd, int options, int opcode, int sa, int alloc_len, struct scsi_task **save_task); int report_supported_opcodes_invalidfieldincdb(struct iscsi_context *iscsi, int lun, int rctd, int options, int opcode, int sa, int alloc_len, struct scsi_task **save_task); int release6(struct iscsi_context *iscsi, int lun); diff --git a/test-tool/test_mandatory_sbc.c b/test-tool/test_mandatory_sbc.c index 987ec07..77e4adb 100644 --- a/test-tool/test_mandatory_sbc.c +++ b/test-tool/test_mandatory_sbc.c @@ -41,12 +41,14 @@ test_mandatory_sbc(void) CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test READCAPACITY10."); - ret = readcapacity10(iscsic, tgt_lun, 0, 0); + ret = readcapacity10(iscsic, tgt_lun, 0, 0, + EXPECT_STATUS_GOOD); CU_ASSERT_EQUAL(ret, 0); if (sbc3_support) { logging(LOG_VERBOSE, "Test READCAPACITY16. The device claims SBC-3 support."); - ret = readcapacity16(iscsic, tgt_lun, 15); + ret = readcapacity16(iscsic, tgt_lun, 15, + EXPECT_STATUS_GOOD); CU_ASSERT_EQUAL(ret, 0); } diff --git a/test-tool/test_nomedia_sbc.c b/test-tool/test_nomedia_sbc.c index a19f138..82c6987 100644 --- a/test-tool/test_nomedia_sbc.c +++ b/test-tool/test_nomedia_sbc.c @@ -91,11 +91,13 @@ test_nomedia_sbc(void) CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test READCAPACITY10 when medium is ejected."); - ret = readcapacity10_nomedium(iscsic, tgt_lun, 0, 0); + ret = readcapacity10(iscsic, tgt_lun, 0, 0, + EXPECT_NO_MEDIUM); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test READCAPACITY16 when medium is ejected."); - ret = readcapacity16_nomedium(iscsic, tgt_lun, 15); + ret = readcapacity16(iscsic, tgt_lun, 15, + EXPECT_NO_MEDIUM); if (ret == -2) { if (sbc3_support) { logging(LOG_NORMAL, "[FAILED] READCAPACITY16 is not available but the device claims SBC-3 support."); diff --git a/test-tool/test_readcapacity10_simple.c b/test-tool/test_readcapacity10_simple.c index abfcbaf..8a2d52f 100644 --- a/test-tool/test_readcapacity10_simple.c +++ b/test-tool/test_readcapacity10_simple.c @@ -1,4 +1,3 @@ - /* Copyright (C) 2013 by Ronnie Sahlberg @@ -35,6 +34,7 @@ test_readcapacity10_simple(void) logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test basic READCAPACITY10"); - ret = readcapacity10(iscsic, tgt_lun, 0, 0); + ret = readcapacity10(iscsic, tgt_lun, 0, 0, + EXPECT_STATUS_GOOD); CU_ASSERT_EQUAL(ret, 0); } diff --git a/test-tool/test_readcapacity16_alloclen.c b/test-tool/test_readcapacity16_alloclen.c index 17b275e..6587e39 100644 --- a/test-tool/test_readcapacity16_alloclen.c +++ b/test-tool/test_readcapacity16_alloclen.c @@ -35,7 +35,8 @@ test_readcapacity16_alloclen(void) logging(LOG_VERBOSE, "Test that READCAPACITY16 with alloc_len 0-15 is not an error"); for (i = 0; i < 16; i++) { - ret = readcapacity16(iscsic, tgt_lun, i); + ret = readcapacity16(iscsic, tgt_lun, i, + EXPECT_STATUS_GOOD); if (ret == -2) { logging(LOG_NORMAL, "[SKIPPED] READCAPACITY16 is not implemented on this target and it does not claim SBC-3 support."); CU_PASS("READCAPACITY16 is not implemented and no SBC-3 support claimed."); diff --git a/test-tool/test_readcapacity16_simple.c b/test-tool/test_readcapacity16_simple.c index 82b4348..fb7ce4d 100644 --- a/test-tool/test_readcapacity16_simple.c +++ b/test-tool/test_readcapacity16_simple.c @@ -34,7 +34,8 @@ test_readcapacity16_simple(void) logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test that READCAPACITY16 works"); - ret = readcapacity16(iscsic, tgt_lun, 16); + ret = readcapacity16(iscsic, tgt_lun, 16, + EXPECT_STATUS_GOOD); if (ret == -2) { logging(LOG_NORMAL, "[SKIPPED] READCAPACITY16 is not implemented on this target and it does not claim support."); CU_PASS("READCAPACITY16 is not implemented and no SBC-3 support claimed.");