From 0cfc593bbd4e2e0686d8564c1a52fba212ea9257 Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Mon, 21 Sep 2015 15:11:37 +0200 Subject: [PATCH 1/5] test/multipath: add helper to obtain secondary sessions A number of existing tests create a secondary iSCSI session by logging into the target specified in the base sd during the test. With multipath sessions now connected during iscsi-test-cu startup (when launched with multiple URIs), secondary sessions can be provided via multipath when available, rather than reconnecting. This change adds a helper that conditionally returns the secondary multipath device if available, or falls back to creating a new session via the base sd target details. Signed-off-by: David Disseldorp --- test-tool/iscsi-multipath.c | 57 +++++++++++++++++++++++++++++++++++++ test-tool/iscsi-multipath.h | 4 +++ 2 files changed, 61 insertions(+) diff --git a/test-tool/iscsi-multipath.c b/test-tool/iscsi-multipath.c index d691ed3..3058ba8 100644 --- a/test-tool/iscsi-multipath.c +++ b/test-tool/iscsi-multipath.c @@ -32,6 +32,7 @@ #include #include #include +#include #ifdef HAVE_SG_IO #include @@ -385,3 +386,59 @@ mpath_count_iscsi(int num_sds, return found; } + +/* + * use an existing multi-path connection, or clone iscsi sd1. + */ +int +mpath_sd2_get_or_clone(struct scsi_device *sd1, struct scsi_device **_sd2) +{ + struct scsi_device *sd2; + + if (mp_num_sds > 1) { + logging(LOG_VERBOSE, "using multipath dev for second session"); + *_sd2 = mp_sds[1]; + return 0; + } + + if (sd1->iscsi_ctx == NULL) { + logging(LOG_NORMAL, "can't clone non-iscsi device"); + return -EINVAL; + } + + logging(LOG_VERBOSE, "cloning sd1 for second session"); + sd2 = malloc(sizeof(*sd2)); + if (sd2 == NULL) { + return -ENOMEM; + } + + memset(sd2, 0, sizeof(*sd2)); + sd2->iscsi_url = sd1->iscsi_url; + sd2->iscsi_lun = sd1->iscsi_lun; + sd2->iscsi_ctx = iscsi_context_login(initiatorname2, sd2->iscsi_url, + &sd2->iscsi_lun); + if (sd2->iscsi_ctx == NULL) { + logging(LOG_VERBOSE, "Failed to login to target"); + free(sd2); + return -ENOMEM; + } + *_sd2 = sd2; + + return 0; +} + +void +mpath_sd2_put(struct scsi_device *sd2) +{ + if (mp_num_sds > 1) { + if (sd2 != mp_sds[1]) { + logging(LOG_NORMAL, "Invalid sd2!"); + } + return; + } + + /* sd2 was allocated by mp_get - cleanup */ + iscsi_logout_sync(sd2->iscsi_ctx); + iscsi_destroy_context(sd2->iscsi_ctx); + free(sd2); +} diff --git a/test-tool/iscsi-multipath.h b/test-tool/iscsi-multipath.h index 2fcd6ea..7fd6187 100644 --- a/test-tool/iscsi-multipath.h +++ b/test-tool/iscsi-multipath.h @@ -30,6 +30,10 @@ mpath_check_matching_ids(int num_sds, int mpath_count_iscsi(int num_sds, struct scsi_device **sds); +int +mpath_sd2_get_or_clone(struct scsi_device *sd1, struct scsi_device **_sd2); +void +mpath_sd2_put(struct scsi_device *sd2); #define MPATH_SKIP_IF_UNAVAILABLE(_sds, _num_sds) \ do { \ From 89c1749ae7b62b2dd6d83996c036377d8c14f4f1 Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Mon, 21 Sep 2015 15:40:18 +0200 Subject: [PATCH 2/5] test/reserve6: use multipath session if available Many tests currently reconnect to the base sd for multi-initiator testing. Use the secondary multipath device instead, if available. Signed-off-by: David Disseldorp --- test-tool/test_reserve6_2initiators.c | 31 ++++++++------------- test-tool/test_reserve6_itnexus_loss.c | 23 ++++++--------- test-tool/test_reserve6_logout.c | 23 ++++++--------- test-tool/test_reserve6_target_cold_reset.c | 21 +++++--------- test-tool/test_reserve6_target_warm_reset.c | 22 +++++---------- 5 files changed, 41 insertions(+), 79 deletions(-) diff --git a/test-tool/test_reserve6_2initiators.c b/test-tool/test_reserve6_2initiators.c index 1e4bd60..66f1fec 100644 --- a/test-tool/test_reserve6_2initiators.c +++ b/test-tool/test_reserve6_2initiators.c @@ -23,16 +23,13 @@ #include "scsi-lowlevel.h" #include "iscsi-support.h" #include "iscsi-test-cu.h" - +#include "iscsi-multipath.h" void test_reserve6_2initiators(void) { int ret; - struct scsi_device sd2; - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; + struct scsi_device *sd2; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test RESERVE6/RELEASE6 across two initiators"); @@ -59,21 +56,16 @@ test_reserve6_2initiators(void) ret = reserve6(sd); CU_ASSERT_EQUAL(ret, 0); - - logging(LOG_VERBOSE, "Create a second connection to the target"); - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); logging(LOG_NORMAL, "Try to take out a RESERVE6 from the second initiator"); - ret = reserve6_conflict(&sd2); + ret = reserve6_conflict(sd2); CU_ASSERT_EQUAL(ret, 0); logging(LOG_NORMAL, "Try to RELEASE from the second initiator. Should be a nop"); - ret = release6(&sd2); + ret = release6(sd2); CU_ASSERT_EQUAL(ret, 0); @@ -83,12 +75,12 @@ test_reserve6_2initiators(void) CU_ASSERT_EQUAL(ret, 0); logging(LOG_NORMAL, "MODE SENSE should fail from the second initiator"); - ret = modesense6(&sd2, NULL, 0, SCSI_MODESENSE_PC_CURRENT, SCSI_MODEPAGE_RETURN_ALL_PAGES, 0, 255, + ret = modesense6(sd2, NULL, 0, SCSI_MODESENSE_PC_CURRENT, SCSI_MODEPAGE_RETURN_ALL_PAGES, 0, 255, EXPECT_RESERVATION_CONFLICT); logging(LOG_NORMAL, "RESERVE6 from the second initiator should still fail"); - ret = reserve6_conflict(&sd2); + ret = reserve6_conflict(sd2); CU_ASSERT_EQUAL(ret, 0); logging(LOG_NORMAL, "RELEASE6 from the first initiator"); @@ -96,13 +88,12 @@ test_reserve6_2initiators(void) CU_ASSERT_EQUAL(ret, 0); logging(LOG_NORMAL, "RESERVE6 from the second initiator should work now"); - ret = reserve6(&sd2); + ret = reserve6(sd2); CU_ASSERT_EQUAL(ret, 0); logging(LOG_NORMAL, "RELEASE6 from the second initiator"); - ret = release6(&sd2); + ret = release6(sd2); CU_ASSERT_EQUAL(ret, 0); - iscsi_logout_sync(sd2.iscsi_ctx); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } diff --git a/test-tool/test_reserve6_itnexus_loss.c b/test-tool/test_reserve6_itnexus_loss.c index a3b5a4a..ed2be15 100644 --- a/test-tool/test_reserve6_itnexus_loss.c +++ b/test-tool/test_reserve6_itnexus_loss.c @@ -23,13 +23,13 @@ #include "scsi-lowlevel.h" #include "iscsi-support.h" #include "iscsi-test-cu.h" - +#include "iscsi-multipath.h" void test_reserve6_itnexus_loss(void) { int ret; - struct scsi_device sd2; + struct scsi_device *sd2; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test that RESERVE6 is released on it-nexus loss"); @@ -53,17 +53,11 @@ test_reserve6_itnexus_loss(void) logging(LOG_VERBOSE, "Create a second connection to the target"); - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); logging(LOG_NORMAL, "Try to take out a RESERVE6 from the second initiator"); - ret = reserve6_conflict(&sd2); + ret = reserve6_conflict(sd2); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Disconnect from the target."); @@ -80,14 +74,13 @@ test_reserve6_itnexus_loss(void) } logging(LOG_NORMAL, "RESERVE6 from the second initiator should work now"); - ret = reserve6(&sd2); + ret = reserve6(sd2); CU_ASSERT_EQUAL(ret, 0); logging(LOG_NORMAL, "RELEASE6 from the second initiator"); - ret = release6(&sd2); + ret = release6(sd2); CU_ASSERT_EQUAL(ret, 0); finished: - iscsi_logout_sync(sd2.iscsi_ctx); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } diff --git a/test-tool/test_reserve6_logout.c b/test-tool/test_reserve6_logout.c index 8c2c957..a8db854 100644 --- a/test-tool/test_reserve6_logout.c +++ b/test-tool/test_reserve6_logout.c @@ -23,13 +23,13 @@ #include "scsi-lowlevel.h" #include "iscsi-support.h" #include "iscsi-test-cu.h" - +#include "iscsi-multipath.h" void test_reserve6_logout(void) { int ret; - struct scsi_device sd2; + struct scsi_device *sd2; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test that RESERVE6 is released on logout"); @@ -53,17 +53,11 @@ test_reserve6_logout(void) logging(LOG_VERBOSE, "Create a second connection to the target"); - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); logging(LOG_NORMAL, "Try to take out a RESERVE6 from the second initiator"); - ret = reserve6_conflict(&sd2); + ret = reserve6_conflict(sd2); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Logout from target"); @@ -78,13 +72,12 @@ test_reserve6_logout(void) } logging(LOG_NORMAL, "RESERVE6 from the second initiator should work now"); - ret = reserve6(&sd2); + ret = reserve6(sd2); CU_ASSERT_EQUAL(ret, 0); logging(LOG_NORMAL, "RELEASE6 from the second initiator"); - ret = release6(&sd2); + ret = release6(sd2); CU_ASSERT_EQUAL(ret, 0); - iscsi_logout_sync(sd2.iscsi_ctx); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } diff --git a/test-tool/test_reserve6_target_cold_reset.c b/test-tool/test_reserve6_target_cold_reset.c index c7e378f..1312b5a 100644 --- a/test-tool/test_reserve6_target_cold_reset.c +++ b/test-tool/test_reserve6_target_cold_reset.c @@ -23,13 +23,13 @@ #include "scsi-lowlevel.h" #include "iscsi-support.h" #include "iscsi-test-cu.h" - +#include "iscsi-multipath.h" void test_reserve6_target_cold_reset(void) { int ret; - struct scsi_device sd2; + struct scsi_device *sd2; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test that RESERVE6 is released on target cold reset"); @@ -63,23 +63,16 @@ test_reserve6_target_cold_reset(void) sleep(3); logging(LOG_VERBOSE, "Create a second connection to the target"); - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "RESERVE6 from the second initiator should work now"); - ret = reserve6(&sd2); + ret = reserve6(sd2); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "RELEASE6 from the second initiator"); - ret = release6(&sd2); + ret = release6(sd2); CU_ASSERT_EQUAL(ret, 0); - iscsi_logout_sync(sd2.iscsi_ctx); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } diff --git a/test-tool/test_reserve6_target_warm_reset.c b/test-tool/test_reserve6_target_warm_reset.c index d2ff090..2218dec 100644 --- a/test-tool/test_reserve6_target_warm_reset.c +++ b/test-tool/test_reserve6_target_warm_reset.c @@ -23,13 +23,13 @@ #include "scsi-lowlevel.h" #include "iscsi-support.h" #include "iscsi-test-cu.h" - +#include "iscsi-multipath.h" void test_reserve6_target_warm_reset(void) { int ret; - struct scsi_device sd2; + struct scsi_device *sd2; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test that RESERVE6 is released on target warm reset"); @@ -64,24 +64,16 @@ test_reserve6_target_warm_reset(void) logging(LOG_VERBOSE, "Create a second connection to the target"); - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } - + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "RESERVE6 from the second initiator should work now"); - ret = reserve6(&sd2); + ret = reserve6(sd2); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "RELEASE6 from the second initiator"); - ret = release6(&sd2); + ret = release6(sd2); CU_ASSERT_EQUAL(ret, 0); - iscsi_logout_sync(sd2.iscsi_ctx); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } From 638d58dd577953814e01e38b5e1a9c4f23734dd1 Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Mon, 21 Sep 2015 15:47:21 +0200 Subject: [PATCH 3/5] test/prout: use multipath session if available These tests currently reconnect to the base sd for multi-initiator testing. Use the secondary multipath device instead, if available. Signed-off-by: David Disseldorp --- test-tool/test_prout_reserve_access.c | 104 ++++++++--------------- test-tool/test_prout_reserve_ownership.c | 104 ++++++++--------------- 2 files changed, 74 insertions(+), 134 deletions(-) diff --git a/test-tool/test_prout_reserve_access.c b/test-tool/test_prout_reserve_access.c index 883c292..1f1c860 100644 --- a/test-tool/test_prout_reserve_access.c +++ b/test-tool/test_prout_reserve_access.c @@ -22,7 +22,7 @@ #include "iscsi.h" #include "scsi-lowlevel.h" #include "iscsi-test-cu.h" - +#include "iscsi-multipath.h" static void verify_persistent_reserve_access(struct scsi_device *sd1, struct scsi_device *sd2, @@ -122,7 +122,8 @@ verify_persistent_reserve_access(struct scsi_device *sd1, struct scsi_device *sd void test_prout_reserve_access_ea(void) { - struct scsi_device sd2; + struct scsi_device *sd2; + int ret; if (sd->iscsi_ctx == NULL) { const char *err = "[SKIPPED] This PERSISTENT RESERVE test is " @@ -132,24 +133,19 @@ test_prout_reserve_access_ea(void) return; } - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } - verify_persistent_reserve_access(sd, &sd2, + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); + verify_persistent_reserve_access(sd, sd2, SCSI_PERSISTENT_RESERVE_TYPE_EXCLUSIVE_ACCESS, 0, 0, 0, 0); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } void test_prout_reserve_access_we(void) { - struct scsi_device sd2; + struct scsi_device *sd2; + int ret; if (sd->iscsi_ctx == NULL) { const char *err = "[SKIPPED] This PERSISTENT RESERVE test is " @@ -159,24 +155,19 @@ test_prout_reserve_access_we(void) return; } - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } - verify_persistent_reserve_access(sd, &sd2, + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); + verify_persistent_reserve_access(sd, sd2, SCSI_PERSISTENT_RESERVE_TYPE_WRITE_EXCLUSIVE, 1, 0, 1, 0); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } void test_prout_reserve_access_earo(void) { - struct scsi_device sd2; + struct scsi_device *sd2; + int ret; if (sd->iscsi_ctx == NULL) { const char *err = "[SKIPPED] This PERSISTENT RESERVE test is " @@ -186,24 +177,19 @@ test_prout_reserve_access_earo(void) return; } - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } - verify_persistent_reserve_access(sd, &sd2, + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); + verify_persistent_reserve_access(sd, sd2, SCSI_PERSISTENT_RESERVE_TYPE_EXCLUSIVE_ACCESS_REGISTRANTS_ONLY, 1, 1, 0, 0); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } void test_prout_reserve_access_wero(void) { - struct scsi_device sd2; + struct scsi_device *sd2; + int ret; if (sd->iscsi_ctx == NULL) { const char *err = "[SKIPPED] This PERSISTENT RESERVE test is " @@ -213,24 +199,19 @@ test_prout_reserve_access_wero(void) return; } - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } - verify_persistent_reserve_access(sd, &sd2, + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); + verify_persistent_reserve_access(sd, sd2, SCSI_PERSISTENT_RESERVE_TYPE_WRITE_EXCLUSIVE_REGISTRANTS_ONLY, 1, 1, 1, 0); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } void test_prout_reserve_access_eaar(void) { - struct scsi_device sd2; + struct scsi_device *sd2; + int ret; if (sd->iscsi_ctx == NULL) { const char *err = "[SKIPPED] This PERSISTENT RESERVE test is " @@ -240,24 +221,19 @@ test_prout_reserve_access_eaar(void) return; } - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } - verify_persistent_reserve_access(sd, &sd2, + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); + verify_persistent_reserve_access(sd, sd2, SCSI_PERSISTENT_RESERVE_TYPE_EXCLUSIVE_ACCESS_ALL_REGISTRANTS, 1, 1, 0, 0); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } void test_prout_reserve_access_wear(void) { - struct scsi_device sd2; + struct scsi_device *sd2; + int ret; if (sd->iscsi_ctx == NULL) { const char *err = "[SKIPPED] This PERSISTENT RESERVE test is " @@ -267,16 +243,10 @@ test_prout_reserve_access_wear(void) return; } - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } - verify_persistent_reserve_access(sd, &sd2, + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); + verify_persistent_reserve_access(sd, sd2, SCSI_PERSISTENT_RESERVE_TYPE_WRITE_EXCLUSIVE_ALL_REGISTRANTS, 1, 1, 1, 0); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } diff --git a/test-tool/test_prout_reserve_ownership.c b/test-tool/test_prout_reserve_ownership.c index 54c7638..722ade2 100644 --- a/test-tool/test_prout_reserve_ownership.c +++ b/test-tool/test_prout_reserve_ownership.c @@ -22,7 +22,7 @@ #include "iscsi.h" #include "scsi-lowlevel.h" #include "iscsi-test-cu.h" - +#include "iscsi-multipath.h" static void verify_persistent_reserve_ownership(struct scsi_device *sd1, struct scsi_device *sd2, @@ -96,7 +96,8 @@ verify_persistent_reserve_ownership(struct scsi_device *sd1, struct scsi_device void test_prout_reserve_ownership_ea(void) { - struct scsi_device sd2; + struct scsi_device *sd2; + int ret; if (sd->iscsi_ctx == NULL) { const char *err = "[SKIPPED] This PERSISTENT RESERVE test is " @@ -106,23 +107,18 @@ test_prout_reserve_ownership_ea(void) return; } - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } - verify_persistent_reserve_ownership(sd, &sd2, + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); + verify_persistent_reserve_ownership(sd, sd2, SCSI_PERSISTENT_RESERVE_TYPE_EXCLUSIVE_ACCESS, 0); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } void test_prout_reserve_ownership_we(void) { - struct scsi_device sd2; + struct scsi_device *sd2; + int ret; if (sd->iscsi_ctx == NULL) { const char *err = "[SKIPPED] This PERSISTENT RESERVE test is " @@ -132,23 +128,18 @@ test_prout_reserve_ownership_we(void) return; } - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } - verify_persistent_reserve_ownership(sd, &sd2, + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); + verify_persistent_reserve_ownership(sd, sd2, SCSI_PERSISTENT_RESERVE_TYPE_WRITE_EXCLUSIVE, 0); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } void test_prout_reserve_ownership_earo(void) { - struct scsi_device sd2; + struct scsi_device *sd2; + int ret; if (sd->iscsi_ctx == NULL) { const char *err = "[SKIPPED] This PERSISTENT RESERVE test is " @@ -158,23 +149,18 @@ test_prout_reserve_ownership_earo(void) return; } - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } - verify_persistent_reserve_ownership(sd, &sd2, + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); + verify_persistent_reserve_ownership(sd, sd2, SCSI_PERSISTENT_RESERVE_TYPE_EXCLUSIVE_ACCESS_REGISTRANTS_ONLY, 0); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } void test_prout_reserve_ownership_wero(void) { - struct scsi_device sd2; + struct scsi_device *sd2; + int ret; if (sd->iscsi_ctx == NULL) { const char *err = "[SKIPPED] This PERSISTENT RESERVE test is " @@ -184,23 +170,18 @@ test_prout_reserve_ownership_wero(void) return; } - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } - verify_persistent_reserve_ownership(sd, &sd2, + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); + verify_persistent_reserve_ownership(sd, sd2, SCSI_PERSISTENT_RESERVE_TYPE_WRITE_EXCLUSIVE_REGISTRANTS_ONLY, 0); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } void test_prout_reserve_ownership_eaar(void) { - struct scsi_device sd2; + struct scsi_device *sd2; + int ret; if (sd->iscsi_ctx == NULL) { const char *err = "[SKIPPED] This PERSISTENT RESERVE test is " @@ -210,23 +191,18 @@ test_prout_reserve_ownership_eaar(void) return; } - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } - verify_persistent_reserve_ownership(sd, &sd2, + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); + verify_persistent_reserve_ownership(sd, sd2, SCSI_PERSISTENT_RESERVE_TYPE_EXCLUSIVE_ACCESS_ALL_REGISTRANTS, 1); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } void test_prout_reserve_ownership_wear(void) { - struct scsi_device sd2; + struct scsi_device *sd2; + int ret; if (sd->iscsi_ctx == NULL) { const char *err = "[SKIPPED] This PERSISTENT RESERVE test is " @@ -236,15 +212,9 @@ test_prout_reserve_ownership_wear(void) return; } - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } - verify_persistent_reserve_ownership(sd, &sd2, + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); + verify_persistent_reserve_ownership(sd, sd2, SCSI_PERSISTENT_RESERVE_TYPE_WRITE_EXCLUSIVE_ALL_REGISTRANTS, 1); - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } From 69d9a77f14f75f795b91663ccf8302d21f93cf78 Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Mon, 21 Sep 2015 15:52:40 +0200 Subject: [PATCH 4/5] test/sanitize: use multipath session if available These tests currently reconnect to the base sd for multi-initiator testing. Use the secondary multipath device instead, if available. Signed-off-by: David Disseldorp --- test-tool/test_sanitize_readonly.c | 19 +++++++------------ test-tool/test_sanitize_reservations.c | 17 ++++++----------- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/test-tool/test_sanitize_readonly.c b/test-tool/test_sanitize_readonly.c index 1dc9b6c..263443d 100644 --- a/test-tool/test_sanitize_readonly.c +++ b/test-tool/test_sanitize_readonly.c @@ -25,6 +25,7 @@ #include "iscsi.h" #include "scsi-lowlevel.h" #include "iscsi-test-cu.h" +#include "iscsi-multipath.h" void test_sanitize_readonly(void) @@ -32,7 +33,7 @@ test_sanitize_readonly(void) int ret; struct iscsi_data data; struct scsi_command_descriptor *cd; - struct scsi_device sd2; + struct scsi_device *sd2; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test SANITIZE with READONLY devices"); @@ -49,17 +50,11 @@ test_sanitize_readonly(void) } logging(LOG_VERBOSE, "Create a second connection to the target"); - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Set Software Write Protect on the second connection"); - ret = set_swp(&sd2); + ret = set_swp(sd2); CU_ASSERT_EQUAL(ret, 0); if (ret != 0) { return; @@ -126,7 +121,7 @@ test_sanitize_readonly(void) logging(LOG_VERBOSE, "Clear Software Write Protect on the second connection"); - ret = clear_swp(&sd2); + ret = clear_swp(sd2); logging(LOG_VERBOSE, "Use TESTUNITREADY to clear unit attention on " "first connection"); @@ -134,5 +129,5 @@ test_sanitize_readonly(void) sleep(1); } - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } diff --git a/test-tool/test_sanitize_reservations.c b/test-tool/test_sanitize_reservations.c index 19f2602..ce48f6b 100644 --- a/test-tool/test_sanitize_reservations.c +++ b/test-tool/test_sanitize_reservations.c @@ -25,6 +25,7 @@ #include "iscsi.h" #include "scsi-lowlevel.h" #include "iscsi-test-cu.h" +#include "iscsi-multipath.h" void test_sanitize_reservations(void) @@ -32,7 +33,7 @@ test_sanitize_reservations(void) int ret; struct iscsi_data data; struct scsi_command_descriptor *cd; - struct scsi_device sd2; + struct scsi_device *sd2; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test SANITIZE with RESERVATIONS"); @@ -49,18 +50,12 @@ test_sanitize_reservations(void) } logging(LOG_VERBOSE, "Create a second connection to the target"); - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_url = sd->iscsi_url; - sd2.iscsi_lun = sd->iscsi_lun; - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd2.iscsi_url, &sd2.iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Take out a RESERVE6 from the second " "initiator"); - ret = reserve6(&sd2); + ret = reserve6(sd2); CU_ASSERT_EQUAL(ret, 0); @@ -117,5 +112,5 @@ test_sanitize_reservations(void) CU_ASSERT_EQUAL(ret, 0); } - iscsi_destroy_context(sd2.iscsi_ctx); + mpath_sd2_put(sd2); } From 4f55a3f5c38c03509b715abf3e695dc548921f54 Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Mon, 21 Sep 2015 15:53:31 +0200 Subject: [PATCH 5/5] test/preventallow: use multipath session if available This test currently reconnects to the base sd for multi-initiator testing. Use the secondary multipath device instead, if available. Signed-off-by: David Disseldorp --- test-tool/test_preventallow_2_itnexuses.c | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/test-tool/test_preventallow_2_itnexuses.c b/test-tool/test_preventallow_2_itnexuses.c index 40cedf2..e7fa2d3 100644 --- a/test-tool/test_preventallow_2_itnexuses.c +++ b/test-tool/test_preventallow_2_itnexuses.c @@ -23,12 +23,13 @@ #include "scsi-lowlevel.h" #include "iscsi-support.h" #include "iscsi-test-cu.h" +#include "iscsi-multipath.h" void test_preventallow_2_itnexuses(void) { int ret; - struct scsi_device sd2; + struct scsi_device *sd2; CHECK_FOR_SBC; CHECK_FOR_REMOVABLE; @@ -59,24 +60,16 @@ test_preventallow_2_itnexuses(void) CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Create a second connection to the target"); - memset(&sd2, 0, sizeof(sd2)); - sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd->iscsi_url, &sd->iscsi_lun); - if (sd2.iscsi_ctx == NULL) { - logging(LOG_VERBOSE, "Failed to login to target"); - return; - } + ret = mpath_sd2_get_or_clone(sd, &sd2); + CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Try to eject the medium on the second connection"); - ret = startstopunit(&sd2, 0, 0, 0, 0, 1, 0, + ret = startstopunit(sd2, 0, 0, 0, 0, 1, 0, EXPECT_REMOVAL_PREVENTED); CU_ASSERT_EQUAL(ret, 0); - logging(LOG_VERBOSE, "Logout the second connection from target"); - iscsi_logout_sync(sd2.iscsi_ctx); - iscsi_destroy_context(sd2.iscsi_ctx); - - + mpath_sd2_put(sd2); logging(LOG_VERBOSE, "Clear PREVENT and load medium in case target failed"); logging(LOG_VERBOSE, "Test we can clear PREVENT flag");