diff --git a/lib/connect.c b/lib/connect.c index f11d845..54cb8c8 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -457,7 +457,7 @@ int iscsi_reconnect(struct iscsi_context *iscsi) } tmp_iscsi->old_iscsi = iscsi->old_iscsi; } else { - iscsi->old_iscsi = malloc(sizeof(struct iscsi_context)); + tmp_iscsi->old_iscsi = malloc(sizeof(struct iscsi_context)); memcpy(tmp_iscsi->old_iscsi, iscsi, sizeof(struct iscsi_context)); } memcpy(iscsi, tmp_iscsi, sizeof(struct iscsi_context)); diff --git a/test-tool/iscsi-test-cu.c b/test-tool/iscsi-test-cu.c index 76a16e0..bb74990 100644 --- a/test-tool/iscsi-test-cu.c +++ b/test-tool/iscsi-test-cu.c @@ -770,6 +770,37 @@ print_usage(void) fprintf(stderr, "\n"); } +/* 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, 16384) != 0) + goto out; + + res = -1; + if (rk->num_keys && data_loss == 0) + goto out; + + res = 0; + for (i = 0; i < rk->num_keys; i++) { + res = prout_register_and_ignore(sdev, rk->keys[i]); + if (res) + break; + res = prout_register_key(sdev, 0, rk->keys[i]); + if (res) + break; + } + + scsi_free_scsi_task(pr_task); + +out: + return res; +} + void test_setup(void) { @@ -830,6 +861,7 @@ suite_cleanup(void) for (i = 0; i < mp_num_sds; i++) { if (mp_sds[i]->iscsi_url) { if (mp_sds[i]->iscsi_ctx) { + clear_pr(mp_sds[i]); iscsi_logout_sync(mp_sds[i]->iscsi_ctx); iscsi_destroy_context(mp_sds[i]->iscsi_ctx); mp_sds[i]->iscsi_ctx = NULL; @@ -1062,33 +1094,6 @@ 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, 16384) != 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[]) { @@ -1241,6 +1246,10 @@ main(int argc, char *argv[]) "Failed to connect to SCSI device %d\n", i); goto err_sds_free; } + if (clear_pr(mp_sds[i]) < 0) { + printf("One or more persistent reservations keys have been registered\n"); + return -1; + } } if (mp_num_sds > 1) { @@ -1439,11 +1448,6 @@ 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; - } - /* BLKSECTGET for /dev/sg* is a shitshow under linux. * Even 4.2 kernels return number of bytes instead of number * of sectors here. Just force it to 120k and let us get on with diff --git a/test-tool/test_prin_read_keys_truncate.c b/test-tool/test_prin_read_keys_truncate.c index 1590b33..976269c 100644 --- a/test-tool/test_prin_read_keys_truncate.c +++ b/test-tool/test_prin_read_keys_truncate.c @@ -58,15 +58,17 @@ test_prin_read_keys_truncate(void) } CU_ASSERT_EQUAL(ret, 0); - /* - * SPC5r17: 6.16.2 READ KEYS service action - * The ADDITIONAL LENGTH field indicates the number of bytes in - * the Reservation key list. The contents of the ADDITIONAL - * LENGTH field are not altered based on the allocation length. - */ - CU_ASSERT_NOT_EQUAL(rk->additional_length, 0); - /* key array should have been truncated in the response */ - CU_ASSERT_EQUAL(rk->num_keys, 0); + if (rk) { + /* + * SPC5r17: 6.16.2 READ KEYS service action + * The ADDITIONAL LENGTH field indicates the number of bytes in + * the Reservation key list. The contents of the ADDITIONAL + * LENGTH field are not altered based on the allocation length. + */ + CU_ASSERT_NOT_EQUAL(rk->additional_length, 0); + /* key array should have been truncated in the response */ + CU_ASSERT_EQUAL(rk->num_keys, 0); + } /* remove our key from the target */ ret = prout_register_key(sd, 0, key);