All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Elder <elder@inktank.com>
To: Sage Weil <sage@inktank.com>
Cc: ceph-devel@vger.kernel.org
Subject: Re: [PATCH 5/6] libceph: wrap auth methods in a mutex
Date: Mon, 25 Mar 2013 09:32:38 -0500	[thread overview]
Message-ID: <51506006.50403@inktank.com> (raw)
In-Reply-To: <1363734486-26879-5-git-send-email-sage@inktank.com>

On 03/19/2013 06:08 PM, Sage Weil wrote:
> The auth code is called from a variety of contexts, include the mon_client
> (protected by the monc's mutex) and the messenger callbacks (currently
> protected by nothing).  Avoid chaos by protecting all auth state with a
> mutex.  Nothing is blocking, so this should be simple and lightweight.
> 
> Signed-off-by: Sage Weil <sage@inktank.com>

This looks good, but there are some cleanups that should have gone
into the previous patch that I suggest below.

Reviewed-by: Alex Elder <elder@inktank.com>

> ---
>  include/linux/ceph/auth.h |    2 ++
>  net/ceph/auth.c           |   78 ++++++++++++++++++++++++++++++++-------------
>  2 files changed, 58 insertions(+), 22 deletions(-)
> 
> diff --git a/include/linux/ceph/auth.h b/include/linux/ceph/auth.h
> index c9c3b3a..5f33868 100644
> --- a/include/linux/ceph/auth.h
> +++ b/include/linux/ceph/auth.h
> @@ -78,6 +78,8 @@ struct ceph_auth_client {
>  	u64 global_id;          /* our unique id in system */
>  	const struct ceph_crypto_key *key;     /* our secret key */
>  	unsigned want_keys;     /* which services we want */
> +
> +	struct mutex mutex;
>  };
>  
>  extern struct ceph_auth_client *ceph_auth_init(const char *name,
> diff --git a/net/ceph/auth.c b/net/ceph/auth.c
> index a22de54..6b923bc 100644
> --- a/net/ceph/auth.c
> +++ b/net/ceph/auth.c
> @@ -47,6 +47,7 @@ struct ceph_auth_client *ceph_auth_init(const char *name, const struct ceph_cryp
>  	if (!ac)
>  		goto out;
>  
> +	mutex_init(&ac->mutex);
>  	ac->negotiating = true;
>  	if (name)
>  		ac->name = name;
> @@ -73,10 +74,12 @@ void ceph_auth_destroy(struct ceph_auth_client *ac)
>   */
>  void ceph_auth_reset(struct ceph_auth_client *ac)
>  {
> +	mutex_lock(&ac->mutex);
>  	dout("auth_reset %p\n", ac);
>  	if (ac->ops && !ac->negotiating)
>  		ac->ops->reset(ac);
>  	ac->negotiating = true;
> +	mutex_unlock(&ac->mutex);
>  }
>  
>  int ceph_entity_name_encode(const char *name, void **p, void *end)
> @@ -102,6 +105,7 @@ int ceph_auth_build_hello(struct ceph_auth_client *ac, void *buf, size_t len)
>  	int i, num;
>  	int ret;
>  
> +	mutex_lock(&ac->mutex);
>  	dout("auth_build_hello\n");
>  	monhdr->have_version = 0;
>  	monhdr->session_mon = cpu_to_le16(-1);
> @@ -122,15 +126,19 @@ int ceph_auth_build_hello(struct ceph_auth_client *ac, void *buf, size_t len)
>  
>  	ret = ceph_entity_name_encode(ac->name, &p, end);
>  	if (ret < 0)
> -		return ret;
> +		goto out;
>  	ceph_decode_need(&p, end, sizeof(u64), bad);
>  	ceph_encode_64(&p, ac->global_id);
>  
>  	ceph_encode_32(&lenp, p - lenp - sizeof(u32));
> -	return p - buf;
> +	ret = p - buf;
> +out:
> +	mutex_unlock(&ac->mutex);
> +	return ret;
>  
>  bad:
> -	return -ERANGE;
> +	ret = -ERANGE;
> +	goto out;
>  }
>  
>  static int ceph_build_auth_request(struct ceph_auth_client *ac,
> @@ -151,11 +159,13 @@ static int ceph_build_auth_request(struct ceph_auth_client *ac,
>  	if (ret < 0) {
>  		pr_err("error %d building auth method %s request\n", ret,
>  		       ac->ops->name);
> -		return ret;
> +		goto out;
>  	}
>  	dout(" built request %d bytes\n", ret);
>  	ceph_encode_32(&p, ret);
> -	return p + ret - msg_buf;
> +	ret = p + ret - msg_buf;
> +out:
> +	return ret;
>  }
>  
>  /*
> @@ -176,6 +186,7 @@ int ceph_handle_auth_reply(struct ceph_auth_client *ac,
>  	int result_msg_len;
>  	int ret = -EINVAL;
>  
> +	mutex_lock(&ac->mutex);
>  	dout("handle_auth_reply %p %p\n", p, end);
>  	ceph_decode_need(&p, end, sizeof(u32) * 3 + sizeof(u64), bad);
>  	protocol = ceph_decode_32(&p);
> @@ -227,35 +238,44 @@ int ceph_handle_auth_reply(struct ceph_auth_client *ac,
>  
>  	ret = ac->ops->handle_reply(ac, result, payload, payload_end);

I suggest creating ceph_auth_handle_reply() in the previous patch,
and then use it here.

>  	if (ret == -EAGAIN) {
> -		return ceph_build_auth_request(ac, reply_buf, reply_len);
> +		ret = ceph_build_auth_request(ac, reply_buf, reply_len);
>  	} else if (ret) {
>  		pr_err("auth method '%s' error %d\n", ac->ops->name, ret);
> -		return ret;
>  	}
> -	return 0;
>  
> -bad:
> -	pr_err("failed to decode auth msg\n");
>  out:
> +	mutex_unlock(&ac->mutex);
>  	return ret;
> +
> +bad:
> +	pr_err("failed to decode auth msg\n");
> +	ret = -EINVAL;
> +	goto out;
>  }
>  
>  int ceph_build_auth(struct ceph_auth_client *ac,
>  		    void *msg_buf, size_t msg_len)
>  {
> +	int ret = 0;
> +
> +	mutex_lock(&ac->mutex);
>  	if (!ac->protocol)
> -		return ceph_auth_build_hello(ac, msg_buf, msg_len);
> -	BUG_ON(!ac->ops);
> -	if (ac->ops->should_authenticate(ac))

Same basic suggestion here, create ceph_auth_should_authenticate()
in the previous patch and use it here.

> -		return ceph_build_auth_request(ac, msg_buf, msg_len);
> -	return 0;
> +		ret = ceph_auth_build_hello(ac, msg_buf, msg_len);
> +	else if (ac->ops->should_authenticate(ac))
> +		ret = ceph_build_auth_request(ac, msg_buf, msg_len);
> +	mutex_unlock(&ac->mutex);
> +	return ret;
>  }
>  
>  int ceph_auth_is_authenticated(struct ceph_auth_client *ac)
>  {
> -	if (!ac->ops)
> -		return 0;
> -	return ac->ops->is_authenticated(ac);

And ceph_auth_is_authenticated() here...

> +	int ret = 0;
> +
> +	mutex_lock(&ac->mutex);
> +	if (ac->ops)
> +		ret = ac->ops->is_authenticated(ac);
> +	mutex_unlock(&ac->mutex);
> +	return ret;
>  }
>  EXPORT_SYMBOL(ceph_auth_is_authenticated);
>  
> @@ -263,17 +283,23 @@ int ceph_auth_create_authorizer(struct ceph_auth_client *ac,
>  				int peer_type,
>  				struct ceph_auth_handshake *auth)
>  {
> +	int ret = 0;
> +
> +	mutex_lock(&ac->mutex);
>  	if (ac->ops && ac->ops->create_authorizer)
> -		return ac->ops->create_authorizer(ac, peer_type, auth);

This should have been switched to use the helper in the previous patch.

> -	return 0;
> +		ret = ac->ops->create_authorizer(ac, peer_type, auth);
> +	mutex_unlock(&ac->mutex);
> +	return ret;
>  }
>  EXPORT_SYMBOL(ceph_auth_create_authorizer);
>  
>  void ceph_auth_destroy_authorizer(struct ceph_auth_client *ac,
>  				  struct ceph_authorizer *a)
>  {
> +	mutex_lock(&ac->mutex);
>  	if (ac->ops && ac->ops->destroy_authorizer)

And this too.

>  		ac->ops->destroy_authorizer(ac, a);
> +	mutex_unlock(&ac->mutex);
>  }
>  EXPORT_SYMBOL(ceph_auth_destroy_authorizer);
>  
> @@ -283,8 +309,10 @@ int ceph_auth_update_authorizer(struct ceph_auth_client *ac,
>  {
>  	int ret = 0;
>  
> +	mutex_lock(&ac->mutex);
>  	if (ac->ops && ac->ops->update_authorizer)
>  		ret = ac->ops->update_authorizer(ac, peer_type, a);

And here, and so on.  (Done making this comment.)

> +	mutex_unlock(&ac->mutex);
>  	return ret;
>  }
>  EXPORT_SYMBOL(ceph_auth_update_authorizer);
> @@ -292,15 +320,21 @@ EXPORT_SYMBOL(ceph_auth_update_authorizer);
>  int ceph_auth_verify_authorizer_reply(struct ceph_auth_client *ac,
>  				      struct ceph_authorizer *a, size_t len)
>  {
> +	int ret = 0;
> +
> +	mutex_lock(&ac->mutex);
>  	if (ac->ops && ac->ops->verify_authorizer_reply)
> -		return ac->ops->verify_authorizer_reply(ac, a, len);
> -	return 0;
> +		ret = ac->ops->verify_authorizer_reply(ac, a, len);
> +	mutex_unlock(&ac->mutex);
> +	return ret;
>  }
>  EXPORT_SYMBOL(ceph_auth_verify_authorizer_reply);
>  
>  void ceph_auth_invalidate_authorizer(struct ceph_auth_client *ac, int peer_type)
>  {
> +	mutex_lock(&ac->mutex);
>  	if (ac->ops && ac->ops->invalidate_authorizer)
>  		ac->ops->invalidate_authorizer(ac, peer_type);
> +	mutex_unlock(&ac->mutex);
>  }
>  EXPORT_SYMBOL(ceph_auth_invalidate_authorizer);
> 


  reply	other threads:[~2013-03-25 14:32 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-19 23:08 [PATCH 1/6] libceph: clear messenger auth_retry flag when we authenticate Sage Weil
2013-03-19 23:08 ` [PATCH 2/6] libceph: fix authorizer invalidation Sage Weil
2013-03-25 13:39   ` Alex Elder
2013-03-25 15:51     ` Sage Weil
2013-03-19 23:08 ` [PATCH 3/6] libceph: add update_authorizer auth method Sage Weil
2013-03-25 14:15   ` Alex Elder
2013-03-25 15:53     ` Sage Weil
2013-03-19 23:08 ` [PATCH 4/6] libceph: wrap auth ops in wrapper functions Sage Weil
2013-03-25 14:25   ` Alex Elder
2013-03-19 23:08 ` [PATCH 5/6] libceph: wrap auth methods in a mutex Sage Weil
2013-03-25 14:32   ` Alex Elder [this message]
2013-03-25 16:26     ` Sage Weil
2013-03-25 16:49       ` Alex Elder
2013-03-19 23:08 ` [PATCH 6/6] libceph: verify authorizer reply Sage Weil
2013-03-25 14:41   ` Alex Elder
2013-03-25 16:29     ` Sage Weil
2013-03-25 13:32 ` [PATCH 1/6] libceph: clear messenger auth_retry flag when we authenticate Alex Elder

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51506006.50403@inktank.com \
    --to=elder@inktank.com \
    --cc=ceph-devel@vger.kernel.org \
    --cc=sage@inktank.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.