diff options
Diffstat (limited to 'net/ceph/auth.c')
| -rw-r--r-- | net/ceph/auth.c | 125 | 
1 files changed, 103 insertions, 22 deletions
diff --git a/net/ceph/auth.c b/net/ceph/auth.c index 549c1f43e1d..6b923bcaa2a 100644 --- a/net/ceph/auth.c +++ b/net/ceph/auth.c @@ -35,25 +35,26 @@ static int ceph_auth_init_protocol(struct ceph_auth_client *ac, int protocol)  /*   * setup, teardown.   */ -struct ceph_auth_client *ceph_auth_init(const char *name, const char *secret) +struct ceph_auth_client *ceph_auth_init(const char *name, const struct ceph_crypto_key *key)  {  	struct ceph_auth_client *ac;  	int ret; -	dout("auth_init name '%s' secret '%s'\n", name, secret); +	dout("auth_init name '%s'\n", name);  	ret = -ENOMEM;  	ac = kzalloc(sizeof(*ac), GFP_NOFS);  	if (!ac)  		goto out; +	mutex_init(&ac->mutex);  	ac->negotiating = true;  	if (name)  		ac->name = name;  	else  		ac->name = CEPH_AUTH_NAME_DEFAULT; -	dout("auth_init name %s secret %s\n", ac->name, secret); -	ac->secret = secret; +	dout("auth_init name %s\n", ac->name); +	ac->key = key;  	return ac;  out: @@ -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,33 +238,103 @@ int ceph_handle_auth_reply(struct ceph_auth_client *ac,  	ret = ac->ops->handle_reply(ac, result, payload, payload_end);  	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)) -		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); +	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); + +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) +		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) +		ac->ops->destroy_authorizer(ac, a); +	mutex_unlock(&ac->mutex); +} +EXPORT_SYMBOL(ceph_auth_destroy_authorizer); + +int ceph_auth_update_authorizer(struct ceph_auth_client *ac, +				int peer_type, +				struct ceph_auth_handshake *a) +{ +	int ret = 0; + +	mutex_lock(&ac->mutex); +	if (ac->ops && ac->ops->update_authorizer) +		ret = ac->ops->update_authorizer(ac, peer_type, a); +	mutex_unlock(&ac->mutex); +	return ret; +} +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) +		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);  | 
