diff options
Diffstat (limited to 'net/ceph/auth_x.c')
| -rw-r--r-- | net/ceph/auth_x.c | 47 | 
1 files changed, 35 insertions, 12 deletions
diff --git a/net/ceph/auth_x.c b/net/ceph/auth_x.c index 7fd5dfcf6e1..96238ba95f2 100644 --- a/net/ceph/auth_x.c +++ b/net/ceph/auth_x.c @@ -298,6 +298,7 @@ static int ceph_x_build_authorizer(struct ceph_auth_client *ac,  			return -ENOMEM;  	}  	au->service = th->service; +	au->secret_id = th->secret_id;  	msg_a = au->buf->vec.iov_base;  	msg_a->struct_v = 1; @@ -526,9 +527,7 @@ static int ceph_x_handle_reply(struct ceph_auth_client *ac, int result,  static int ceph_x_create_authorizer(  	struct ceph_auth_client *ac, int peer_type, -	struct ceph_authorizer **a, -	void **buf, size_t *len, -	void **reply_buf, size_t *reply_len) +	struct ceph_auth_handshake *auth)  {  	struct ceph_x_authorizer *au;  	struct ceph_x_ticket_handler *th; @@ -548,11 +547,32 @@ static int ceph_x_create_authorizer(  		return ret;  	} -	*a = (struct ceph_authorizer *)au; -	*buf = au->buf->vec.iov_base; -	*len = au->buf->vec.iov_len; -	*reply_buf = au->reply_buf; -	*reply_len = sizeof(au->reply_buf); +	auth->authorizer = (struct ceph_authorizer *) au; +	auth->authorizer_buf = au->buf->vec.iov_base; +	auth->authorizer_buf_len = au->buf->vec.iov_len; +	auth->authorizer_reply_buf = au->reply_buf; +	auth->authorizer_reply_buf_len = sizeof (au->reply_buf); + +	return 0; +} + +static int ceph_x_update_authorizer( +	struct ceph_auth_client *ac, int peer_type, +	struct ceph_auth_handshake *auth) +{ +	struct ceph_x_authorizer *au; +	struct ceph_x_ticket_handler *th; + +	th = get_ticket_handler(ac, peer_type); +	if (IS_ERR(th)) +		return PTR_ERR(th); + +	au = (struct ceph_x_authorizer *)auth->authorizer; +	if (au->secret_id < th->secret_id) { +		dout("ceph_x_update_authorizer service %u secret %llu < %llu\n", +		     au->service, au->secret_id, th->secret_id); +		return ceph_x_build_authorizer(ac, th, au); +	}  	return 0;  } @@ -631,7 +651,7 @@ static void ceph_x_invalidate_authorizer(struct ceph_auth_client *ac,  	th = get_ticket_handler(ac, peer_type);  	if (!IS_ERR(th)) -		remove_ticket_handler(ac, th); +		memset(&th->validity, 0, sizeof(th->validity));  } @@ -642,6 +662,7 @@ static const struct ceph_auth_client_ops ceph_x_ops = {  	.build_request = ceph_x_build_request,  	.handle_reply = ceph_x_handle_reply,  	.create_authorizer = ceph_x_create_authorizer, +	.update_authorizer = ceph_x_update_authorizer,  	.verify_authorizer_reply = ceph_x_verify_authorizer_reply,  	.destroy_authorizer = ceph_x_destroy_authorizer,  	.invalidate_authorizer = ceph_x_invalidate_authorizer, @@ -662,14 +683,16 @@ int ceph_x_init(struct ceph_auth_client *ac)  		goto out;  	ret = -EINVAL; -	if (!ac->secret) { +	if (!ac->key) {  		pr_err("no secret set (for auth_x protocol)\n");  		goto out_nomem;  	} -	ret = ceph_crypto_key_unarmor(&xi->secret, ac->secret); -	if (ret) +	ret = ceph_crypto_key_clone(&xi->secret, ac->key); +	if (ret < 0) { +		pr_err("cannot clone key: %d\n", ret);  		goto out_nomem; +	}  	xi->starting = true;  	xi->ticket_handlers = RB_ROOT;  | 
