aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_receiver.c
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2010-02-02 15:03:50 -0500
committerPhilipp Reisner <philipp.reisner@linbit.com>2010-03-11 09:51:23 -0500
commitcf14c2e987ba0a09a7b09be2ecd55af0bc9c17b4 (patch)
tree3e403ecc535e3860ab5835343fd428c77cad9f5c /drivers/block/drbd/drbd_receiver.c
parent8a03ae2a5baed3df09e5643615bdd853fc142a09 (diff)
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>
Diffstat (limited to 'drivers/block/drbd/drbd_receiver.c')
-rw-r--r--drivers/block/drbd/drbd_receiver.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index d065c646b35..8bcde4a9632 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -2538,6 +2538,16 @@ static enum drbd_conns drbd_sync_handshake(struct drbd_conf *mdev, enum drbd_rol
2538 } 2538 }
2539 } 2539 }
2540 2540
2541 if (mdev->net_conf->dry_run || test_bit(CONN_DRY_RUN, &mdev->flags)) {
2542 if (hg == 0)
2543 dev_info(DEV, "dry-run connect: No resync, would become Connected immediately.\n");
2544 else
2545 dev_info(DEV, "dry-run connect: Would become %s, doing a %s resync.",
2546 drbd_conn_str(hg > 0 ? C_SYNC_SOURCE : C_SYNC_TARGET),
2547 abs(hg) >= 2 ? "full" : "bit-map based");
2548 return C_MASK;
2549 }
2550
2541 if (abs(hg) >= 2) { 2551 if (abs(hg) >= 2) {
2542 dev_info(DEV, "Writing the whole bitmap, full sync required after drbd_sync_handshake.\n"); 2552 dev_info(DEV, "Writing the whole bitmap, full sync required after drbd_sync_handshake.\n");
2543 if (drbd_bitmap_io(mdev, &drbd_bmio_set_n_write, "set_n_write from sync_handshake")) 2553 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)
2585 struct p_protocol *p = (struct p_protocol *)h; 2595 struct p_protocol *p = (struct p_protocol *)h;
2586 int header_size, data_size; 2596 int header_size, data_size;
2587 int p_proto, p_after_sb_0p, p_after_sb_1p, p_after_sb_2p; 2597 int p_proto, p_after_sb_0p, p_after_sb_1p, p_after_sb_2p;
2588 int p_want_lose, p_two_primaries; 2598 int p_want_lose, p_two_primaries, cf;
2589 char p_integrity_alg[SHARED_SECRET_MAX] = ""; 2599 char p_integrity_alg[SHARED_SECRET_MAX] = "";
2590 2600
2591 header_size = sizeof(*p) - sizeof(*h); 2601 header_size = sizeof(*p) - sizeof(*h);
@@ -2598,8 +2608,14 @@ static int receive_protocol(struct drbd_conf *mdev, struct p_header *h)
2598 p_after_sb_0p = be32_to_cpu(p->after_sb_0p); 2608 p_after_sb_0p = be32_to_cpu(p->after_sb_0p);
2599 p_after_sb_1p = be32_to_cpu(p->after_sb_1p); 2609 p_after_sb_1p = be32_to_cpu(p->after_sb_1p);
2600 p_after_sb_2p = be32_to_cpu(p->after_sb_2p); 2610 p_after_sb_2p = be32_to_cpu(p->after_sb_2p);
2601 p_want_lose = be32_to_cpu(p->want_lose);
2602 p_two_primaries = be32_to_cpu(p->two_primaries); 2611 p_two_primaries = be32_to_cpu(p->two_primaries);
2612 cf = be32_to_cpu(p->conn_flags);
2613 p_want_lose = cf & CF_WANT_LOSE;
2614
2615 clear_bit(CONN_DRY_RUN, &mdev->flags);
2616
2617 if (cf & CF_DRY_RUN)
2618 set_bit(CONN_DRY_RUN, &mdev->flags);
2603 2619
2604 if (p_proto != mdev->net_conf->wire_protocol) { 2620 if (p_proto != mdev->net_conf->wire_protocol) {
2605 dev_err(DEV, "incompatible communication protocols\n"); 2621 dev_err(DEV, "incompatible communication protocols\n");
@@ -3125,6 +3141,8 @@ static int receive_state(struct drbd_conf *mdev, struct p_header *h)
3125 dev_err(DEV, "Disk attach process on the peer node was aborted.\n"); 3141 dev_err(DEV, "Disk attach process on the peer node was aborted.\n");
3126 peer_state.disk = D_DISKLESS; 3142 peer_state.disk = D_DISKLESS;
3127 } else { 3143 } else {
3144 if (test_and_clear_bit(CONN_DRY_RUN, &mdev->flags))
3145 return FALSE;
3128 D_ASSERT(oconn == C_WF_REPORT_PARAMS); 3146 D_ASSERT(oconn == C_WF_REPORT_PARAMS);
3129 drbd_force_state(mdev, NS(conn, C_DISCONNECTING)); 3147 drbd_force_state(mdev, NS(conn, C_DISCONNECTING));
3130 return FALSE; 3148 return FALSE;