b43d0fa3f3
backport patches for bsc#1058770 and bsc#1077176. OBS-URL: https://build.opensuse.org/request/show/572488 OBS-URL: https://build.opensuse.org/package/show/network:ha-clustering:Factory/drbd-utils?expand=0&rev=56
109 lines
3.4 KiB
Diff
109 lines
3.4 KiB
Diff
From b5eab810ded459792c24a4bc5db5ce272ea1ee15 Mon Sep 17 00:00:00 2001
|
|
From: Philipp Reisner <philipp.reisner@linbit.com>
|
|
Date: Fri, 26 Jan 2018 16:09:01 +0100
|
|
Subject: [PATCH] v9,drbdadm,stacking: Fix setting the disk in stacked host
|
|
sections
|
|
|
|
This got broken on the long way from drbd-8.4 to 9.
|
|
---
|
|
|
|
diff --git a/user/v9/drbdadm_postparse.c b/user/v9/drbdadm_postparse.c
|
|
index 1cefd5c2..b9e90de8 100644
|
|
--- a/user/v9/drbdadm_postparse.c
|
|
+++ b/user/v9/drbdadm_postparse.c
|
|
@@ -493,9 +493,9 @@ void set_peer_in_resource(struct d_resource* res, int peer_required)
|
|
add_no_bitmap_opt(res);
|
|
}
|
|
|
|
-void set_disk_in_res(struct d_resource *res)
|
|
+void set_stacked_disk_in_res(struct d_resource *res)
|
|
{
|
|
- struct d_host_info *host;
|
|
+ struct d_host_info *host, *lower_host;
|
|
struct d_volume *a, *b;
|
|
|
|
if (res->ignore)
|
|
@@ -505,41 +505,39 @@ void set_disk_in_res(struct d_resource *res)
|
|
if (!host->lower)
|
|
continue;
|
|
|
|
- if (host->lower->ignore)
|
|
- continue;
|
|
-
|
|
- check_volume_sets_equal(res, host, host->lower->me);
|
|
- if (!config_valid)
|
|
- /* don't even bother for broken config. */
|
|
- continue;
|
|
+ for_each_host(lower_host, &host->lower->all_hosts) {
|
|
+ check_volume_sets_equal(res, host, lower_host);
|
|
+ if (!config_valid)
|
|
+ /* don't even bother for broken config. */
|
|
+ continue;
|
|
|
|
- /* volume lists are sorted on vnr */
|
|
- a = STAILQ_FIRST(&host->volumes);
|
|
- b = STAILQ_FIRST(&host->lower->me->volumes);
|
|
- while (a) {
|
|
- while (b && a->vnr > b->vnr) {
|
|
- /* Lower resource has more volumes.
|
|
- * Probably unusual, but we decided
|
|
- * that it should be legal.
|
|
- * Skip those that do not match */
|
|
- b = STAILQ_NEXT(b, link);
|
|
- }
|
|
- if (a && b && a->vnr == b->vnr) {
|
|
- if (b->device)
|
|
- m_asprintf(&a->disk, "%s", b->device);
|
|
- else
|
|
- m_asprintf(&a->disk, "/dev/drbd%u", b->device_minor);
|
|
- /* stacked implicit volumes need internal meta data, too */
|
|
- if (!a->meta_disk)
|
|
- m_asprintf(&a->meta_disk, "internal");
|
|
- if (!a->meta_index)
|
|
- m_asprintf(&a->meta_index, "internal");
|
|
- a = STAILQ_NEXT(a, link);
|
|
- b = STAILQ_NEXT(b, link);
|
|
- } else {
|
|
- /* config_invalid should have been set
|
|
- * by check_volume_sets_equal */
|
|
- assert(0);
|
|
+ a = STAILQ_FIRST(&host->volumes);
|
|
+ b = STAILQ_FIRST(&lower_host->volumes);
|
|
+ while (a) {
|
|
+ while (b && a->vnr > b->vnr) {
|
|
+ /* Lower resource has more volumes.
|
|
+ * Probably unusual, but we decided
|
|
+ * that it should be legal.
|
|
+ * Skip those that do not match */
|
|
+ b = STAILQ_NEXT(b, link);
|
|
+ }
|
|
+ if (a && b && a->vnr == b->vnr) {
|
|
+ if (b->device)
|
|
+ m_asprintf(&a->disk, "%s", b->device);
|
|
+ else
|
|
+ m_asprintf(&a->disk, "/dev/drbd%u", b->device_minor);
|
|
+ /* stacked implicit volumes need internal meta data, too */
|
|
+ if (!a->meta_disk)
|
|
+ m_asprintf(&a->meta_disk, "internal");
|
|
+ if (!a->meta_index)
|
|
+ m_asprintf(&a->meta_index, "internal");
|
|
+ a = STAILQ_NEXT(a, link);
|
|
+ b = STAILQ_NEXT(b, link);
|
|
+ } else {
|
|
+ /* config_invalid should have been set
|
|
+ * by check_volume_sets_equal */
|
|
+ assert(0);
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
@@ -1140,7 +1138,7 @@ void post_parse(struct resources *resources, enum pp_flags flags)
|
|
// Needs "me" set already
|
|
for_each_resource(res, resources)
|
|
if (res->stacked_on_one)
|
|
- set_disk_in_res(res);
|
|
+ set_stacked_disk_in_res(res);
|
|
|
|
for_each_resource(res, resources)
|
|
fixup_peer_devices(res);
|