From 46eaa7dcc388934ad7e9b5e37dbbcfed245a56dc Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Wed, 17 Sep 2014 14:38:40 -0700 Subject: [PATCH] TESTS: convert compareandwrite to new api Signed-off-by: Ronnie Sahlberg --- lib/libiscsi.def | 1 + lib/libiscsi.syms | 1 + test-tool/iscsi-support.c | 151 +++----------------- test-tool/iscsi-support.h | 4 +- test-tool/test_compareandwrite_miscompare.c | 27 ++-- test-tool/test_compareandwrite_simple.c | 23 +-- 6 files changed, 54 insertions(+), 153 deletions(-) diff --git a/lib/libiscsi.def b/lib/libiscsi.def index 5695b94..cbca74d 100644 --- a/lib/libiscsi.def +++ b/lib/libiscsi.def @@ -155,6 +155,7 @@ iscsi_writesame10_task iscsi_writesame16_sync iscsi_writesame16_task scsi_association_to_str +scsi_cdb_compareandwrite scsi_cdb_inquiry scsi_cdb_get_lba_status scsi_cdb_modeselect6 diff --git a/lib/libiscsi.syms b/lib/libiscsi.syms index 685a168..f57cc65 100644 --- a/lib/libiscsi.syms +++ b/lib/libiscsi.syms @@ -153,6 +153,7 @@ iscsi_writesame10_task iscsi_writesame16_sync iscsi_writesame16_task scsi_association_to_str +scsi_cdb_compareandwrite scsi_cdb_inquiry scsi_cdb_get_lba_status scsi_cdb_modeselect6 diff --git a/test-tool/iscsi-support.c b/test-tool/iscsi-support.c index 259a09e..2fcc0b8 100644 --- a/test-tool/iscsi-support.c +++ b/test-tool/iscsi-support.c @@ -1334,147 +1334,38 @@ int mode_sense(struct iscsi_context *iscsi, int lun) } int compareandwrite(struct iscsi_context *iscsi, int lun, uint64_t lba, - unsigned char *data, uint32_t len, int blocksize, - int wrprotect, int dpo, - int fua, int group_number) + unsigned char *data, uint32_t datalen, int blocksize, + int wrprotect, int dpo, + int fua, int group_number, + int status, enum scsi_sense_key key, int *ascq, int num_ascq) { struct scsi_task *task; + struct iscsi_data d; + int ret; - logging(LOG_VERBOSE, "Send COMPARE_AND_WRITE LBA:%" PRIu64 - " LEN:%d WRPROTECT:%d", - lba, len, wrprotect); + logging(LOG_VERBOSE, "Send COMPAREANDWRITE (Expecting %s) LBA:%" + PRIu64 " LEN:%d WRPROTECT:%d", + scsi_status_str(status), + lba, datalen, wrprotect); - task = iscsi_compareandwrite_sync(iscsi, lun, lba, - data, len, blocksize, - wrprotect, dpo, fua, 0, group_number); - if (task == NULL) { - logging(LOG_NORMAL, "[FAILED] Failed to send COMPARE_AND_WRITE " - "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) { - logging(LOG_NORMAL, "[SKIPPED] COMPARE_AND_WRITE is not " - "implemented on target"); - scsi_free_scsi_task(task); - return -2; - } - if (task->status != SCSI_STATUS_GOOD) { - logging(LOG_NORMAL, "[FAILED] COMPARE_AND_WRITE command: " - "failed with sense. %s", iscsi_get_error(iscsi)); - scsi_free_scsi_task(task); + if (!data_loss) { + printf("--dataloss flag is not set in. Skipping write\n"); return -1; } - scsi_free_scsi_task(task); - logging(LOG_VERBOSE, "[OK] COMPARE_AND_WRITE returned SUCCESS."); - return 0; -} + task = scsi_cdb_compareandwrite(lba, datalen, blocksize, wrprotect, + dpo, fua, 0, group_number); + assert(task != NULL); -int compareandwrite_miscompare(struct iscsi_context *iscsi, int lun, - uint64_t lba, unsigned char *data, - uint32_t len, int blocksize, - int wrprotect, int dpo, - int fua, int group_number) -{ - struct scsi_task *task; + d.data = data; + d.size = datalen; + task = iscsi_scsi_command_sync(iscsi, lun, task, &d); - logging(LOG_VERBOSE, "Send COMPARE_AND_WRITE LBA:%" PRIu64 - " LEN:%d WRPROTECT:%d (expecting MISCOMPARE)", - lba, len, wrprotect); - - task = iscsi_compareandwrite_sync(iscsi, lun, lba, - data, len, blocksize, - wrprotect, dpo, fua, 0, group_number); - if (task == NULL) { - logging(LOG_NORMAL, "[FAILED] Failed to send COMPARE_AND_WRITE " - "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) { - logging(LOG_NORMAL, "[SKIPPED] COMPARE_AND_WRITE is not " - "implemented on target"); + ret = check_result("COMPAREANDWRITE", iscsi, task, status, key, ascq, num_ascq); + if (task) { scsi_free_scsi_task(task); - return -2; } - if (task->status == SCSI_STATUS_GOOD) { - logging(LOG_NORMAL, "[FAILED] COMPARE_AND_WRITE successful " - "but should have failed with MISCOMPARE."); - scsi_free_scsi_task(task); - return -1; - } - - if (task->status != SCSI_STATUS_CHECK_CONDITION - || task->sense.key != SCSI_SENSE_MISCOMPARE - || task->sense.ascq != SCSI_SENSE_ASCQ_MISCOMPARE_DURING_VERIFY) { - logging(LOG_NORMAL, "[FAILED] COMPARE_AND_WRITE failed with " - "the wrong sense code. Should have failed with " - "MISCOMPARE/MISCOMPARE_DURING_VERIFY but failed with " - "sense:%s", iscsi_get_error(iscsi)); - scsi_free_scsi_task(task); - return -1; - } - - scsi_free_scsi_task(task); - logging(LOG_VERBOSE, "[OK] COMPARE_AND_WRITE returned MISCOMPARE."); - return 0; -} - -int compareandwrite_invalidfieldincdb(struct iscsi_context *iscsi, int lun, - uint64_t lba, unsigned char *data, - uint32_t len, int blocksize, - int wrprotect, int dpo, - int fua, int group_number) -{ - struct scsi_task *task; - - logging(LOG_VERBOSE, "Send COMPARE_AND_WRITE LBA:%" PRIu64 - " LEN:%d WRPROTECT:%d (expecting INVALID_FIELD_IN_CDB)", - lba, len, wrprotect); - - task = iscsi_compareandwrite_sync(iscsi, lun, lba, - data, len, blocksize, - wrprotect, dpo, fua, 0, group_number); - if (task == NULL) { - logging(LOG_NORMAL, "[FAILED] Failed to send COMPARE_AND_WRITE " - "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) { - logging(LOG_NORMAL, "[SKIPPED] COMPARE_AND_WRITE is not " - "implemented on target"); - scsi_free_scsi_task(task); - return -2; - } - if (task->status == SCSI_STATUS_GOOD) { - logging(LOG_NORMAL, "[FAILED] COMPARE_AND_WRITE successful " - "but should have failed with MISCOMPARE."); - scsi_free_scsi_task(task); - return -1; - } - - if (task->status != SCSI_STATUS_CHECK_CONDITION - || task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST - || task->sense.ascq != SCSI_SENSE_ASCQ_INVALID_FIELD_IN_CDB) { - logging(LOG_NORMAL, "[FAILED] COMPARE_AND_WRITE failed with " - "the wrong sense code. Should have failed with " - "INVALID_FIELD_IN_CDB but failed with " - "sense:%s", iscsi_get_error(iscsi)); - scsi_free_scsi_task(task); - return -1; - } - - scsi_free_scsi_task(task); - logging(LOG_VERBOSE, "[OK] COMPARE_AND_WRITE returned INVALID_FIELD_IN_CDB."); - return 0; + return ret; } struct scsi_task *get_lba_status_task(struct iscsi_context *iscsi, int lun, uint64_t lba, uint32_t len) diff --git a/test-tool/iscsi-support.h b/test-tool/iscsi-support.h index 88676bc..dc40b03 100644 --- a/test-tool/iscsi-support.h +++ b/test-tool/iscsi-support.h @@ -254,9 +254,7 @@ int verify_write_fails(struct iscsi_context *iscsi, int lun, unsigned char *buf) int inquiry(struct iscsi_context *iscsi, int lun, int evpd, int page_code, int maxsize, struct scsi_task **save_task); int inquiry_invalidfieldincdb(struct iscsi_context *iscsi, int lun, int evpd, int page_code, int maxsize); struct scsi_task *get_lba_status_task(struct iscsi_context *iscsi, int lun, uint64_t lba, uint32_t len); -int compareandwrite(struct iscsi_context *iscsi, int lun, uint64_t lba, unsigned char *data, uint32_t len, int blocksize, int wrprotect, int dpo, int fua, int group_number); -int compareandwrite_invalidfieldincdb(struct iscsi_context *iscsi, int lun, uint64_t lba, unsigned char *data, uint32_t len, int blocksize, int wrprotect, int dpo, int fua, int group_number); -int compareandwrite_miscompare(struct iscsi_context *iscsi, int lun, uint64_t lba, unsigned char *data, uint32_t len, int blocksize, int wrprotect, int dpo, int fua, int group_number); +int compareandwrite(struct iscsi_context *iscsi, int lun, uint64_t lba, unsigned char *data, uint32_t len, int blocksize, int wrprotect, int dpo, int fua, int group_number, int status, enum scsi_sense_key key, int *ascq, int num_ascq); int get_lba_status(struct iscsi_context *iscsi, int lun, uint64_t lba, uint32_t len, enum scsi_provisioning_type *provisioning0); int get_lba_status_lbaoutofrange(struct iscsi_context *iscsi, int lun, uint64_t lba, uint32_t len); int get_lba_status_nomedium(struct iscsi_context *iscsi, int lun, uint64_t lba, uint32_t len); diff --git a/test-tool/test_compareandwrite_miscompare.c b/test-tool/test_compareandwrite_miscompare.c index 750cc7c..65d4138 100644 --- a/test-tool/test_compareandwrite_miscompare.c +++ b/test-tool/test_compareandwrite_miscompare.c @@ -72,9 +72,10 @@ test_compareandwrite_miscompare(void) "BlockLimits.MaximumCompareAndWriteLength(%d). " "Command should fail with INVALID_FIELD_IN_CDB", i, maxbl); - ret = compareandwrite_invalidfieldincdb(iscsic, tgt_lun, 0, - buf, 2 * i * block_size, block_size, - 0, 0, 0, 0); + ret = compareandwrite(iscsic, tgt_lun, 0, + buf, 2 * i * block_size, + block_size, 0, 0, 0, 0, + EXPECT_INVALID_FIELD_IN_CDB); if (ret == -2) { CU_PASS("[SKIPPED] Target does not support " "COMPARE_AND_WRITE. Skipping test"); @@ -89,8 +90,10 @@ test_compareandwrite_miscompare(void) logging(LOG_VERBOSE, "Overwrite %d blocks with 'B' " "at LBA:0 (if they all contain 'A')", i); - ret = compareandwrite_miscompare(iscsic, tgt_lun, 0, - buf, 2 * i * block_size, block_size, 0, 0, 0, 0); + ret = compareandwrite(iscsic, tgt_lun, 0, + buf, 2 * i * block_size, block_size, + 0, 0, 0, 0, + EXPECT_MISCOMPARE); if (ret == -2) { CU_PASS("[SKIPPED] Target does not support " "COMPARE_AND_WRITE. Skipping test"); @@ -139,9 +142,10 @@ test_compareandwrite_miscompare(void) "BlockLimits.MaximumCompareAndWriteLength(%d). " "Command should fail with INVALID_FIELD_IN_CDB", i, maxbl); - ret = compareandwrite_invalidfieldincdb(iscsic, tgt_lun, 0, - buf, 2 * i * block_size, block_size, - 0, 0, 0, 0); + ret = compareandwrite(iscsic, tgt_lun, 0, + buf, 2 * i * block_size, + block_size, 0, 0, 0, 0, + EXPECT_INVALID_FIELD_IN_CDB); CU_ASSERT_EQUAL(ret, 0); continue; @@ -151,9 +155,10 @@ test_compareandwrite_miscompare(void) logging(LOG_VERBOSE, "Overwrite %d blocks with 'B' " "at LBA:%" PRIu64 " (if they all contain 'A')", i, num_blocks - i); - ret = compareandwrite_miscompare(iscsic, tgt_lun, - num_blocks - i, - buf, 2 * i * block_size, block_size, 0, 0, 0, 0); + ret = compareandwrite(iscsic, tgt_lun, num_blocks - i, + buf, 2 * i * block_size, block_size, + 0, 0, 0, 0, + EXPECT_MISCOMPARE); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Read %d blocks at LBA:%" PRIu64 diff --git a/test-tool/test_compareandwrite_simple.c b/test-tool/test_compareandwrite_simple.c index bcee524..5a6b346 100644 --- a/test-tool/test_compareandwrite_simple.c +++ b/test-tool/test_compareandwrite_simple.c @@ -69,9 +69,10 @@ test_compareandwrite_simple(void) "BlockLimits.MaximumCompareAndWriteLength(%d). " "Command should fail with INVALID_FIELD_IN_CDB", i, maxbl); - ret = compareandwrite_invalidfieldincdb(iscsic, tgt_lun, 0, - buf, 2 * i * block_size, block_size, - 0, 0, 0, 0); + ret = compareandwrite(iscsic, tgt_lun, 0, + buf, 2 * i * block_size, + block_size, 0, 0, 0, 0, + EXPECT_INVALID_FIELD_IN_CDB); if (ret == -2) { CU_PASS("[SKIPPED] Target does not support " "COMPARE_AND_WRITE. Skipping test"); @@ -87,8 +88,9 @@ test_compareandwrite_simple(void) logging(LOG_VERBOSE, "Overwrite %d blocks with 'B' " "at LBA:0 (if they all contain 'A')", i); ret = compareandwrite(iscsic, tgt_lun, 0, - buf, 2 * i * block_size, block_size, - 0, 0, 0, 0); + buf, 2 * i * block_size, block_size, + 0, 0, 0, 0, + EXPECT_STATUS_GOOD); if (ret == -2) { CU_PASS("[SKIPPED] Target does not support " "COMPARE_AND_WRITE. Skipping test"); @@ -134,9 +136,10 @@ test_compareandwrite_simple(void) "BlockLimits.MaximumCompareAndWriteLength(%d). " "Command should fail with INVALID_FIELD_IN_CDB", i, maxbl); - ret = compareandwrite_invalidfieldincdb(iscsic, tgt_lun, 0, - buf, 2 * i * block_size, block_size, - 0, 0, 0, 0); + ret = compareandwrite(iscsic, tgt_lun, 0, + buf, 2 * i * block_size, + block_size, 0, 0, 0, 0, + EXPECT_INVALID_FIELD_IN_CDB); CU_ASSERT_EQUAL(ret, 0); continue; @@ -147,7 +150,9 @@ test_compareandwrite_simple(void) "at LBA:%" PRIu64 " (if they all contain 'A')", i, num_blocks - i); ret = compareandwrite(iscsic, tgt_lun, num_blocks - i, - buf, 2 * i * block_size, block_size, 0, 0, 0, 0); + buf, 2 * i * block_size, block_size, + 0, 0, 0, 0, + EXPECT_STATUS_GOOD); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Read %d blocks at LBA:%" PRIu64