diff options
Diffstat (limited to 'net/ceph/osd_client.c')
| -rw-r--r-- | net/ceph/osd_client.c | 73 | 
1 files changed, 39 insertions, 34 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index 1b0ef3c4d39..ca59e66c978 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c @@ -139,15 +139,15 @@ void ceph_osdc_release_request(struct kref *kref)  	if (req->r_request)  		ceph_msg_put(req->r_request); -	if (req->r_reply) -		ceph_msg_put(req->r_reply);  	if (req->r_con_filling_msg) {  		dout("release_request revoking pages %p from con %p\n",  		     req->r_pages, req->r_con_filling_msg);  		ceph_con_revoke_message(req->r_con_filling_msg,  				      req->r_reply); -		ceph_con_put(req->r_con_filling_msg); +		req->r_con_filling_msg->ops->put(req->r_con_filling_msg);  	} +	if (req->r_reply) +		ceph_msg_put(req->r_reply);  	if (req->r_own_pages)  		ceph_release_page_vector(req->r_pages,  					 req->r_num_pages); @@ -278,7 +278,7 @@ static void osd_req_encode_op(struct ceph_osd_request *req,  {  	dst->op = cpu_to_le16(src->op); -	switch (dst->op) { +	switch (src->op) {  	case CEPH_OSD_OP_READ:  	case CEPH_OSD_OP_WRITE:  		dst->extent.offset = @@ -664,11 +664,11 @@ static void put_osd(struct ceph_osd *osd)  {  	dout("put_osd %p %d -> %d\n", osd, atomic_read(&osd->o_ref),  	     atomic_read(&osd->o_ref) - 1); -	if (atomic_dec_and_test(&osd->o_ref)) { +	if (atomic_dec_and_test(&osd->o_ref) && osd->o_auth.authorizer) {  		struct ceph_auth_client *ac = osd->o_osdc->client->monc.auth; -		if (osd->o_authorizer) -			ac->ops->destroy_authorizer(ac, osd->o_authorizer); +		if (ac->ops && ac->ops->destroy_authorizer) +			ac->ops->destroy_authorizer(ac, osd->o_auth.authorizer);  		kfree(osd);  	}  } @@ -841,6 +841,12 @@ static void register_request(struct ceph_osd_client *osdc,  static void __unregister_request(struct ceph_osd_client *osdc,  				 struct ceph_osd_request *req)  { +	if (RB_EMPTY_NODE(&req->r_node)) { +		dout("__unregister_request %p tid %lld not registered\n", +			req, req->r_tid); +		return; +	} +  	dout("__unregister_request %p tid %lld\n", req, req->r_tid);  	rb_erase(&req->r_node, &osdc->requests);  	osdc->num_requests--; @@ -1210,7 +1216,7 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg,  	if (req->r_con_filling_msg == con && req->r_reply == msg) {  		dout(" dropping con_filling_msg ref %p\n", con);  		req->r_con_filling_msg = NULL; -		ceph_con_put(con); +		con->ops->put(con);  	}  	if (!req->r_got_reply) { @@ -2022,7 +2028,7 @@ static struct ceph_msg *get_reply(struct ceph_connection *con,  		dout("get_reply revoking msg %p from old con %p\n",  		     req->r_reply, req->r_con_filling_msg);  		ceph_con_revoke_message(req->r_con_filling_msg, req->r_reply); -		ceph_con_put(req->r_con_filling_msg); +		req->r_con_filling_msg->ops->put(req->r_con_filling_msg);  		req->r_con_filling_msg = NULL;  	} @@ -2057,7 +2063,7 @@ static struct ceph_msg *get_reply(struct ceph_connection *con,  #endif  	}  	*skip = 0; -	req->r_con_filling_msg = ceph_con_get(con); +	req->r_con_filling_msg = con->ops->get(con);  	dout("get_reply tid %lld %p\n", tid, m);  out: @@ -2108,37 +2114,32 @@ static void put_osd_con(struct ceph_connection *con)  /*   * authentication   */ -static int get_authorizer(struct ceph_connection *con, -			  void **buf, int *len, int *proto, -			  void **reply_buf, int *reply_len, int force_new) +/* + * Note: returned pointer is the address of a structure that's + * managed separately.  Caller must *not* attempt to free it. + */ +static struct ceph_auth_handshake *get_authorizer(struct ceph_connection *con, +					int *proto, int force_new)  {  	struct ceph_osd *o = con->private;  	struct ceph_osd_client *osdc = o->o_osdc;  	struct ceph_auth_client *ac = osdc->client->monc.auth; -	int ret = 0; +	struct ceph_auth_handshake *auth = &o->o_auth; -	if (force_new && o->o_authorizer) { -		ac->ops->destroy_authorizer(ac, o->o_authorizer); -		o->o_authorizer = NULL; +	if (force_new && auth->authorizer) { +		if (ac->ops && ac->ops->destroy_authorizer) +			ac->ops->destroy_authorizer(ac, auth->authorizer); +		auth->authorizer = NULL;  	} -	if (o->o_authorizer == NULL) { -		ret = ac->ops->create_authorizer( -			ac, CEPH_ENTITY_TYPE_OSD, -			&o->o_authorizer, -			&o->o_authorizer_buf, -			&o->o_authorizer_buf_len, -			&o->o_authorizer_reply_buf, -			&o->o_authorizer_reply_buf_len); +	if (!auth->authorizer && ac->ops && ac->ops->create_authorizer) { +		int ret = ac->ops->create_authorizer(ac, CEPH_ENTITY_TYPE_OSD, +							auth);  		if (ret) -			return ret; +			return ERR_PTR(ret);  	} -  	*proto = ac->protocol; -	*buf = o->o_authorizer_buf; -	*len = o->o_authorizer_buf_len; -	*reply_buf = o->o_authorizer_reply_buf; -	*reply_len = o->o_authorizer_reply_buf_len; -	return 0; + +	return auth;  } @@ -2148,7 +2149,11 @@ static int verify_authorizer_reply(struct ceph_connection *con, int len)  	struct ceph_osd_client *osdc = o->o_osdc;  	struct ceph_auth_client *ac = osdc->client->monc.auth; -	return ac->ops->verify_authorizer_reply(ac, o->o_authorizer, len); +	/* +	 * XXX If ac->ops or ac->ops->verify_authorizer_reply is null, +	 * XXX which do we do:  succeed or fail? +	 */ +	return ac->ops->verify_authorizer_reply(ac, o->o_auth.authorizer, len);  }  static int invalidate_authorizer(struct ceph_connection *con) @@ -2157,7 +2162,7 @@ static int invalidate_authorizer(struct ceph_connection *con)  	struct ceph_osd_client *osdc = o->o_osdc;  	struct ceph_auth_client *ac = osdc->client->monc.auth; -	if (ac->ops->invalidate_authorizer) +	if (ac->ops && ac->ops->invalidate_authorizer)  		ac->ops->invalidate_authorizer(ac, CEPH_ENTITY_TYPE_OSD);  	return ceph_monc_validate_auth(&osdc->client->monc);  |