示例#1
0
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);
}