void
test_prin_serviceaction_range(void)
{
	int ret = 0;
	int i;


	logging(LOG_VERBOSE, LOG_BLANK_LINE);
	logging(LOG_VERBOSE, "Test Persistent Reserve IN Serviceaction range.");

	/* verify PRIN/READ_KEYS works -- XXX redundant -- remove this? */
	ret = prin_read_keys(iscsic, tgt_lun, &task, NULL);
	if (ret == -2) {
		logging(LOG_NORMAL, "[SKIPPED] PERSISTEN RESERVE IN is not implemented.");
		CU_PASS("PERSISTENT RESERVE IN is not implemented.");
		return;
	}	
	CU_ASSERT_EQUAL(ret, 0);

	/* verify that PRIN/SA={0,1,2,3} works ... */
	for (i = 0; i < 4; i++) {
		ret = prin_task(iscsic, tgt_lun, i, 1);
		CU_ASSERT_EQUAL(ret, 0);
	}

	/*  verify that PRIN/SA={4..0x20} fails ... */
	for (i = 4; i < 0x20; i++) {
		ret = prin_task(iscsic, tgt_lun, i, 0);
		CU_ASSERT_EQUAL(ret, 0);
	}
}
void
test_prin_read_keys_simple(void)
{
	int ret = 0;
	int al;


	logging(LOG_VERBOSE, LOG_BLANK_LINE);
	logging(LOG_VERBOSE, "Test Persistent Reserve IN READ_KEYS works.");

	ret = prin_read_keys(iscsic, tgt_lun, &task, NULL);
	if (ret == -2) {
		logging(LOG_NORMAL, "[SKIPPED] PERSISTEN RESERVE IN is not implemented.");
		CU_PASS("PERSISTENT RESERVE IN is not implemented.");
		return;
	}	
	CU_ASSERT_EQUAL(ret, 0);

	logging(LOG_VERBOSE, "Test DATA-IN is at least 8 bytes.");
	if (task->datain.size < 8) {
		logging(LOG_NORMAL,
		    "[FAILED] DATA-IN returned less than 8 bytes");
		return;
	}

	logging(LOG_VERBOSE, "Test ADDITIONAL_LENGTH matches DATA_IN size.");
	al = scsi_get_uint32(&task->datain.data[4]);
	if (al != task->datain.size - 8) {
		logging(LOG_NORMAL,
		    "[FAILED] ADDITIONAL_LENGTH was %d bytes but %d was expected.",
			al, task->datain.size - 8);
		return;
	}
}
Пример #3
0
void
test_prout_clear_simple(void)
{
        int ret = 0;
        uint32_t old_gen;
        const unsigned long long key = rand_key();
        struct scsi_task *tsk;
        struct scsi_persistent_reserve_in_read_keys *rk = NULL;

        CHECK_FOR_DATALOSS;

        logging(LOG_VERBOSE, LOG_BLANK_LINE);
        logging(LOG_VERBOSE, "Test Persistent Reserve OUT CLEAR works.");

        /* register our reservation key with the target */
        ret = prout_register_and_ignore(sd, key);
        if (ret == -2) {
                CU_PASS("PERSISTENT RESERVE OUT is not implemented.");
                return;
        }
        CU_ASSERT_EQUAL(ret, 0);

        ret = prin_read_keys(sd, &tsk, &rk, 16384);
        CU_ASSERT_EQUAL(ret, 0);
        CU_ASSERT_NOT_EQUAL(rk, NULL);
        if (!rk)
                goto out;

        CU_ASSERT_NOT_EQUAL(rk->num_keys, 0);
        /* retain PR generation number to check for increments */
        old_gen = rk->prgeneration;

        scsi_free_scsi_task(tsk);
        rk = NULL;        /* freed with tsk */

        /* reserve the target */
        ret = prout_reserve(sd, key,
                            SCSI_PERSISTENT_RESERVE_TYPE_EXCLUSIVE_ACCESS);
        CU_ASSERT_EQUAL(ret, 0);

        /* verify target reservation */
        ret = prin_verify_reserved_as(sd, key,
                                SCSI_PERSISTENT_RESERVE_TYPE_EXCLUSIVE_ACCESS);
        CU_ASSERT_EQUAL(ret, 0);

        /* clear reservation and registration */
        ret = prout_clear(sd, key);
        CU_ASSERT_EQUAL(ret, 0);

        ret = prin_verify_not_reserved(sd);
        CU_ASSERT_EQUAL(ret, 0);

        ret = prin_read_keys(sd, &tsk, &rk, 16384);
        CU_ASSERT_EQUAL(ret, 0);
        CU_ASSERT_NOT_EQUAL(rk, NULL);
        if (!rk)
                goto out;

        CU_ASSERT_EQUAL(rk->num_keys, 0);
        /* generation incremented once for CLEAR (not for RESERVE) */
        CU_ASSERT_EQUAL(rk->prgeneration, old_gen + 1);

out:
        scsi_free_scsi_task(tsk);
        rk = NULL;        /* freed with tsk */
}