aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2010-07-06 11:25:54 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2010-10-14 12:38:13 -0400
commit8e26f9ccb9be00fdb33551a34c8f6029e89ab79f (patch)
tree0a16e6a5c9f5c42cbc375ac8e3e180011b214743 /drivers/block
parent9a31d7164d409ca59cfadb7957ac7b0acf4545b8 (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.h14
-rw-r--r--drivers/block/drbd/drbd_main.c11
-rw-r--r--drivers/block/drbd/drbd_receiver.c18
-rw-r--r--drivers/block/drbd/drbd_worker.c2
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
454struct 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
454enum drbd_conn_flags { 465enum 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
1714int drbd_send_sync_param(struct drbd_conf *mdev, struct syncer_conf *sc) 1714int 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,
2805static int receive_SyncParam(struct drbd_conf *mdev, struct p_header *h) 2805static 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
44static int w_make_ov_request(struct drbd_conf *mdev, struct drbd_work *w, int cancel); 42static int w_make_ov_request(struct drbd_conf *mdev, struct drbd_work *w, int cancel);
45 43
46 44