mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	libceph: embed ceph messenger structure in ceph_client
A ceph client has a pointer to a ceph messenger structure in it. There is always exactly one ceph messenger for a ceph client, so there is no need to allocate it separate from the ceph client structure. Switch the ceph_client structure to embed its ceph_messenger structure. Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Yehuda Sadeh <yehuda@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com>
This commit is contained in:
		
							parent
							
								
									e22004235a
								
							
						
					
					
						commit
						15d9882c33
					
				
					 7 changed files with 26 additions and 45 deletions
				
			
		| 
						 | 
					@ -394,7 +394,7 @@ static struct ceph_mds_session *register_session(struct ceph_mds_client *mdsc,
 | 
				
			||||||
	s->s_seq = 0;
 | 
						s->s_seq = 0;
 | 
				
			||||||
	mutex_init(&s->s_mutex);
 | 
						mutex_init(&s->s_mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ceph_con_init(mdsc->fsc->client->msgr, &s->s_con);
 | 
						ceph_con_init(&mdsc->fsc->client->msgr, &s->s_con);
 | 
				
			||||||
	s->s_con.private = s;
 | 
						s->s_con.private = s;
 | 
				
			||||||
	s->s_con.ops = &mds_con_ops;
 | 
						s->s_con.ops = &mds_con_ops;
 | 
				
			||||||
	s->s_con.peer_name.type = CEPH_ENTITY_TYPE_MDS;
 | 
						s->s_con.peer_name.type = CEPH_ENTITY_TYPE_MDS;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -131,7 +131,7 @@ struct ceph_client {
 | 
				
			||||||
	u32 supported_features;
 | 
						u32 supported_features;
 | 
				
			||||||
	u32 required_features;
 | 
						u32 required_features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct ceph_messenger *msgr;   /* messenger instance */
 | 
						struct ceph_messenger msgr;   /* messenger instance */
 | 
				
			||||||
	struct ceph_mon_client monc;
 | 
						struct ceph_mon_client monc;
 | 
				
			||||||
	struct ceph_osd_client osdc;
 | 
						struct ceph_osd_client osdc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -211,10 +211,11 @@ extern int ceph_msgr_init(void);
 | 
				
			||||||
extern void ceph_msgr_exit(void);
 | 
					extern void ceph_msgr_exit(void);
 | 
				
			||||||
extern void ceph_msgr_flush(void);
 | 
					extern void ceph_msgr_flush(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern struct ceph_messenger *ceph_messenger_create(
 | 
					extern void ceph_messenger_init(struct ceph_messenger *msgr,
 | 
				
			||||||
			struct ceph_entity_addr *myaddr,
 | 
								struct ceph_entity_addr *myaddr,
 | 
				
			||||||
	u32 features, u32 required);
 | 
								u32 supported_features,
 | 
				
			||||||
extern void ceph_messenger_destroy(struct ceph_messenger *);
 | 
								u32 required_features,
 | 
				
			||||||
 | 
								bool nocrc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern void ceph_con_init(struct ceph_messenger *msgr,
 | 
					extern void ceph_con_init(struct ceph_messenger *msgr,
 | 
				
			||||||
			  struct ceph_connection *con);
 | 
								  struct ceph_connection *con);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -468,19 +468,15 @@ struct ceph_client *ceph_create_client(struct ceph_options *opt, void *private,
 | 
				
			||||||
	/* msgr */
 | 
						/* msgr */
 | 
				
			||||||
	if (ceph_test_opt(client, MYIP))
 | 
						if (ceph_test_opt(client, MYIP))
 | 
				
			||||||
		myaddr = &client->options->my_addr;
 | 
							myaddr = &client->options->my_addr;
 | 
				
			||||||
	client->msgr = ceph_messenger_create(myaddr,
 | 
						ceph_messenger_init(&client->msgr, myaddr,
 | 
				
			||||||
		client->supported_features,
 | 
							client->supported_features,
 | 
				
			||||||
					     client->required_features);
 | 
							client->required_features,
 | 
				
			||||||
	if (IS_ERR(client->msgr)) {
 | 
							ceph_test_opt(client, NOCRC));
 | 
				
			||||||
		err = PTR_ERR(client->msgr);
 | 
					 | 
				
			||||||
		goto fail;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	client->msgr->nocrc = ceph_test_opt(client, NOCRC);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* subsystems */
 | 
						/* subsystems */
 | 
				
			||||||
	err = ceph_monc_init(&client->monc, client);
 | 
						err = ceph_monc_init(&client->monc, client);
 | 
				
			||||||
	if (err < 0)
 | 
						if (err < 0)
 | 
				
			||||||
		goto fail_msgr;
 | 
							goto fail;
 | 
				
			||||||
	err = ceph_osdc_init(&client->osdc, client);
 | 
						err = ceph_osdc_init(&client->osdc, client);
 | 
				
			||||||
	if (err < 0)
 | 
						if (err < 0)
 | 
				
			||||||
		goto fail_monc;
 | 
							goto fail_monc;
 | 
				
			||||||
| 
						 | 
					@ -489,8 +485,6 @@ struct ceph_client *ceph_create_client(struct ceph_options *opt, void *private,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fail_monc:
 | 
					fail_monc:
 | 
				
			||||||
	ceph_monc_stop(&client->monc);
 | 
						ceph_monc_stop(&client->monc);
 | 
				
			||||||
fail_msgr:
 | 
					 | 
				
			||||||
	ceph_messenger_destroy(client->msgr);
 | 
					 | 
				
			||||||
fail:
 | 
					fail:
 | 
				
			||||||
	kfree(client);
 | 
						kfree(client);
 | 
				
			||||||
	return ERR_PTR(err);
 | 
						return ERR_PTR(err);
 | 
				
			||||||
| 
						 | 
					@ -515,8 +509,6 @@ void ceph_destroy_client(struct ceph_client *client)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ceph_debugfs_client_cleanup(client);
 | 
						ceph_debugfs_client_cleanup(client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ceph_messenger_destroy(client->msgr);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ceph_destroy_options(client->options);
 | 
						ceph_destroy_options(client->options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kfree(client);
 | 
						kfree(client);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2245,18 +2245,14 @@ static void ceph_fault(struct ceph_connection *con)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * create a new messenger instance
 | 
					 * initialize a new messenger instance
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
struct ceph_messenger *ceph_messenger_create(struct ceph_entity_addr *myaddr,
 | 
					void ceph_messenger_init(struct ceph_messenger *msgr,
 | 
				
			||||||
 | 
								struct ceph_entity_addr *myaddr,
 | 
				
			||||||
			u32 supported_features,
 | 
								u32 supported_features,
 | 
				
			||||||
					     u32 required_features)
 | 
								u32 required_features,
 | 
				
			||||||
 | 
								bool nocrc)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct ceph_messenger *msgr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	msgr = kzalloc(sizeof(*msgr), GFP_KERNEL);
 | 
					 | 
				
			||||||
	if (msgr == NULL)
 | 
					 | 
				
			||||||
		return ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	msgr->supported_features = supported_features;
 | 
						msgr->supported_features = supported_features;
 | 
				
			||||||
	msgr->required_features = required_features;
 | 
						msgr->required_features = required_features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2269,19 +2265,11 @@ struct ceph_messenger *ceph_messenger_create(struct ceph_entity_addr *myaddr,
 | 
				
			||||||
	msgr->inst.addr.type = 0;
 | 
						msgr->inst.addr.type = 0;
 | 
				
			||||||
	get_random_bytes(&msgr->inst.addr.nonce, sizeof(msgr->inst.addr.nonce));
 | 
						get_random_bytes(&msgr->inst.addr.nonce, sizeof(msgr->inst.addr.nonce));
 | 
				
			||||||
	encode_my_addr(msgr);
 | 
						encode_my_addr(msgr);
 | 
				
			||||||
 | 
						msgr->nocrc = nocrc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dout("messenger_create %p\n", msgr);
 | 
						dout("%s %p\n", __func__, msgr);
 | 
				
			||||||
	return msgr;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(ceph_messenger_create);
 | 
					EXPORT_SYMBOL(ceph_messenger_init);
 | 
				
			||||||
 | 
					 | 
				
			||||||
void ceph_messenger_destroy(struct ceph_messenger *msgr)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	dout("destroy %p\n", msgr);
 | 
					 | 
				
			||||||
	kfree(msgr);
 | 
					 | 
				
			||||||
	dout("destroyed messenger %p\n", msgr);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
EXPORT_SYMBOL(ceph_messenger_destroy);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void clear_standby(struct ceph_connection *con)
 | 
					static void clear_standby(struct ceph_connection *con)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -763,7 +763,7 @@ int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl)
 | 
				
			||||||
	monc->con = kmalloc(sizeof(*monc->con), GFP_KERNEL);
 | 
						monc->con = kmalloc(sizeof(*monc->con), GFP_KERNEL);
 | 
				
			||||||
	if (!monc->con)
 | 
						if (!monc->con)
 | 
				
			||||||
		goto out_monmap;
 | 
							goto out_monmap;
 | 
				
			||||||
	ceph_con_init(monc->client->msgr, monc->con);
 | 
						ceph_con_init(&monc->client->msgr, monc->con);
 | 
				
			||||||
	monc->con->private = monc;
 | 
						monc->con->private = monc;
 | 
				
			||||||
	monc->con->ops = &mon_con_ops;
 | 
						monc->con->ops = &mon_con_ops;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -880,8 +880,8 @@ static void handle_auth_reply(struct ceph_mon_client *monc,
 | 
				
			||||||
	} else if (!was_auth && monc->auth->ops->is_authenticated(monc->auth)) {
 | 
						} else if (!was_auth && monc->auth->ops->is_authenticated(monc->auth)) {
 | 
				
			||||||
		dout("authenticated, starting session\n");
 | 
							dout("authenticated, starting session\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		monc->client->msgr->inst.name.type = CEPH_ENTITY_TYPE_CLIENT;
 | 
							monc->client->msgr.inst.name.type = CEPH_ENTITY_TYPE_CLIENT;
 | 
				
			||||||
		monc->client->msgr->inst.name.num =
 | 
							monc->client->msgr.inst.name.num =
 | 
				
			||||||
					cpu_to_le64(monc->auth->global_id);
 | 
										cpu_to_le64(monc->auth->global_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		__send_subscribe(monc);
 | 
							__send_subscribe(monc);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -639,7 +639,7 @@ static struct ceph_osd *create_osd(struct ceph_osd_client *osdc)
 | 
				
			||||||
	INIT_LIST_HEAD(&osd->o_osd_lru);
 | 
						INIT_LIST_HEAD(&osd->o_osd_lru);
 | 
				
			||||||
	osd->o_incarnation = 1;
 | 
						osd->o_incarnation = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ceph_con_init(osdc->client->msgr, &osd->o_con);
 | 
						ceph_con_init(&osdc->client->msgr, &osd->o_con);
 | 
				
			||||||
	osd->o_con.private = osd;
 | 
						osd->o_con.private = osd;
 | 
				
			||||||
	osd->o_con.ops = &osd_con_ops;
 | 
						osd->o_con.ops = &osd_con_ops;
 | 
				
			||||||
	osd->o_con.peer_name.type = CEPH_ENTITY_TYPE_OSD;
 | 
						osd->o_con.peer_name.type = CEPH_ENTITY_TYPE_OSD;
 | 
				
			||||||
| 
						 | 
					@ -1391,7 +1391,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg)
 | 
				
			||||||
			     epoch, maplen);
 | 
								     epoch, maplen);
 | 
				
			||||||
			newmap = osdmap_apply_incremental(&p, next,
 | 
								newmap = osdmap_apply_incremental(&p, next,
 | 
				
			||||||
							  osdc->osdmap,
 | 
												  osdc->osdmap,
 | 
				
			||||||
							  osdc->client->msgr);
 | 
												  &osdc->client->msgr);
 | 
				
			||||||
			if (IS_ERR(newmap)) {
 | 
								if (IS_ERR(newmap)) {
 | 
				
			||||||
				err = PTR_ERR(newmap);
 | 
									err = PTR_ERR(newmap);
 | 
				
			||||||
				goto bad;
 | 
									goto bad;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue