From b908bdeb99c2cc40e6f4ece6a093f3de2afa8fd7 Mon Sep 17 00:00:00 2001 From: Sitsofe Wheeler Date: Mon, 30 May 2016 12:25:03 +0100 Subject: [PATCH] Tests: WRITESAME 0-blocks fixes and improvements The current WRITE SAME (WS) 0 blocks test at LBA 0 isn't always correct because if: - The target's WSNZ bit set is 0 - The target's MAXIMUM WRITE SAME LENGTH (MWSL) is greater than 0 - We are issuing a WS with a NUMBER OF LOGICAL BLOCKS of 0 then whether the command should return success or failure depends on whether the starting LBA is within MWSL blocks of the end of the LUN (see http://www.t10.org/pipermail/t10/2016-May/017988.html for details). Replace the vestigial code which tried to handle this (but no longer worked since commit 8585e4509b72c9d1e8f814d67d53847a75c6a535 ) and add some additional MAXIMUM WRITE SAME LENGTH tests. Signed-off-by: Sitsofe Wheeler --- test-tool/iscsi-support.h | 10 ++++++ test-tool/test_writesame10_0blocks.c | 46 ++++++++++++++++++++-------- test-tool/test_writesame16_0blocks.c | 46 ++++++++++++++++++++-------- 3 files changed, 76 insertions(+), 26 deletions(-) diff --git a/test-tool/iscsi-support.h b/test-tool/iscsi-support.h index 1eda288..d6d35ed 100644 --- a/test-tool/iscsi-support.h +++ b/test-tool/iscsi-support.h @@ -181,6 +181,16 @@ do { \ } \ } while (0); +#define CHECK_SIZE(_min_blocks, _c) \ + do { \ + if (num_blocks < _min_blocks) { \ + logging(LOG_VERBOSE, "[SKIPPED] " \ + "LUN too small. Skipping assert"); \ + } else { \ + _c \ + } \ + } while (0); + #define COMPAREANDWRITE(...) \ do { \ int _r; \ diff --git a/test-tool/test_writesame10_0blocks.c b/test-tool/test_writesame10_0blocks.c index 929f1d9..cfbb064 100644 --- a/test-tool/test_writesame10_0blocks.c +++ b/test-tool/test_writesame10_0blocks.c @@ -24,11 +24,10 @@ #include "scsi-lowlevel.h" #include "iscsi-test-cu.h" + void test_writesame10_0blocks(void) { - int ret; - CHECK_FOR_DATALOSS; CHECK_FOR_SBC; @@ -54,18 +53,39 @@ test_writesame10_0blocks(void) return; } - ret = writesame10(sd, 0, - block_size, 0, 0, 0, 0, 0, scratch, - EXPECT_STATUS_GOOD); - if (ret == -2) { - CU_PASS("[SKIPPED] Target does not support WRITESAME10. Skipping test"); - return; - } else if (ret == -3) { - CU_PASS("[SKIPPED] Target does not support WRITESAME10 with NUMBER OF LOGICAL BLOCKS == 0"); - } else if (ret == -4) { - CU_PASS("[SKIPPED] Number of WRITESAME10 logical blocks to be written exceeds MAXIMUM WRITE SAME LENGTH"); + if (inq_bl->max_ws_len > 0 && num_blocks >= inq_bl->max_ws_len) { + WRITESAME10(sd, 0, block_size, 0, 0, 0, 0, 0, scratch, + EXPECT_INVALID_FIELD_IN_CDB); } else { - CU_ASSERT_EQUAL(ret, 0); + WRITESAME10(sd, 0, block_size, 0, 0, 0, 0, 0, scratch, + EXPECT_STATUS_GOOD); + } + + if (inq_bl->max_ws_len > 0) { + logging(LOG_VERBOSE, + "Test WRITESAME10 at MAXIMUM WRITE SAME LENGTH + 1 blocks " + "from end-of-LUN"); + CHECK_SIZE((inq_bl->max_ws_len + 1), + WRITESAME10(sd, num_blocks - (inq_bl->max_ws_len + 1), + block_size, 0, 0, 0, 0, 0, scratch, + EXPECT_INVALID_FIELD_IN_CDB)); + logging(LOG_VERBOSE, + "Test WRITESAME10 at MAXIMUM WRITE SAME LENGTH blocks " + "from end-of-LUN"); + CHECK_SIZE(inq_bl->max_ws_len, + WRITESAME10(sd, num_blocks - inq_bl->max_ws_len, + block_size, 0, 0, 0, 0, 0, scratch, + EXPECT_STATUS_GOOD)); + logging(LOG_VERBOSE, + "Test WRITESAME10 at MAXIMUM WRITE SAME LENGTH - 1 blocks " + "from end-of-LUN"); + CHECK_SIZE((inq_bl->max_ws_len - 1), + WRITESAME10(sd, num_blocks - (inq_bl->max_ws_len - 1), + block_size, 0, 0, 0, 0, 0, scratch, + EXPECT_STATUS_GOOD)); + } else { + logging(LOG_VERBOSE, "[SKIPPING] No MAXIMUM WRITE SAME LENGTH - " + "skipping MAXIMUM WRITE SAME LENGTH asserts."); } logging(LOG_VERBOSE, "Test WRITESAME10 0-blocks one block past end-of-LUN"); diff --git a/test-tool/test_writesame16_0blocks.c b/test-tool/test_writesame16_0blocks.c index 4eef6aa..adc56a5 100644 --- a/test-tool/test_writesame16_0blocks.c +++ b/test-tool/test_writesame16_0blocks.c @@ -27,8 +27,6 @@ void test_writesame16_0blocks(void) { - int ret; - CHECK_FOR_DATALOSS; CHECK_FOR_SBC; @@ -49,18 +47,40 @@ test_writesame16_0blocks(void) return; } - ret = writesame16(sd, 0, block_size, 0, 0, 0, 0, 0, scratch, - EXPECT_STATUS_GOOD); - if (ret == -2) { - logging(LOG_NORMAL, "[SKIPPED] WRITESAME16 is not implemented."); - CU_PASS("[SKIPPED] Target does not support WRITESAME16. Skipping test"); - return; - } else if (ret == -3) { - CU_PASS("[SKIPPED] Target does not support WRITESAME16 with NUMBER OF LOGICAL BLOCKS == 0"); - } else if (ret == -4) { - CU_PASS("[SKIPPED] Number of WRITESAME16 logical blocks to be written exceeds MAXIMUM WRITE SAME LENGTH"); + + if (inq_bl->max_ws_len > 0 && num_blocks >= inq_bl->max_ws_len) { + WRITESAME16(sd, 0, block_size, 0, 0, 0, 0, 0, scratch, + EXPECT_INVALID_FIELD_IN_CDB); } else { - CU_ASSERT_EQUAL(ret, 0); + WRITESAME16(sd, 0, block_size, 0, 0, 0, 0, 0, scratch, + EXPECT_STATUS_GOOD); + } + + if (inq_bl->max_ws_len > 0) { + logging(LOG_VERBOSE, + "Test WRITESAME16 at MAXIMUM WRITE SAME LENGTH + 1 blocks " + "from end-of-LUN"); + CHECK_SIZE((inq_bl->max_ws_len + 1), + WRITESAME16(sd, num_blocks - (inq_bl->max_ws_len + 1), + block_size, 0, 0, 0, 0, 0, scratch, + EXPECT_INVALID_FIELD_IN_CDB)); + logging(LOG_VERBOSE, + "Test WRITESAME16 at MAXIMUM WRITE SAME LENGTH blocks " + "from end-of-LUN"); + CHECK_SIZE(inq_bl->max_ws_len, + WRITESAME16(sd, num_blocks - inq_bl->max_ws_len, + block_size, 0, 0, 0, 0, 0, scratch, + EXPECT_STATUS_GOOD)); + logging(LOG_VERBOSE, + "Test WRITESAME16 at MAXIMUM WRITE SAME LENGTH - 1 blocks " + "from end-of-LUN"); + CHECK_SIZE((inq_bl->max_ws_len - 1), + WRITESAME16(sd, num_blocks - (inq_bl->max_ws_len - 1), + block_size, 0, 0, 0, 0, 0, scratch, + EXPECT_STATUS_GOOD)); + } else { + logging(LOG_VERBOSE, "[SKIPPING] No MAXIMUM WRITE SAME LENGTH - " + "skipping MAXIMUM WRITE SAME LENGTH asserts."); } logging(LOG_VERBOSE, "Test WRITESAME16 0-blocks one block past end-of-LUN");