void test_writesame10_simple(void) { int i, ret; unsigned char *buf = alloca(block_size); CHECK_FOR_DATALOSS; CHECK_FOR_SBC; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test WRITESAME10 of 1-256 blocks at the start of the LUN"); memset(buf, 0, block_size); for (i = 1; i <= 256; i++) { ret = writesame10(sd, 0, block_size, i, 0, 0, 0, 0, buf, EXPECT_STATUS_GOOD); if (ret == -2) { CU_PASS("[SKIPPED] Target does not support WRITESAME10. Skipping test"); return; } CU_ASSERT_EQUAL(ret, 0); } logging(LOG_VERBOSE, "Test WRITESAME10 of 1-256 blocks at the end of the LUN"); for (i = 1; i <= 256; i++) { ret = writesame10(sd, num_blocks - i, block_size, i, 0, 0, 0, 0, buf, EXPECT_STATUS_GOOD); CU_ASSERT_EQUAL(ret, 0); } }
void test_writesame10_unmap_vpd(void) { int ret; unsigned char *buf = alloca(block_size); logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test WRITESAME10 UNMAP availability is " "consistent with VPD settings"); CHECK_FOR_DATALOSS; CHECK_FOR_SBC; logging(LOG_VERBOSE, "Check if WRITESAME10 can be used for UNMAP."); logging(LOG_VERBOSE, "Unmap 1 block using WRITESAME10"); memset(buf, 0, block_size); ret = writesame10(sd, 0, block_size, 1, 0, 1, 0, 0, buf, EXPECT_STATUS_GOOD); if (ret != 0) { logging(LOG_VERBOSE, "WRITESAME10 UNMAP is not available. " "Verify that VPD settings reflect this."); logging(LOG_VERBOSE, "Verify that LBPWS10 is clear."); if (inq_lbp && inq_lbp->lbpws10) { logging(LOG_NORMAL, "[FAILED] WRITESAME10 UNMAP is not " "implemented but LBPWS10 is set"); CU_FAIL("[FAILED] WRITESAME10 UNMAP is unavailable but " "LBPWS10==1"); } else { logging(LOG_VERBOSE, "[SUCCESS] LBPWS10 is clear."); } } else { logging(LOG_VERBOSE, "WRITESAME10 UNMAP is available. Verify " "that VPD settings reflect this."); logging(LOG_VERBOSE, "Verify that LBPME is set."); if (rc16 && rc16->lbpme) { logging(LOG_VERBOSE, "[SUCCESS] LBPME is set."); } else { logging(LOG_NORMAL, "[FAILED] WRITESAME10 UNMAP is " "implemented but LBPME is not set"); CU_FAIL("[FAILED] UNMAP is available but LBPME==0"); } logging(LOG_VERBOSE, "Verify that LBPWS10 is set."); if (inq_lbp && inq_lbp->lbpws10) { logging(LOG_VERBOSE, "[SUCCESS] LBPWS10 is set."); } else { logging(LOG_NORMAL, "[FAILED] WRITESAME10 UNMAP is " "implemented but LBPWS10 is not set"); CU_FAIL("[FAILED] UNMAP is available but LBPWS10==0"); } } }
void test_writesame10_unmap_until_end(void) { int ret; unsigned int i; CHECK_FOR_DATALOSS; CHECK_FOR_THIN_PROVISIONING; CHECK_FOR_LBPWS10; CHECK_FOR_SBC; if (inq_bl->wsnz) { logging(LOG_NORMAL, "[SKIPPED] WRITESAME10 does not support 0-blocks."); CU_PASS("[SKIPPED] WRITESAME10 does not support 0-blocks."); return; } logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test WRITESAME10 of 1-256 blocks at the end of the LUN by setting number-of-blocks==0"); for (i = 1; i <= 256; i++) { unsigned char *buf = malloc(block_size * i); logging(LOG_VERBOSE, "Write %d blocks of 0xFF", i); memset(buf, 0xff, block_size * i); ret = write10(sd, num_blocks - i, i * block_size, block_size, 0, 0, 0, 0, 0, buf, EXPECT_STATUS_GOOD); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Unmap %d blocks using WRITESAME10", i); ret = writesame10(sd, num_blocks - i, block_size, 0, 0, 1, 0, 0, buf, EXPECT_STATUS_GOOD); CU_ASSERT_EQUAL(ret, 0); if (rc16->lbprz) { logging(LOG_VERBOSE, "LBPRZ is set. Read the unmapped " "blocks back and verify they are all zero"); logging(LOG_VERBOSE, "Read %d blocks and verify they " "are now zero", i); ret = read10(sd, NULL, num_blocks - i, i * block_size, block_size, 0, 0, 0, 0, 0, buf, EXPECT_STATUS_GOOD); CU_ASSERT(all_zeroes(buf, i * block_size)); } else { logging(LOG_VERBOSE, "LBPRZ is clear. Skip the read " "and verify zero test"); } free(buf); } }
void test_writesame10_0blocks(void) { int ret; CHECK_FOR_DATALOSS; CHECK_FOR_SBC; if (num_blocks >= 0x80000000) { CU_PASS("LUN is too big for write-beyond-eol tests with WRITESAME10. Skipping test.\n"); return; } logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test WRITESAME10 0-blocks at LBA==0"); ret = writesame10(iscsic, tgt_lun, 0, block_size, 0, 0, 0, 0, 0, NULL); if (ret == -2) { CU_PASS("[SKIPPED] Target does not support WRITESAME10. Skipping test"); return; } CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test WRITESAME10 0-blocks one block past end-of-LUN"); ret = writesame10_lbaoutofrange(iscsic, tgt_lun, num_blocks + 1, block_size, 0, 0, 0, 0, 0, NULL); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test WRITESAME10 0-blocks at LBA==2^31"); ret = writesame10_lbaoutofrange(iscsic, tgt_lun, 0x80000000, block_size, 0, 0, 0, 0, 0, NULL); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test WRITESAME10 0-blocks at LBA==-1"); ret = writesame10_lbaoutofrange(iscsic, tgt_lun, -1, block_size, 0, 0, 0, 0, 0, NULL); CU_ASSERT_EQUAL(ret, 0); }
void test_writesame10_unmap_unaligned(void) { int i, ret; unsigned char *buf = alloca(block_size); CHECK_FOR_DATALOSS; CHECK_FOR_THIN_PROVISIONING; CHECK_FOR_LBPWS10; CHECK_FOR_LBPPB_GT_1; CHECK_FOR_SBC; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test that unaligned WRITESAME10 Unmap succeeds. LBPPB==%d", lbppb); memset(buf, 0xa6, block_size); for (i = 1; i < lbppb; i++) { logging(LOG_VERBOSE, "Unmap %d blocks using WRITESAME10 at LBA:%d", lbppb - i, i); ret = writesame10(sd, i, block_size, lbppb - i, 0, 1, 0, 0, buf, EXPECT_STATUS_GOOD); CU_ASSERT_EQUAL(ret, 0); } }
void test_writesame10_0blocks(void) { int ret; unsigned char *buf = alloca(block_size); CHECK_FOR_DATALOSS; CHECK_FOR_SBC; if (num_blocks >= 0x80000000) { CU_PASS("LUN is too big for write-beyond-eol tests with WRITESAME10. Skipping test.\n"); return; } logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test WRITESAME10 0-blocks at LBA==0 (WSNZ=%d)", inq_bl->wsnz); memset(buf, 0, block_size); if (inq_bl->wsnz) { ret = writesame10(sd, 0, block_size, 0, 0, 0, 0, 0, buf, EXPECT_INVALID_FIELD_IN_CDB); logging(LOG_NORMAL, "[SKIPPED] WRITESAME16 does not support 0-blocks."); CU_ASSERT_EQUAL(ret, 0); return; } ret = writesame10(sd, 0, block_size, 0, 0, 0, 0, 0, buf, 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"); } else { CU_ASSERT_EQUAL(ret, 0); } logging(LOG_VERBOSE, "Test WRITESAME10 0-blocks one block past end-of-LUN"); ret = writesame10(sd, num_blocks + 1, block_size, 0, 0, 0, 0, 0, buf, EXPECT_LBA_OOB); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test WRITESAME10 0-blocks at LBA==2^31"); ret = writesame10(sd, 0x80000000, block_size, 0, 0, 0, 0, 0, buf, EXPECT_LBA_OOB); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test WRITESAME10 0-blocks at LBA==-1"); ret = writesame10(sd, -1, block_size, 0, 0, 0, 0, 0, buf, EXPECT_LBA_OOB); CU_ASSERT_EQUAL(ret, 0); }