Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6ab00d46 authored by Sage Weil's avatar Sage Weil
Browse files

libceph: create messenger with client



This simplifies the init/shutdown paths, and makes client->msgr available
during the rest of the setup process.

Signed-off-by: default avatarSage Weil <sage@newdream.net>
parent 6a8ea470
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -260,7 +260,7 @@ static struct rbd_client *rbd_client_create(struct ceph_options *opt,
	kref_init(&rbdc->kref);
	INIT_LIST_HEAD(&rbdc->node);

	rbdc->client = ceph_create_client(opt, rbdc);
	rbdc->client = ceph_create_client(opt, rbdc, 0, 0);
	if (IS_ERR(rbdc->client))
		goto out_rbdc;
	opt = NULL; /* Now rbdc->client is responsible for opt */
+6 −3
Original line number Diff line number Diff line
@@ -430,20 +430,23 @@ struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt,
					struct ceph_options *opt)
{
	struct ceph_fs_client *fsc;
	const unsigned supported_features =
		CEPH_FEATURE_FLOCK |
		CEPH_FEATURE_DIRLAYOUTHASH;
	const unsigned required_features = 0;
	int err = -ENOMEM;

	fsc = kzalloc(sizeof(*fsc), GFP_KERNEL);
	if (!fsc)
		return ERR_PTR(-ENOMEM);

	fsc->client = ceph_create_client(opt, fsc);
	fsc->client = ceph_create_client(opt, fsc, supported_features,
					 required_features);
	if (IS_ERR(fsc->client)) {
		err = PTR_ERR(fsc->client);
		goto fail;
	}
	fsc->client->extra_mon_dispatch = extra_mon_dispatch;
	fsc->client->supported_features |= CEPH_FEATURE_FLOCK |
		CEPH_FEATURE_DIRLAYOUTHASH;
	fsc->client->monc.want_mdsmap = 1;

	fsc->mount_options = fsopt;
+3 −1
Original line number Diff line number Diff line
@@ -215,7 +215,9 @@ extern void ceph_destroy_options(struct ceph_options *opt);
extern int ceph_compare_options(struct ceph_options *new_opt,
				struct ceph_client *client);
extern struct ceph_client *ceph_create_client(struct ceph_options *opt,
					      void *private);
					      void *private,
					      unsigned supported_features,
					      unsigned required_features);
extern u64 ceph_client_id(struct ceph_client *client);
extern void ceph_destroy_client(struct ceph_client *client);
extern int __ceph_open_session(struct ceph_client *client,
+24 −23
Original line number Diff line number Diff line
@@ -432,9 +432,12 @@ EXPORT_SYMBOL(ceph_client_id);
/*
 * create a fresh client instance
 */
struct ceph_client *ceph_create_client(struct ceph_options *opt, void *private)
struct ceph_client *ceph_create_client(struct ceph_options *opt, void *private,
				       unsigned supported_features,
				       unsigned required_features)
{
	struct ceph_client *client;
	struct ceph_entity_addr *myaddr = NULL;
	int err = -ENOMEM;

	client = kzalloc(sizeof(*client), GFP_KERNEL);
@@ -449,15 +452,27 @@ struct ceph_client *ceph_create_client(struct ceph_options *opt, void *private)
	client->auth_err = 0;

	client->extra_mon_dispatch = NULL;
	client->supported_features = CEPH_FEATURE_SUPPORTED_DEFAULT;
	client->required_features = CEPH_FEATURE_REQUIRED_DEFAULT;
	client->supported_features = CEPH_FEATURE_SUPPORTED_DEFAULT |
		supported_features;
	client->required_features = CEPH_FEATURE_REQUIRED_DEFAULT |
		required_features;

	client->msgr = NULL;
	/* msgr */
	if (ceph_test_opt(client, MYIP))
		myaddr = &client->options->my_addr;
	client->msgr = ceph_messenger_create(myaddr,
					     client->supported_features,
					     client->required_features);
	if (IS_ERR(client->msgr)) {
		err = PTR_ERR(client->msgr);
		goto fail;
	}
	client->msgr->nocrc = ceph_test_opt(client, NOCRC);

	/* subsystems */
	err = ceph_monc_init(&client->monc, client);
	if (err < 0)
		goto fail;
		goto fail_msgr;
	err = ceph_osdc_init(&client->osdc, client);
	if (err < 0)
		goto fail_monc;
@@ -466,6 +481,8 @@ struct ceph_client *ceph_create_client(struct ceph_options *opt, void *private)

fail_monc:
	ceph_monc_stop(&client->monc);
fail_msgr:
	ceph_messenger_destroy(client->msgr);
fail:
	kfree(client);
	return ERR_PTR(err);
@@ -490,7 +507,6 @@ void ceph_destroy_client(struct ceph_client *client)

	ceph_debugfs_client_cleanup(client);

	if (client->msgr)
	ceph_messenger_destroy(client->msgr);

	ceph_destroy_options(client->options);
@@ -514,24 +530,9 @@ static int have_mon_and_osd_map(struct ceph_client *client)
 */
int __ceph_open_session(struct ceph_client *client, unsigned long started)
{
	struct ceph_entity_addr *myaddr = NULL;
	int err;
	unsigned long timeout = client->options->mount_timeout * HZ;

	/* initialize the messenger */
	if (client->msgr == NULL) {
		if (ceph_test_opt(client, MYIP))
			myaddr = &client->options->my_addr;
		client->msgr = ceph_messenger_create(myaddr,
					client->supported_features,
					client->required_features);
		if (IS_ERR(client->msgr)) {
			client->msgr = NULL;
			return PTR_ERR(client->msgr);
		}
		client->msgr->nocrc = ceph_test_opt(client, NOCRC);
	}

	/* open session, and wait for mon and osd maps */
	err = ceph_monc_open_session(&client->monc);
	if (err < 0)