From d659f2aaea1bd2fe9cf68b33d881470678c6ce2b Mon Sep 17 00:00:00 2001 From: Philipp Reisner Date: Mon, 16 May 2011 17:38:45 +0200 Subject: [PATCH] drbd: Send PROTOCOL_UPDATE packets when appropriate Signed-off-by: Philipp Reisner Signed-off-by: Lars Ellenberg --- drivers/block/drbd/drbd_int.h | 2 +- drivers/block/drbd/drbd_main.c | 6 +++--- drivers/block/drbd/drbd_nl.c | 11 ++--------- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 75b26d8..c301973 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -1051,7 +1051,7 @@ extern int drbd_send(struct drbd_tconn *tconn, struct socket *sock, extern int drbd_send_all(struct drbd_tconn *, struct socket *, void *, size_t, unsigned); -extern int __drbd_send_protocol(struct drbd_tconn *tconn); +extern int __drbd_send_protocol(struct drbd_tconn *tconn, enum drbd_packet cmd); extern int drbd_send_protocol(struct drbd_tconn *tconn); extern int drbd_send_uuids(struct drbd_conf *mdev); extern int drbd_send_uuids_skip_initial_sync(struct drbd_conf *mdev); diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 4133335..dab0a75 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -911,7 +911,7 @@ int drbd_send_sync_param(struct drbd_conf *mdev) return drbd_send_command(mdev, sock, cmd, size, NULL, 0); } -int __drbd_send_protocol(struct drbd_tconn *tconn) +int __drbd_send_protocol(struct drbd_tconn *tconn, enum drbd_packet cmd) { struct drbd_socket *sock; struct p_protocol *p; @@ -953,7 +953,7 @@ int __drbd_send_protocol(struct drbd_tconn *tconn) strcpy(p->integrity_alg, nc->integrity_alg); rcu_read_unlock(); - return __conn_send_command(tconn, sock, P_PROTOCOL, size, NULL, 0); + return __conn_send_command(tconn, sock, cmd, size, NULL, 0); } int drbd_send_protocol(struct drbd_tconn *tconn) @@ -961,7 +961,7 @@ int drbd_send_protocol(struct drbd_tconn *tconn) int err; mutex_lock(&tconn->data.mutex); - err = __drbd_send_protocol(tconn); + err = __drbd_send_protocol(tconn, P_PROTOCOL); mutex_unlock(&tconn->data.mutex); return err; diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index 133a672..b81f924 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c @@ -1866,7 +1866,6 @@ int drbd_adm_net_opts(struct sk_buff *skb, struct genl_info *info) int ovr; /* online verify running */ int rsr; /* re-sync running */ struct crypto crypto = { }; - bool change_integrity_alg; retcode = drbd_adm_prepare(skb, info, DRBD_ADM_NEED_CONN); if (!adm_ctx.reply_skb) @@ -1923,9 +1922,6 @@ int drbd_adm_net_opts(struct sk_buff *skb, struct genl_info *info) goto fail; } - change_integrity_alg = strcmp(old_conf->integrity_alg, - new_conf->integrity_alg); - retcode = alloc_crypto(&crypto, new_conf); if (retcode != NO_ERROR) goto fail; @@ -1949,13 +1945,10 @@ int drbd_adm_net_opts(struct sk_buff *skb, struct genl_info *info) tconn->int_dig_vv = crypto.int_dig_vv; crypto_free_hash(tconn->integrity_tfm); tconn->integrity_tfm = crypto.integrity_tfm; - if (change_integrity_alg) { + if (tconn->cstate >= C_WF_REPORT_PARAMS && tconn->agreed_pro_version >= 100) /* Do this without trying to take tconn->data.mutex again. */ - if (__drbd_send_protocol(tconn)) - goto fail; - } + __drbd_send_protocol(tconn, P_PROTOCOL_UPDATE); - /* FIXME Changing cram_hmac while the connection is established is useless */ crypto_free_hash(tconn->cram_hmac_tfm); tconn->cram_hmac_tfm = crypto.cram_hmac_tfm; -- 2.7.4