test-tool: add prin_read_keys() allocation_len parameter

Accepting an Allocation Length parameter allows us to test for
truncation of response data, as per SPC5r17 4.2.5.6:
  The device server shall terminate transfers to the Data-In Buffer when
  the number of bytes or blocks specified by the ALLOCATION LENGTH field
  have been transferred or when all available data have been
  transferred, whichever is less.

With this change, all existing prin_read_keys() callers continue to use
same ALLOCATION LENGTH value as earlier (16K).

Signed-off-by: David Disseldorp <ddiss@suse.de>
This commit is contained in:
David Disseldorp
2018-05-31 22:49:04 +02:00
parent 58642c6d72
commit 31ab1e1ac9
7 changed files with 16 additions and 14 deletions

View File

@@ -667,17 +667,18 @@ prin_task(struct scsi_device *sdev, int service_action,
}
int
prin_read_keys(struct scsi_device *sdev, struct scsi_task **tp,
struct scsi_persistent_reserve_in_read_keys **rkp)
prin_read_keys(struct scsi_device *sdev,
struct scsi_task **tp,
struct scsi_persistent_reserve_in_read_keys **rkp,
uint16_t allocation_len)
{
const int buf_sz = 16384;
struct scsi_persistent_reserve_in_read_keys *rk = NULL;
logging(LOG_VERBOSE, "Send PRIN/READ_KEYS");
*tp = scsi_cdb_persistent_reserve_in(SCSI_PERSISTENT_RESERVE_READ_KEYS,
buf_sz);
allocation_len);
assert(*tp != NULL);
*tp = send_scsi_command(sdev, *tp, NULL);

View File

@@ -822,7 +822,8 @@ int all_zero(const unsigned char *buf, unsigned size);
int prin_task(struct scsi_device *sdev, int service_action,
int success_expected);
int prin_read_keys(struct scsi_device *sdev, struct scsi_task **tp,
struct scsi_persistent_reserve_in_read_keys **rkp);
struct scsi_persistent_reserve_in_read_keys **rkp,
uint16_t allocation_len);
int prout_register_and_ignore(struct scsi_device *sdev,
unsigned long long key);
int prout_register_key(struct scsi_device *sdev,

View File

@@ -1069,7 +1069,7 @@ static int clear_pr(struct scsi_device *sdev)
struct scsi_persistent_reserve_in_read_keys *rk;
res = 0;
if (prin_read_keys(sdev, &pr_task, &rk) != 0)
if (prin_read_keys(sdev, &pr_task, &rk, 16384) != 0)
goto out;
res = -1;

View File

@@ -37,7 +37,7 @@ test_prin_read_keys_simple(void)
logging(LOG_VERBOSE, LOG_BLANK_LINE);
logging(LOG_VERBOSE, "Test Persistent Reserve IN READ_KEYS works.");
ret = prin_read_keys(sd, &task, NULL);
ret = prin_read_keys(sd, &task, NULL, 16384);
if (ret == -2) {
CU_PASS("PERSISTENT RESERVE IN is not implemented.");
return;

View File

@@ -38,11 +38,11 @@ test_prin_serviceaction_range(void)
logging(LOG_VERBOSE, "Test Persistent Reserve IN Serviceaction range.");
/* verify PRIN/READ_KEYS works -- XXX redundant -- remove this? */
ret = prin_read_keys(sd, &task, NULL);
ret = prin_read_keys(sd, &task, NULL, 16384);
if (ret == -2) {
CU_PASS("PERSISTENT RESERVE IN is not implemented.");
return;
}
}
CU_ASSERT_EQUAL(ret, 0);
/* verify that PRIN/SA={0,1,2,3} works ... */

View File

@@ -45,10 +45,10 @@ test_prout_clear_simple(void)
if (ret == -2) {
CU_PASS("PERSISTENT RESERVE OUT is not implemented.");
return;
}
}
CU_ASSERT_EQUAL(ret, 0);
ret = prin_read_keys(sd, &tsk, &rk);
ret = prin_read_keys(sd, &tsk, &rk, 16384);
CU_ASSERT_EQUAL(ret, 0);
CU_ASSERT_NOT_EQUAL(rk, NULL);
if (!rk)
@@ -78,7 +78,7 @@ test_prout_clear_simple(void)
ret = prin_verify_not_reserved(sd);
CU_ASSERT_EQUAL(ret, 0);
ret = prin_read_keys(sd, &tsk, &rk);
ret = prin_read_keys(sd, &tsk, &rk, 16384);
CU_ASSERT_EQUAL(ret, 0);
CU_ASSERT_NOT_EQUAL(rk, NULL);
if (!rk)

View File

@@ -78,7 +78,7 @@ test_prout_preempt_rm_reg(void)
CU_ASSERT_EQUAL(ret, 0);
/* confirm that k1 and k2 are registered */
ret = prin_read_keys(sd, &tsk, &rk);
ret = prin_read_keys(sd, &tsk, &rk, 16384);
CU_ASSERT_EQUAL_FATAL(ret, 0);
CU_ASSERT_EQUAL(rk->num_keys, 2);
@@ -99,7 +99,7 @@ test_prout_preempt_rm_reg(void)
ret = test_iscsi_tur_until_good(sd2, &num_uas);
CU_ASSERT_EQUAL(ret, 0);
ret = prin_read_keys(sd, &tsk, &rk);
ret = prin_read_keys(sd, &tsk, &rk, 16384);
CU_ASSERT_EQUAL_FATAL(ret, 0);
CU_ASSERT_EQUAL(rk->num_keys, 1);