drbd: --dry-run option for drbdsetup net ( drbdadm -- --dry-run connect <res> )
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
8a03ae2a5b
commit
cf14c2e987
|
@ -443,13 +443,18 @@ struct p_rs_param_89 {
|
|||
char csums_alg[SHARED_SECRET_MAX];
|
||||
} __packed;
|
||||
|
||||
enum drbd_conn_flags {
|
||||
CF_WANT_LOSE = 1,
|
||||
CF_DRY_RUN = 2,
|
||||
};
|
||||
|
||||
struct p_protocol {
|
||||
struct p_header head;
|
||||
u32 protocol;
|
||||
u32 after_sb_0p;
|
||||
u32 after_sb_1p;
|
||||
u32 after_sb_2p;
|
||||
u32 want_lose;
|
||||
u32 conn_flags;
|
||||
u32 two_primaries;
|
||||
|
||||
/* Since protocol version 87 and higher. */
|
||||
|
@ -791,6 +796,7 @@ enum {
|
|||
* while this is set. */
|
||||
RESIZE_PENDING, /* Size change detected locally, waiting for the response from
|
||||
* the peer, if it changed there as well. */
|
||||
CONN_DRY_RUN, /* Expect disconnect after resync handshake. */
|
||||
};
|
||||
|
||||
struct drbd_bitmap; /* opaque for drbd_conf */
|
||||
|
|
|
@ -1668,7 +1668,7 @@ int drbd_send_sync_param(struct drbd_conf *mdev, struct syncer_conf *sc)
|
|||
int drbd_send_protocol(struct drbd_conf *mdev)
|
||||
{
|
||||
struct p_protocol *p;
|
||||
int size, rv;
|
||||
int size, cf, rv;
|
||||
|
||||
size = sizeof(struct p_protocol);
|
||||
|
||||
|
@ -1685,9 +1685,21 @@ int drbd_send_protocol(struct drbd_conf *mdev)
|
|||
p->after_sb_0p = cpu_to_be32(mdev->net_conf->after_sb_0p);
|
||||
p->after_sb_1p = cpu_to_be32(mdev->net_conf->after_sb_1p);
|
||||
p->after_sb_2p = cpu_to_be32(mdev->net_conf->after_sb_2p);
|
||||
p->want_lose = cpu_to_be32(mdev->net_conf->want_lose);
|
||||
p->two_primaries = cpu_to_be32(mdev->net_conf->two_primaries);
|
||||
|
||||
cf = 0;
|
||||
if (mdev->net_conf->want_lose)
|
||||
cf |= CF_WANT_LOSE;
|
||||
if (mdev->net_conf->dry_run) {
|
||||
if (mdev->agreed_pro_version >= 92)
|
||||
cf |= CF_DRY_RUN;
|
||||
else {
|
||||
dev_err(DEV, "--dry-run is not supported by peer");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
p->conn_flags = cpu_to_be32(cf);
|
||||
|
||||
if (mdev->agreed_pro_version >= 87)
|
||||
strcpy(p->integrity_alg, mdev->net_conf->integrity_alg);
|
||||
|
||||
|
|
|
@ -2538,6 +2538,16 @@ static enum drbd_conns drbd_sync_handshake(struct drbd_conf *mdev, enum drbd_rol
|
|||
}
|
||||
}
|
||||
|
||||
if (mdev->net_conf->dry_run || test_bit(CONN_DRY_RUN, &mdev->flags)) {
|
||||
if (hg == 0)
|
||||
dev_info(DEV, "dry-run connect: No resync, would become Connected immediately.\n");
|
||||
else
|
||||
dev_info(DEV, "dry-run connect: Would become %s, doing a %s resync.",
|
||||
drbd_conn_str(hg > 0 ? C_SYNC_SOURCE : C_SYNC_TARGET),
|
||||
abs(hg) >= 2 ? "full" : "bit-map based");
|
||||
return C_MASK;
|
||||
}
|
||||
|
||||
if (abs(hg) >= 2) {
|
||||
dev_info(DEV, "Writing the whole bitmap, full sync required after drbd_sync_handshake.\n");
|
||||
if (drbd_bitmap_io(mdev, &drbd_bmio_set_n_write, "set_n_write from sync_handshake"))
|
||||
|
@ -2585,7 +2595,7 @@ static int receive_protocol(struct drbd_conf *mdev, struct p_header *h)
|
|||
struct p_protocol *p = (struct p_protocol *)h;
|
||||
int header_size, data_size;
|
||||
int p_proto, p_after_sb_0p, p_after_sb_1p, p_after_sb_2p;
|
||||
int p_want_lose, p_two_primaries;
|
||||
int p_want_lose, p_two_primaries, cf;
|
||||
char p_integrity_alg[SHARED_SECRET_MAX] = "";
|
||||
|
||||
header_size = sizeof(*p) - sizeof(*h);
|
||||
|
@ -2598,8 +2608,14 @@ static int receive_protocol(struct drbd_conf *mdev, struct p_header *h)
|
|||
p_after_sb_0p = be32_to_cpu(p->after_sb_0p);
|
||||
p_after_sb_1p = be32_to_cpu(p->after_sb_1p);
|
||||
p_after_sb_2p = be32_to_cpu(p->after_sb_2p);
|
||||
p_want_lose = be32_to_cpu(p->want_lose);
|
||||
p_two_primaries = be32_to_cpu(p->two_primaries);
|
||||
cf = be32_to_cpu(p->conn_flags);
|
||||
p_want_lose = cf & CF_WANT_LOSE;
|
||||
|
||||
clear_bit(CONN_DRY_RUN, &mdev->flags);
|
||||
|
||||
if (cf & CF_DRY_RUN)
|
||||
set_bit(CONN_DRY_RUN, &mdev->flags);
|
||||
|
||||
if (p_proto != mdev->net_conf->wire_protocol) {
|
||||
dev_err(DEV, "incompatible communication protocols\n");
|
||||
|
@ -3125,6 +3141,8 @@ static int receive_state(struct drbd_conf *mdev, struct p_header *h)
|
|||
dev_err(DEV, "Disk attach process on the peer node was aborted.\n");
|
||||
peer_state.disk = D_DISKLESS;
|
||||
} else {
|
||||
if (test_and_clear_bit(CONN_DRY_RUN, &mdev->flags))
|
||||
return FALSE;
|
||||
D_ASSERT(oconn == C_WF_REPORT_PARAMS);
|
||||
drbd_force_state(mdev, NS(conn, C_DISCONNECTING));
|
||||
return FALSE;
|
||||
|
|
|
@ -56,7 +56,7 @@ extern const char *drbd_buildtag(void);
|
|||
#define REL_VERSION "8.3.7"
|
||||
#define API_VERSION 88
|
||||
#define PRO_VERSION_MIN 86
|
||||
#define PRO_VERSION_MAX 91
|
||||
#define PRO_VERSION_MAX 92
|
||||
|
||||
|
||||
enum drbd_io_error_p {
|
||||
|
|
|
@ -63,6 +63,7 @@ NL_PACKET(net_conf, 5,
|
|||
NL_BIT( 41, T_MAY_IGNORE, always_asbp)
|
||||
NL_BIT( 61, T_MAY_IGNORE, no_cork)
|
||||
NL_BIT( 62, T_MANDATORY, auto_sndbuf_size)
|
||||
NL_BIT( 70, T_MANDATORY, dry_run)
|
||||
)
|
||||
|
||||
NL_PACKET(disconnect, 6, )
|
||||
|
|
Loading…
Reference in New Issue