Loading drivers/block/drbd/drbd_int.h +7 −1 Original line number Original line Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -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 */ Loading drivers/block/drbd/drbd_main.c +14 −2 Original line number Original line Diff line number Diff line Loading @@ -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); Loading @@ -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); Loading drivers/block/drbd/drbd_receiver.c +20 −2 Original line number Original line Diff line number Diff line Loading @@ -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")) Loading Loading @@ -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); Loading @@ -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"); Loading Loading @@ -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; Loading include/linux/drbd.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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 { Loading include/linux/drbd_nl.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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 Loading
drivers/block/drbd/drbd_int.h +7 −1 Original line number Original line Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -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 */ Loading
drivers/block/drbd/drbd_main.c +14 −2 Original line number Original line Diff line number Diff line Loading @@ -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); Loading @@ -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); Loading
drivers/block/drbd/drbd_receiver.c +20 −2 Original line number Original line Diff line number Diff line Loading @@ -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")) Loading Loading @@ -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); Loading @@ -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"); Loading Loading @@ -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; Loading
include/linux/drbd.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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 { Loading
include/linux/drbd_nl.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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