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
					
				
			
		
					 5 changed files with 43 additions and 6 deletions
				
			
		| 
						 | 
					@ -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 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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, )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue