From 8e4e03d85d138978d67f1e8070ca22947d9bdf0a Mon Sep 17 00:00:00 2001 From: Peter Lieven Date: Wed, 13 Aug 2014 17:02:51 +0200 Subject: [PATCH 1/3] test-tool: allow get_lba_status to return provisioning type Signed-off-by: Peter Lieven --- test-tool/iscsi-support.c | 6 +++++- test-tool/iscsi-support.h | 2 +- test-tool/test_get_lba_status_simple.c | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/test-tool/iscsi-support.c b/test-tool/iscsi-support.c index be28660..5db77dd 100644 --- a/test-tool/iscsi-support.c +++ b/test-tool/iscsi-support.c @@ -1909,7 +1909,8 @@ struct scsi_task *get_lba_status_task(struct iscsi_context *iscsi, int lun, uint return task; } -int get_lba_status(struct iscsi_context *iscsi, int lun, uint64_t lba, uint32_t len) +int get_lba_status(struct iscsi_context *iscsi, int lun, uint64_t lba, uint32_t len, + enum scsi_provisioning_type *provisioning0) { struct scsi_task *task; struct scsi_get_lba_status *lbas = NULL; @@ -1954,6 +1955,9 @@ int get_lba_status(struct iscsi_context *iscsi, int lun, uint64_t lba, uint32_t scsi_free_scsi_task(task); return -1; } + if (provisioning0 != NULL) { + *provisioning0 = lbasd->provisioning; + } scsi_free_scsi_task(task); logging(LOG_VERBOSE, "[OK] GET_LBA_STATUS returned SUCCESS."); diff --git a/test-tool/iscsi-support.h b/test-tool/iscsi-support.h index 2611d23..78c41fc 100644 --- a/test-tool/iscsi-support.h +++ b/test-tool/iscsi-support.h @@ -240,7 +240,7 @@ struct scsi_task *get_lba_status_task(struct iscsi_context *iscsi, int lun, uint 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 get_lba_status(struct iscsi_context *iscsi, int lun, uint64_t lba, uint32_t len); +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); int orwrite(struct iscsi_context *iscsi, int lun, uint64_t lba, uint32_t datalen, int blocksize, int wrprotect, int dpo, int fua, int fua_nv, int group, unsigned char *data); diff --git a/test-tool/test_get_lba_status_simple.c b/test-tool/test_get_lba_status_simple.c index 702c61f..3bd9529 100644 --- a/test-tool/test_get_lba_status_simple.c +++ b/test-tool/test_get_lba_status_simple.c @@ -33,7 +33,7 @@ test_get_lba_status_simple(void) logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test GET_LBA_STATUS of 1-256 blocks at the start of the LUN"); for (i = 1; i <= 256; i++) { - ret = get_lba_status(iscsic, tgt_lun, 0, 24); + ret = get_lba_status(iscsic, tgt_lun, 0, 24, NULL); if (ret == -2) { CU_PASS("[SKIPPED] Target does not support GET_LBA_STATUS. Skipping test"); return; @@ -44,7 +44,7 @@ test_get_lba_status_simple(void) logging(LOG_VERBOSE, "Test GET_LBA_STATUS of 1-256 blocks at the end of the LUN"); for (i = 1; i <= 256; i++) { - ret = get_lba_status(iscsic, tgt_lun, num_blocks - i, 24); + ret = get_lba_status(iscsic, tgt_lun, num_blocks - i, 24, NULL); CU_ASSERT_EQUAL(ret, 0); } } From a2592bff3a2225a4554fb31870d813cf485f63ab Mon Sep 17 00:00:00 2001 From: Peter Lieven Date: Wed, 13 Aug 2014 17:55:09 +0200 Subject: [PATCH 2/3] test-tool: improve GetLBAStatus.UnmapSingle the test became nearly useless when reverting most of its contents in commit 7d96336. This patch adds some useful stuff back. While we can't check that unmapped blocks are deallocated we still can check that the blocks surrounding the unmapped area don't get dealloaced. Signed-off-by: Peter Lieven --- test-tool/test_get_lba_status_unmap_single.c | 106 ++++++++----------- 1 file changed, 43 insertions(+), 63 deletions(-) diff --git a/test-tool/test_get_lba_status_unmap_single.c b/test-tool/test_get_lba_status_unmap_single.c index b04b068..a41e7d1 100644 --- a/test-tool/test_get_lba_status_unmap_single.c +++ b/test-tool/test_get_lba_status_unmap_single.c @@ -32,10 +32,8 @@ test_get_lba_status_unmap_single(void) int ret; uint64_t i; unsigned char *buf = alloca(257 * block_size); - struct scsi_task *task_ret; struct unmap_list list[1]; - struct scsi_get_lba_status *lbas = NULL; - struct scsi_lba_status_descriptor *lbasd = NULL; + enum scsi_provisioning_type provisioning; CHECK_FOR_DATALOSS; CHECK_FOR_THIN_PROVISIONING; @@ -48,12 +46,14 @@ test_get_lba_status_unmap_single(void) "at offset 0-255"); logging(LOG_VERBOSE, "We have %d logical blocks per physical block", lbppb); - for (i = 0; i + lbppb <= 256; i += lbppb) { - logging(LOG_VERBOSE, "Write the first 257 blocks with a known " - "pattern and thus map the blocks"); - ret = write10(iscsic, tgt_lun, 0, 257 * block_size, - block_size, 0, 0, 0, 0, 0, buf); + logging(LOG_VERBOSE, "Write the first %i blocks with a known " + "pattern and thus map the blocks", 256 + lbppb); + ret = write10(iscsic, tgt_lun, 0, (256 + lbppb) * block_size, + block_size, 0, 0, 0, 0, 0, buf); + CU_ASSERT_EQUAL(ret, 0); + + for (i = 0; i + lbppb <= 256; i += lbppb) { logging(LOG_VERBOSE, "Unmap a single physical block at LBA:%" PRIu64 " (number of logical blocks: %d)", i, lbppb); list[0].lba = i; @@ -63,48 +63,35 @@ test_get_lba_status_unmap_single(void) logging(LOG_VERBOSE, "Read the status of the block at LBA:%" PRIu64, i); - task_ret = get_lba_status_task(iscsic, tgt_lun, i, 24); - if (!task_ret) { - CU_PASS("[SKIPPED] Target does not support " - "GET_LBA_STATUS. Skipping test"); + ret = get_lba_status(iscsic, tgt_lun, i, 24, NULL); + if (ret == -2) { + CU_PASS("[SKIPPED] Target does not support GET_LBA_STATUS. Skipping test"); return; } - - lbas = scsi_datain_unmarshall(task_ret); - if (lbas == NULL) { - logging(LOG_NORMAL, "[FAILED] GET_LBA_STATUS command: " - "failed to unmarschall data."); - CU_FAIL("[FAILED] GET_LBA_STATUS command: " - "failed to unmarschall data."); - scsi_free_scsi_task(task_ret); + if (ret != 0) { + CU_FAIL("[FAILED] GET_LBA_STATUS command failed"); return; } - lbasd = &lbas->descriptors[0]; - - - logging(LOG_VERBOSE, "Verify that the LBA in the first " - "descriptor matches the LBA in the CDB"); - if (lbasd->lba != i) { - logging(LOG_NORMAL, "[FAILED] GET_LBA_STATUS command: " - "LBA offset in first descriptor does not match " - "request (0x%" PRIx64 " != 0x%" PRIx64 ").", - lbasd->lba, i); - CU_FAIL("[FAILED] GET_LBA_STATUS command: " - "LBA offset in first descriptor does not match " - "the LBA in the CDB."); - scsi_free_scsi_task(task_ret); + logging(LOG_VERBOSE, "Read the status of the block at LBA:%" + PRIu64, i + lbppb); + ret = get_lba_status(iscsic, tgt_lun, i + lbppb, 24, &provisioning); + if (ret != 0) { + CU_FAIL("[FAILED] GET_LBA_STATUS command failed"); + return; + } + if (provisioning != SCSI_PROVISIONING_TYPE_MAPPED) { + CU_FAIL("[FAILED] LBA should be mapped but isn't"); return; } - scsi_free_scsi_task(task_ret); } logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test GET_LBA_STATUS for a single range of 1-255 " "blocks at offset 0"); for (i = lbppb; i + lbppb <= 256; i += lbppb) { - logging(LOG_VERBOSE, "Write the first 257 blocks with a known " - "pattern and thus map the blocks"); - ret = write10(iscsic, tgt_lun, 0, 257 * block_size, + logging(LOG_VERBOSE, "Write the first %i blocks with a known " + "pattern and thus map the blocks", (256 + lbppb)); + ret = write10(iscsic, tgt_lun, 0, (256 + lbppb) * block_size, block_size, 0, 0, 0, 0, 0, buf); logging(LOG_VERBOSE, "Unmap %" PRIu64 " blocks at LBA 0", i); @@ -113,33 +100,26 @@ test_get_lba_status_unmap_single(void) ret = unmap(iscsic, tgt_lun, 0, list, 1); CU_ASSERT_EQUAL(ret, 0); - logging(LOG_VERBOSE, "Read the status of the block at LBA 0"); - task_ret = get_lba_status_task(iscsic, tgt_lun, 0, 24); - lbas = scsi_datain_unmarshall(task_ret); - if (lbas == NULL) { - logging(LOG_NORMAL, "[FAILED] GET_LBA_STATUS command: " - "failed to unmarschall data."); - CU_FAIL("[FAILED] GET_LBA_STATUS command: " - "failed to unmarschall data."); - scsi_free_scsi_task(task_ret); - return; - } - lbasd = &lbas->descriptors[0]; - + logging(LOG_VERBOSE, "Read the status of the block at LBA:0"); - logging(LOG_VERBOSE, "Verify that the LBA in the first " - "descriptor matches the LBA in the CDB"); - if (lbasd->lba != 0) { - logging(LOG_NORMAL, "[FAILED] GET_LBA_STATUS command: " - "LBA offset in first descriptor does not match " - "request (0x%" PRIx64 " != 0x%" PRIx64 ").", - lbasd->lba, i); - CU_FAIL("[FAILED] GET_LBA_STATUS command: " - "LBA offset in first descriptor does not match " - "the LBA in the CDB."); - scsi_free_scsi_task(task_ret); + ret = get_lba_status(iscsic, tgt_lun, 0, 24, NULL); + if (ret == -2) { + CU_PASS("[SKIPPED] Target does not support GET_LBA_STATUS. Skipping test"); + return; + } + if (ret != 0) { + CU_FAIL("[FAILED] GET_LBA_STATUS command failed"); + return; + } + logging(LOG_VERBOSE, "Read the status of the block at LBA:%" PRIu64, i + 1); + ret = get_lba_status(iscsic, tgt_lun, i + 1, 24, &provisioning); + if (ret != 0) { + CU_FAIL("[FAILED] GET_LBA_STATUS command failed"); + return; + } + if (provisioning != SCSI_PROVISIONING_TYPE_MAPPED) { + CU_FAIL("[FAILED] LBA should be mapped but isn't"); return; } - scsi_free_scsi_task(task_ret); } } From f3ce5414639c6553ba763ef69320f728cf9e23da Mon Sep 17 00:00:00 2001 From: Peter Lieven Date: Wed, 13 Aug 2014 17:58:32 +0200 Subject: [PATCH 3/3] test-tool: fix GetLBAStatus.Simple exit if GetLBAStatus fails immediately exit the test. Signed-off-by: Peter Lieven --- test-tool/test_get_lba_status_simple.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/test-tool/test_get_lba_status_simple.c b/test-tool/test_get_lba_status_simple.c index 3bd9529..52b0f97 100644 --- a/test-tool/test_get_lba_status_simple.c +++ b/test-tool/test_get_lba_status_simple.c @@ -38,13 +38,19 @@ test_get_lba_status_simple(void) CU_PASS("[SKIPPED] Target does not support GET_LBA_STATUS. Skipping test"); return; } - CU_ASSERT_EQUAL(ret, 0); + if (ret != 0) { + CU_FAIL("[FAILED] GET_LBA_STATUS command failed"); + return; + } } logging(LOG_VERBOSE, "Test GET_LBA_STATUS of 1-256 blocks at the end of the LUN"); for (i = 1; i <= 256; i++) { ret = get_lba_status(iscsic, tgt_lun, num_blocks - i, 24, NULL); - CU_ASSERT_EQUAL(ret, 0); + if (ret != 0) { + CU_FAIL("[FAILED] GET_LBA_STATUS command failed"); + return; + } } }