aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_receiver.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/block/drbd/drbd_receiver.c')
-rw-r--r--drivers/block/drbd/drbd_receiver.c18
1 files changed, 15 insertions, 3 deletions
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() */