static void test_writesame16(void) { logging(LOG_VERBOSE, "Test WRITE_SAME16 fails with WRITE_PROTECTED"); WRITESAME16(sd, 0, block_size, 1, 0, 0, 0, 0, scratch, EXPECT_WRITE_PROTECTED); logging(LOG_VERBOSE, "Test WRITE_SAME16 UNMAP fails with " "WRITE_PROTECTED"); WRITESAME16(sd, 0, block_size, 1, 0, 1, 0, 0, NULL, EXPECT_WRITE_PROTECTED); }
void test_writesame16_unmap_until_end(void) { unsigned int i; CHECK_FOR_DATALOSS; CHECK_FOR_THIN_PROVISIONING; CHECK_FOR_LBPWS; CHECK_FOR_SBC; if (inq_bl->wsnz) { logging(LOG_NORMAL, "WRITESAME16 does not support 0-blocks." "WSNZ == 1"); memset(scratch, 0, block_size); WRITESAME16(sd, 0, block_size, 0, 0, 1, 0, 0, scratch, EXPECT_INVALID_FIELD_IN_CDB); return; } logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test WRITESAME16 of 1-256 blocks at the end of the LUN by setting number-of-blocks==0"); memset(scratch, 0xa6, 256 * block_size); for (i = 1; i <= 256; i++) { logging(LOG_VERBOSE, "Write %d blocks of 0xFF", i); memset(scratch, 0xff, block_size * i); WRITE16(sd, num_blocks - i, i * block_size, block_size, 0, 0, 0, 0, 0, scratch, EXPECT_STATUS_GOOD); logging(LOG_VERBOSE, "Unmap %d blocks using WRITESAME16", i); memset(scratch, 0, block_size); WRITESAME16(sd, num_blocks - i, block_size, 0, 0, 1, 0, 0, scratch, EXPECT_STATUS_GOOD); 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); READ16(sd, NULL, num_blocks - i, i * block_size, block_size, 0, 0, 0, 0, 0, scratch, EXPECT_STATUS_GOOD); ALL_ZERO(scratch, i * block_size); } else { logging(LOG_VERBOSE, "LBPRZ is clear. Skip the read " "and verify zero test"); } } }
void test_writesame16_wrprotect(void) { int i; /* * Try out different non-zero values for WRPROTECT. */ logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test WRITESAME16 with non-zero WRPROTECT"); CHECK_FOR_DATALOSS; CHECK_FOR_SBC; memset(scratch, 0, block_size); if (!inq->protect || (rc16 != NULL && !rc16->prot_en)) { logging(LOG_VERBOSE, "Device does not support/use protection information. All commands should fail."); for (i = 1; i < 8; i++) { WRITESAME16(sd, 0, block_size, 1, 0, 0, i, 0, scratch, EXPECT_INVALID_FIELD_IN_CDB); } return; } logging(LOG_NORMAL, "No tests for devices that support protection information yet."); }
void test_writesame16_0blocks(void) { CHECK_FOR_DATALOSS; CHECK_FOR_SBC; if (!inq_bl) { CU_PASS("BlockLimits VPD is not available. Skipping test.\n"); return; } logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test WRITESAME16 0-blocks at LBA==0 (WSNZ=%d)", inq_bl->wsnz); memset(scratch, 0, block_size); if (inq_bl->wsnz) { WRITESAME16(sd, 0, block_size, 0, 0, 0, 0, 0, scratch, EXPECT_INVALID_FIELD_IN_CDB); logging(LOG_NORMAL, "[SKIPPED] WRITESAME16 does not support 0-blocks."); return; } 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 { 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"); WRITESAME16(sd, num_blocks + 1, block_size, 0, 0, 0, 0, 0, scratch, EXPECT_LBA_OOB); logging(LOG_VERBOSE, "Test WRITESAME16 0-blocks at LBA==2^63"); WRITESAME16(sd, 0x8000000000000000ULL, block_size, 0, 0, 0, 0, 0, scratch, EXPECT_LBA_OOB); logging(LOG_VERBOSE, "Test WRITESAME16 0-blocks at LBA==-1"); WRITESAME16(sd, -1, block_size, 0, 0, 0, 0, 0, scratch, EXPECT_LBA_OOB); }