Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf14c2e9 authored by Philipp Reisner's avatar Philipp Reisner
Browse files

drbd: --dry-run option for drbdsetup net ( drbdadm -- --dry-run connect <res> )

parent 8a03ae2a
Loading
Loading
Loading
Loading
+7 −1
Original line number Original line Diff line number Diff line
@@ -443,13 +443,18 @@ struct p_rs_param_89 {
	char csums_alg[SHARED_SECRET_MAX];
	char csums_alg[SHARED_SECRET_MAX];
} __packed;
} __packed;


enum drbd_conn_flags {
	CF_WANT_LOSE = 1,
	CF_DRY_RUN = 2,
};

struct p_protocol {
struct p_protocol {
	struct p_header head;
	struct p_header head;
	u32 protocol;
	u32 protocol;
	u32 after_sb_0p;
	u32 after_sb_0p;
	u32 after_sb_1p;
	u32 after_sb_1p;
	u32 after_sb_2p;
	u32 after_sb_2p;
	u32 want_lose;
	u32 conn_flags;
	u32 two_primaries;
	u32 two_primaries;


              /* Since protocol version 87 and higher. */
              /* Since protocol version 87 and higher. */
@@ -791,6 +796,7 @@ enum {
				 * while this is set. */
				 * while this is set. */
	RESIZE_PENDING,		/* Size change detected locally, waiting for the response from
	RESIZE_PENDING,		/* Size change detected locally, waiting for the response from
				 * the peer, if it changed there as well. */
				 * the peer, if it changed there as well. */
	CONN_DRY_RUN,		/* Expect disconnect after resync handshake. */
};
};


struct drbd_bitmap; /* opaque for drbd_conf */
struct drbd_bitmap; /* opaque for drbd_conf */
+14 −2
Original line number Original line Diff line number Diff line
@@ -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)
int drbd_send_protocol(struct drbd_conf *mdev)
{
{
	struct p_protocol *p;
	struct p_protocol *p;
	int size, rv;
	int size, cf, rv;


	size = sizeof(struct p_protocol);
	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_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_1p   = cpu_to_be32(mdev->net_conf->after_sb_1p);
	p->after_sb_2p   = cpu_to_be32(mdev->net_conf->after_sb_2p);
	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);
	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)
	if (mdev->agreed_pro_version >= 87)
		strcpy(p->integrity_alg, mdev->net_conf->integrity_alg);
		strcpy(p->integrity_alg, mdev->net_conf->integrity_alg);


+20 −2
Original line number Original line Diff line number Diff line
@@ -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) {
	if (abs(hg) >= 2) {
		dev_info(DEV, "Writing the whole bitmap, full sync required after drbd_sync_handshake.\n");
		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"))
		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;
	struct p_protocol *p = (struct p_protocol *)h;
	int header_size, data_size;
	int header_size, data_size;
	int p_proto, p_after_sb_0p, p_after_sb_1p, p_after_sb_2p;
	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] = "";
	char p_integrity_alg[SHARED_SECRET_MAX] = "";


	header_size = sizeof(*p) - sizeof(*h);
	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_0p	= be32_to_cpu(p->after_sb_0p);
	p_after_sb_1p	= be32_to_cpu(p->after_sb_1p);
	p_after_sb_1p	= be32_to_cpu(p->after_sb_1p);
	p_after_sb_2p	= be32_to_cpu(p->after_sb_2p);
	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);
	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) {
	if (p_proto != mdev->net_conf->wire_protocol) {
		dev_err(DEV, "incompatible communication protocols\n");
		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");
				dev_err(DEV, "Disk attach process on the peer node was aborted.\n");
				peer_state.disk = D_DISKLESS;
				peer_state.disk = D_DISKLESS;
			} else {
			} else {
				if (test_and_clear_bit(CONN_DRY_RUN, &mdev->flags))
					return FALSE;
				D_ASSERT(oconn == C_WF_REPORT_PARAMS);
				D_ASSERT(oconn == C_WF_REPORT_PARAMS);
				drbd_force_state(mdev, NS(conn, C_DISCONNECTING));
				drbd_force_state(mdev, NS(conn, C_DISCONNECTING));
				return FALSE;
				return FALSE;
+1 −1
Original line number Original line Diff line number Diff line
@@ -56,7 +56,7 @@ extern const char *drbd_buildtag(void);
#define REL_VERSION "8.3.7"
#define REL_VERSION "8.3.7"
#define API_VERSION 88
#define API_VERSION 88
#define PRO_VERSION_MIN 86
#define PRO_VERSION_MIN 86
#define PRO_VERSION_MAX 91
#define PRO_VERSION_MAX 92




enum drbd_io_error_p {
enum drbd_io_error_p {
+1 −0
Original line number Original line Diff line number Diff line
@@ -63,6 +63,7 @@ NL_PACKET(net_conf, 5,
	NL_BIT(		41,	T_MAY_IGNORE,	always_asbp)
	NL_BIT(		41,	T_MAY_IGNORE,	always_asbp)
	NL_BIT(		61,	T_MAY_IGNORE,	no_cork)
	NL_BIT(		61,	T_MAY_IGNORE,	no_cork)
	NL_BIT(		62,	T_MANDATORY,	auto_sndbuf_size)
	NL_BIT(		62,	T_MANDATORY,	auto_sndbuf_size)
	NL_BIT(		70,	T_MANDATORY,	dry_run)
)
)


NL_PACKET(disconnect, 6, )
NL_PACKET(disconnect, 6, )