-Index: git/user/drbdadm_adjust.c
-===================================================================
---- git.orig/user/drbdadm_adjust.c
-+++ git/user/drbdadm_adjust.c
-@@ -157,6 +157,7 @@ static int opts_equal(struct context_def
- static int addr_equal(struct d_resource* conf, struct d_resource* running)
- {
- int equal;
-+ char *peer_addr, *peer_af, *peer_port;
-
- if (conf->peer == NULL && running->peer == NULL) return 1;
- if (running->peer == NULL) return 0;
-@@ -165,16 +166,29 @@ static int addr_equal(struct d_resource*
- !strcmp(conf->me->port, running->me->port) &&
- !strcmp(conf->me->address_family, running->me->address_family);
-
-- if(conf->me->proxy)
-- equal = equal &&
-- !strcmp(conf->me->proxy->inside_addr, running->peer->address) &&
-- !strcmp(conf->me->proxy->inside_port, running->peer->port) &&
-- !strcmp(conf->me->proxy->inside_af, running->peer->address_family);
-- else
-- equal = equal && conf->peer &&
-- !strcmp(conf->peer->address, running->peer->address) &&
-- !strcmp(conf->peer->port, running->peer->port) &&
-- !strcmp(conf->peer->address_family, running->peer->address_family);
-+ if(conf->me->proxy) {
-+ peer_addr = conf->me->proxy->inside_addr;
-+ peer_port = conf->me->proxy->inside_port;
-+ peer_af = conf->me->proxy->inside_af;
-+ } else {
-+ peer_addr = conf->peer->address;
-+ peer_port = conf->peer->port;
-+ peer_af = conf->peer->address_family;
-+ }
-+
-+ equal = equal && conf->peer &&
-+ !strcmp(peer_addr, running->peer->address) &&
-+ !strcmp(peer_port, running->peer->port) &&
-+ !strcmp(peer_af, running->peer->address_family);
-+
-+ if (verbose > 2)
-+ fprintf(stderr, "Network addresses differ:\n"
-+ "\trunning: %s:%s:%s -- %s:%s:%s\n"
-+ "\t config: %s:%s:%s -- %s:%s:%s\n",
-+ running->me->address_family, running->me->address, running->me->port,
-+ running->peer->address_family, running->peer->address, running->peer->port,
-+ conf->me->address_family, conf->me->address, conf->me->port,
-+ peer_af, peer_addr, peer_port);
-
- return equal;
- }
-@@ -690,8 +704,7 @@ int adm_adjust(struct cfg_ctx *ctx)
- if (ctx->res->me->proxy && can_do_proxy)
- do_connect |= proxy_reconf(ctx, running);
-
-- if (do_connect && running)
-- do_disconnect = running->net_options != NULL;
-+ do_disconnect = do_connect && running && (running->peer || running->net_options);
-
- if (do_res_options)
- schedule_deferred_cmd(adm_set_default_res_options, ctx, "resource-options", CFG_RESOURCE);
-@@ -716,8 +729,12 @@ int adm_adjust(struct cfg_ctx *ctx)
- }
-
- if (do_connect) {
-- if (do_disconnect && ctx->res->peer)
-- schedule_deferred_cmd(adm_disconnect, ctx, "disconnect", CFG_NET_PREREQ);
-+ /* "disconnect" specifying the end-point addresses currently in-use,
-+ * before "connect"ing with the addresses currently in-config-file. */
-+ if (do_disconnect) {
-+ struct cfg_ctx tmp_ctx = { .res = running, .vol = vol, };
-+ schedule_deferred_cmd(adm_disconnect, &tmp_ctx, "disconnect", CFG_NET_PREREQ);
-+ }
- schedule_deferred_cmd(adm_connect, ctx, "connect", CFG_NET);
- do_net_options = 0;
- }
-Index: git/user/legacy/drbdadm_adjust.c
-===================================================================
---- git.orig/user/legacy/drbdadm_adjust.c
-+++ git/user/legacy/drbdadm_adjust.c
-@@ -133,6 +133,7 @@ static int opts_equal(struct d_option* c
- static int addr_equal(struct d_resource* conf, struct d_resource* running)
- {
- int equal;
-+ char *peer_addr, *peer_af, *peer_port;
-
- if (conf->peer == NULL && running->peer == NULL) return 1;
- if (running->peer == NULL) return 0;
-@@ -141,18 +142,31 @@ static int addr_equal(struct d_resource*
- !strcmp(conf->me->port, running->me->port) &&
- !strcmp(conf->me->address_family, running->me->address_family);
-
-- if(conf->me->proxy)
-- equal = equal &&
-- !strcmp(conf->me->proxy->inside_addr, running->peer->address) &&
-- !strcmp(conf->me->proxy->inside_port, running->peer->port) &&
-- !strcmp(conf->me->proxy->inside_af, running->peer->address_family);
-- else
-- equal = equal && conf->peer &&
-- !strcmp(conf->peer->address, running->peer->address) &&
-- !strcmp(conf->peer->port, running->peer->port) &&
-- !strcmp(conf->peer->address_family, running->peer->address_family);
-+ if(conf->me->proxy) {
-+ peer_addr = conf->me->proxy->inside_addr;
-+ peer_port = conf->me->proxy->inside_port;
-+ peer_af = conf->me->proxy->inside_af;
-+ } else {
-+ peer_addr = conf->peer->address;
-+ peer_port = conf->peer->port;
-+ peer_af = conf->peer->address_family;
-+ }
-+
-+ equal = equal && conf->peer &&
-+ !strcmp(peer_addr, running->peer->address) &&
-+ !strcmp(peer_port, running->peer->port) &&
-+ !strcmp(peer_af, running->peer->address_family);
-+
-+ if (verbose > 2)
-+ fprintf(stderr, "Network addresses differ:\n"
-+ "\trunning: %s:%s:%s -- %s:%s:%s\n"
-+ "\t config: %s:%s:%s -- %s:%s:%s\n",
-+ running->me->address_family, running->me->address, running->me->port,
-+ running->peer->address_family, running->peer->address, running->peer->port,
-+ conf->me->address_family, conf->me->address, conf->me->port,
-+ peer_af, peer_addr, peer_port);
-
-- return equal;
-+ return equal;
- }
-
- static int proto_equal(struct d_resource* conf, struct d_resource* running)