diff options
Diffstat (limited to 'drivers/block/drbd/drbd_receiver.c')
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 18 |
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, | |||
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() */ |