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

Commit 53ded495 authored by Alex Elder's avatar Alex Elder Committed by Sage Weil
Browse files

libceph: define mds_alloc_msg() method

The only user of the ceph messenger that doesn't define an alloc_msg
method is the mds client.  Define one, such that it works just like
it did before, and simplify ceph_con_in_msg_alloc() by assuming the
alloc_msg method is always present.

This and the next patch resolve:
    http://tracker.ceph.com/issues/4322



Signed-off-by: default avatarAlex Elder <elder@inktank.com>
Reviewed-by: default avatarGreg Farnum <greg@inktank.com>
parent 1d866d1c
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -3473,6 +3473,28 @@ static int invalidate_authorizer(struct ceph_connection *con)
	return ceph_monc_validate_auth(&mdsc->fsc->client->monc);
}

static struct ceph_msg *mds_alloc_msg(struct ceph_connection *con,
				struct ceph_msg_header *hdr, int *skip)
{
	struct ceph_msg *msg;
	int type = (int) le16_to_cpu(hdr->type);
	int front_len = (int) le32_to_cpu(hdr->front_len);

	if (con->in_msg)
		return con->in_msg;

	*skip = 0;
	msg = ceph_msg_new(type, front_len, GFP_NOFS, false);
	if (!msg) {
		pr_err("unable to allocate msg type %d len %d\n",
		       type, front_len);
		return NULL;
	}
	msg->page_alignment = (unsigned int) le16_to_cpu(hdr->data_off);

	return msg;
}

static const struct ceph_connection_operations mds_con_ops = {
	.get = con_get,
	.put = con_put,
@@ -3481,6 +3503,7 @@ static const struct ceph_connection_operations mds_con_ops = {
	.verify_authorizer_reply = verify_authorizer_reply,
	.invalidate_authorizer = invalidate_authorizer,
	.peer_reset = peer_reset,
	.alloc_msg = mds_alloc_msg,
};

/* eof */
+19 −40
Original line number Diff line number Diff line
@@ -2804,15 +2804,13 @@ static int ceph_alloc_middle(struct ceph_connection *con, struct ceph_msg *msg)
static int ceph_con_in_msg_alloc(struct ceph_connection *con, int *skip)
{
	struct ceph_msg_header *hdr = &con->in_hdr;
	int type = le16_to_cpu(hdr->type);
	int front_len = le32_to_cpu(hdr->front_len);
	int middle_len = le32_to_cpu(hdr->middle_len);
	struct ceph_msg *msg;
	int ret = 0;

	BUG_ON(con->in_msg != NULL);
	BUG_ON(!con->ops->alloc_msg);

	if (con->ops->alloc_msg) {
	mutex_unlock(&con->mutex);
	msg = con->ops->alloc_msg(con, hdr, skip);
	mutex_lock(&con->mutex);
@@ -2835,25 +2833,6 @@ static int ceph_con_in_msg_alloc(struct ceph_connection *con, int *skip)
			"error allocating memory for incoming message";
		return -ENOMEM;
	}
	}
	if (!con->in_msg) {
		mutex_unlock(&con->mutex);
		msg = ceph_msg_new(type, front_len, GFP_NOFS, false);
		mutex_lock(&con->mutex);
		if (!msg) {
			pr_err("unable to allocate msg type %d len %d\n",
			       type, front_len);
			return -ENOMEM;
		}
		if (con->state != CON_STATE_OPEN) {
			ceph_msg_put(msg);
			return -EAGAIN;
		}
		con->in_msg = msg;
		con->in_msg->con = con->ops->get(con);
		BUG_ON(con->in_msg->con == NULL);
		con->in_msg->page_alignment = le16_to_cpu(hdr->data_off);
	}
	memcpy(&con->in_msg->hdr, &con->in_hdr, sizeof(con->in_hdr));

	if (middle_len && !con->in_msg->middle) {