From 0e0073e818c2b6ca0e77fb5897ab146b17f04715 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Fri, 2 Oct 2015 14:37:54 -0700 Subject: [PATCH] test-tool: Clear persistent reservation keys before tests are run If a previous run of the test tool had been interrupted one or more persistent reservation keys can still be registered. This can cause tests in the new run to fail. Avoid this by clearing these keys before running any tests. Do this only if --dataloss has been specified. Signed-off-by: Bart Van Assche --- test-tool/iscsi-test-cu.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/test-tool/iscsi-test-cu.c b/test-tool/iscsi-test-cu.c index adc05e3..ae44d3c 100644 --- a/test-tool/iscsi-test-cu.c +++ b/test-tool/iscsi-test-cu.c @@ -1015,6 +1015,33 @@ static void free_scsi_device(struct scsi_device *sdev) free(sdev); } +/* Clear persistent reservations and reservation keys left by a previous run */ +static int clear_pr(struct scsi_device *sdev) +{ + int i, res; + struct scsi_task *pr_task; + struct scsi_persistent_reserve_in_read_keys *rk; + + res = 0; + if (prin_read_keys(sdev, &pr_task, &rk) != 0) + goto out; + + res = -1; + if (rk->num_keys && data_loss == 0) + goto out; + + res = 0; + for (i = 0; i < rk->num_keys; i++) { + prout_register_and_ignore(sdev, rk->keys[i]); + prout_register_key(sdev, 0, rk->keys[i]); + } + + scsi_free_scsi_task(pr_task); + +out: + return res; +} + int main(int argc, char *argv[]) { @@ -1359,6 +1386,11 @@ main(int argc, char *argv[]) } scsi_free_scsi_task(task); + if (clear_pr(sd) < 0) { + printf("One or more persistent reservations keys have been registered\n"); + return -1; + } + if (maxsectors) { maximum_transfer_length = maxsectors; printf("Bus transfer size is limited to %d blocks. Clamping "