diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2010-07-06 11:25:54 -0400 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2010-10-14 12:38:13 -0400 |
commit | 8e26f9ccb9be00fdb33551a34c8f6029e89ab79f (patch) | |
tree | 0a16e6a5c9f5c42cbc375ac8e3e180011b214743 /drivers/block | |
parent | 9a31d7164d409ca59cfadb7957ac7b0acf4545b8 (diff) |
drbd: New sync_param packet, that includes the parameters of the new controller
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/drbd/drbd_int.h | 14 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_main.c | 11 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 18 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_worker.c | 2 |
4 files changed, 37 insertions, 8 deletions
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index f84ffb17a7e5..fd2cdd45f155 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h | |||
@@ -451,6 +451,17 @@ struct p_rs_param_89 { | |||
451 | char csums_alg[SHARED_SECRET_MAX]; | 451 | char csums_alg[SHARED_SECRET_MAX]; |
452 | } __packed; | 452 | } __packed; |
453 | 453 | ||
454 | struct p_rs_param_95 { | ||
455 | struct p_header head; | ||
456 | u32 rate; | ||
457 | char verify_alg[SHARED_SECRET_MAX]; | ||
458 | char csums_alg[SHARED_SECRET_MAX]; | ||
459 | u32 c_plan_ahead; | ||
460 | u32 c_delay_target; | ||
461 | u32 c_fill_target; | ||
462 | u32 c_max_rate; | ||
463 | } __packed; | ||
464 | |||
454 | enum drbd_conn_flags { | 465 | enum drbd_conn_flags { |
455 | CF_WANT_LOSE = 1, | 466 | CF_WANT_LOSE = 1, |
456 | CF_DRY_RUN = 2, | 467 | CF_DRY_RUN = 2, |
@@ -610,6 +621,7 @@ union p_polymorph { | |||
610 | struct p_barrier barrier; | 621 | struct p_barrier barrier; |
611 | struct p_barrier_ack barrier_ack; | 622 | struct p_barrier_ack barrier_ack; |
612 | struct p_rs_param_89 rs_param_89; | 623 | struct p_rs_param_89 rs_param_89; |
624 | struct p_rs_param_95 rs_param_95; | ||
613 | struct p_protocol protocol; | 625 | struct p_protocol protocol; |
614 | struct p_sizes sizes; | 626 | struct p_sizes sizes; |
615 | struct p_uuids uuids; | 627 | struct p_uuids uuids; |
@@ -1268,6 +1280,8 @@ struct bm_extent { | |||
1268 | * Bit 1 ==> local node thinks this block needs to be synced. | 1280 | * Bit 1 ==> local node thinks this block needs to be synced. |
1269 | */ | 1281 | */ |
1270 | 1282 | ||
1283 | #define SLEEP_TIME (HZ/10) | ||
1284 | |||
1271 | #define BM_BLOCK_SHIFT 12 /* 4k per bit */ | 1285 | #define BM_BLOCK_SHIFT 12 /* 4k per bit */ |
1272 | #define BM_BLOCK_SIZE (1<<BM_BLOCK_SHIFT) | 1286 | #define BM_BLOCK_SIZE (1<<BM_BLOCK_SHIFT) |
1273 | /* (9+3) : 512 bytes @ 8 bits; representing 16M storage | 1287 | /* (9+3) : 512 bytes @ 8 bits; representing 16M storage |
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 5a484c1f5ce7..bff4f598d38f 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
@@ -1713,7 +1713,7 @@ int drbd_send_cmd2(struct drbd_conf *mdev, enum drbd_packets cmd, char *data, | |||
1713 | 1713 | ||
1714 | int drbd_send_sync_param(struct drbd_conf *mdev, struct syncer_conf *sc) | 1714 | int drbd_send_sync_param(struct drbd_conf *mdev, struct syncer_conf *sc) |
1715 | { | 1715 | { |
1716 | struct p_rs_param_89 *p; | 1716 | struct p_rs_param_95 *p; |
1717 | struct socket *sock; | 1717 | struct socket *sock; |
1718 | int size, rv; | 1718 | int size, rv; |
1719 | const int apv = mdev->agreed_pro_version; | 1719 | const int apv = mdev->agreed_pro_version; |
@@ -1721,7 +1721,8 @@ int drbd_send_sync_param(struct drbd_conf *mdev, struct syncer_conf *sc) | |||
1721 | size = apv <= 87 ? sizeof(struct p_rs_param) | 1721 | size = apv <= 87 ? sizeof(struct p_rs_param) |
1722 | : apv == 88 ? sizeof(struct p_rs_param) | 1722 | : apv == 88 ? sizeof(struct p_rs_param) |
1723 | + strlen(mdev->sync_conf.verify_alg) + 1 | 1723 | + strlen(mdev->sync_conf.verify_alg) + 1 |
1724 | : /* 89 */ sizeof(struct p_rs_param_89); | 1724 | : apv <= 94 ? sizeof(struct p_rs_param_89) |
1725 | : /* apv >= 95 */ sizeof(struct p_rs_param_95); | ||
1725 | 1726 | ||
1726 | /* used from admin command context and receiver/worker context. | 1727 | /* used from admin command context and receiver/worker context. |
1727 | * to avoid kmalloc, grab the socket right here, | 1728 | * to avoid kmalloc, grab the socket right here, |
@@ -1732,12 +1733,16 @@ int drbd_send_sync_param(struct drbd_conf *mdev, struct syncer_conf *sc) | |||
1732 | if (likely(sock != NULL)) { | 1733 | if (likely(sock != NULL)) { |
1733 | enum drbd_packets cmd = apv >= 89 ? P_SYNC_PARAM89 : P_SYNC_PARAM; | 1734 | enum drbd_packets cmd = apv >= 89 ? P_SYNC_PARAM89 : P_SYNC_PARAM; |
1734 | 1735 | ||
1735 | p = &mdev->data.sbuf.rs_param_89; | 1736 | p = &mdev->data.sbuf.rs_param_95; |
1736 | 1737 | ||
1737 | /* initialize verify_alg and csums_alg */ | 1738 | /* initialize verify_alg and csums_alg */ |
1738 | memset(p->verify_alg, 0, 2 * SHARED_SECRET_MAX); | 1739 | memset(p->verify_alg, 0, 2 * SHARED_SECRET_MAX); |
1739 | 1740 | ||
1740 | p->rate = cpu_to_be32(sc->rate); | 1741 | p->rate = cpu_to_be32(sc->rate); |
1742 | p->c_plan_ahead = cpu_to_be32(sc->c_plan_ahead); | ||
1743 | p->c_delay_target = cpu_to_be32(sc->c_delay_target); | ||
1744 | p->c_fill_target = cpu_to_be32(sc->c_fill_target); | ||
1745 | p->c_max_rate = cpu_to_be32(sc->c_max_rate); | ||
1741 | 1746 | ||
1742 | if (apv >= 88) | 1747 | if (apv >= 88) |
1743 | strcpy(p->verify_alg, mdev->sync_conf.verify_alg); | 1748 | strcpy(p->verify_alg, mdev->sync_conf.verify_alg); |
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 5e49ee75d3c9..34bea972f734 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c | |||
@@ -2805,7 +2805,7 @@ struct crypto_hash *drbd_crypto_alloc_digest_safe(const struct drbd_conf *mdev, | |||
2805 | static int receive_SyncParam(struct drbd_conf *mdev, struct p_header *h) | 2805 | static int receive_SyncParam(struct drbd_conf *mdev, struct p_header *h) |
2806 | { | 2806 | { |
2807 | int ok = TRUE; | 2807 | int ok = TRUE; |
2808 | struct p_rs_param_89 *p = (struct p_rs_param_89 *)h; | 2808 | struct p_rs_param_95 *p = (struct p_rs_param_95 *)h; |
2809 | unsigned int header_size, data_size, exp_max_sz; | 2809 | unsigned int header_size, data_size, exp_max_sz; |
2810 | struct crypto_hash *verify_tfm = NULL; | 2810 | struct crypto_hash *verify_tfm = NULL; |
2811 | struct crypto_hash *csums_tfm = NULL; | 2811 | struct crypto_hash *csums_tfm = NULL; |
@@ -2814,7 +2814,8 @@ static int receive_SyncParam(struct drbd_conf *mdev, struct p_header *h) | |||
2814 | exp_max_sz = apv <= 87 ? sizeof(struct p_rs_param) | 2814 | exp_max_sz = apv <= 87 ? sizeof(struct p_rs_param) |
2815 | : apv == 88 ? sizeof(struct p_rs_param) | 2815 | : apv == 88 ? sizeof(struct p_rs_param) |
2816 | + SHARED_SECRET_MAX | 2816 | + SHARED_SECRET_MAX |
2817 | : /* 89 */ sizeof(struct p_rs_param_89); | 2817 | : apv <= 94 ? sizeof(struct p_rs_param_89) |
2818 | : /* apv >= 95 */ sizeof(struct p_rs_param_95); | ||
2818 | 2819 | ||
2819 | if (h->length > exp_max_sz) { | 2820 | if (h->length > exp_max_sz) { |
2820 | dev_err(DEV, "SyncParam packet too long: received %u, expected <= %u bytes\n", | 2821 | dev_err(DEV, "SyncParam packet too long: received %u, expected <= %u bytes\n", |
@@ -2825,10 +2826,14 @@ static int receive_SyncParam(struct drbd_conf *mdev, struct p_header *h) | |||
2825 | if (apv <= 88) { | 2826 | if (apv <= 88) { |
2826 | header_size = sizeof(struct p_rs_param) - sizeof(*h); | 2827 | header_size = sizeof(struct p_rs_param) - sizeof(*h); |
2827 | data_size = h->length - header_size; | 2828 | data_size = h->length - header_size; |
2828 | } else /* apv >= 89 */ { | 2829 | } else if (apv <= 94) { |
2829 | header_size = sizeof(struct p_rs_param_89) - sizeof(*h); | 2830 | header_size = sizeof(struct p_rs_param_89) - sizeof(*h); |
2830 | data_size = h->length - header_size; | 2831 | data_size = h->length - header_size; |
2831 | D_ASSERT(data_size == 0); | 2832 | D_ASSERT(data_size == 0); |
2833 | } else { | ||
2834 | header_size = sizeof(struct p_rs_param_95) - sizeof(*h); | ||
2835 | data_size = h->length - header_size; | ||
2836 | D_ASSERT(data_size == 0); | ||
2832 | } | 2837 | } |
2833 | 2838 | ||
2834 | /* initialize verify_alg and csums_alg */ | 2839 | /* initialize verify_alg and csums_alg */ |
@@ -2893,6 +2898,13 @@ static int receive_SyncParam(struct drbd_conf *mdev, struct p_header *h) | |||
2893 | } | 2898 | } |
2894 | } | 2899 | } |
2895 | 2900 | ||
2901 | if (apv > 94) { | ||
2902 | mdev->sync_conf.rate = be32_to_cpu(p->rate); | ||
2903 | mdev->sync_conf.c_plan_ahead = be32_to_cpu(p->c_plan_ahead); | ||
2904 | mdev->sync_conf.c_delay_target = be32_to_cpu(p->c_delay_target); | ||
2905 | mdev->sync_conf.c_fill_target = be32_to_cpu(p->c_fill_target); | ||
2906 | mdev->sync_conf.c_max_rate = be32_to_cpu(p->c_max_rate); | ||
2907 | } | ||
2896 | 2908 | ||
2897 | spin_lock(&mdev->peer_seq_lock); | 2909 | spin_lock(&mdev->peer_seq_lock); |
2898 | /* lock against drbd_nl_syncer_conf() */ | 2910 | /* lock against drbd_nl_syncer_conf() */ |
diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c index 3c1e88480d37..d94720f4bd07 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c | |||
@@ -39,8 +39,6 @@ | |||
39 | #include "drbd_int.h" | 39 | #include "drbd_int.h" |
40 | #include "drbd_req.h" | 40 | #include "drbd_req.h" |
41 | 41 | ||
42 | #define SLEEP_TIME (HZ/10) | ||
43 | |||
44 | static int w_make_ov_request(struct drbd_conf *mdev, struct drbd_work *w, int cancel); | 42 | static int w_make_ov_request(struct drbd_conf *mdev, struct drbd_work *w, int cancel); |
45 | 43 | ||
46 | 44 | ||