diff options
author | Alex Elder <elder@inktank.com> | 2013-03-01 19:00:14 -0500 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-05-02 00:16:19 -0400 |
commit | 53ded495c6ac9f79d9a7f91bac92ba977944306c (patch) | |
tree | 5ba298a77c6b8ca0678fd53fd1c087f7e3d43581 | |
parent | 1d866d1c31110db177cbd0636b95c4cb32ca2c6e (diff) |
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: Alex Elder <elder@inktank.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
-rw-r--r-- | fs/ceph/mds_client.c | 23 | ||||
-rw-r--r-- | net/ceph/messenger.c | 59 |
2 files changed, 42 insertions, 40 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 4efbc63e0bb6..b87b24fed4b2 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
@@ -3473,6 +3473,28 @@ static int invalidate_authorizer(struct ceph_connection *con) | |||
3473 | return ceph_monc_validate_auth(&mdsc->fsc->client->monc); | 3473 | return ceph_monc_validate_auth(&mdsc->fsc->client->monc); |
3474 | } | 3474 | } |
3475 | 3475 | ||
3476 | static struct ceph_msg *mds_alloc_msg(struct ceph_connection *con, | ||
3477 | struct ceph_msg_header *hdr, int *skip) | ||
3478 | { | ||
3479 | struct ceph_msg *msg; | ||
3480 | int type = (int) le16_to_cpu(hdr->type); | ||
3481 | int front_len = (int) le32_to_cpu(hdr->front_len); | ||
3482 | |||
3483 | if (con->in_msg) | ||
3484 | return con->in_msg; | ||
3485 | |||
3486 | *skip = 0; | ||
3487 | msg = ceph_msg_new(type, front_len, GFP_NOFS, false); | ||
3488 | if (!msg) { | ||
3489 | pr_err("unable to allocate msg type %d len %d\n", | ||
3490 | type, front_len); | ||
3491 | return NULL; | ||
3492 | } | ||
3493 | msg->page_alignment = (unsigned int) le16_to_cpu(hdr->data_off); | ||
3494 | |||
3495 | return msg; | ||
3496 | } | ||
3497 | |||
3476 | static const struct ceph_connection_operations mds_con_ops = { | 3498 | static const struct ceph_connection_operations mds_con_ops = { |
3477 | .get = con_get, | 3499 | .get = con_get, |
3478 | .put = con_put, | 3500 | .put = con_put, |
@@ -3481,6 +3503,7 @@ static const struct ceph_connection_operations mds_con_ops = { | |||
3481 | .verify_authorizer_reply = verify_authorizer_reply, | 3503 | .verify_authorizer_reply = verify_authorizer_reply, |
3482 | .invalidate_authorizer = invalidate_authorizer, | 3504 | .invalidate_authorizer = invalidate_authorizer, |
3483 | .peer_reset = peer_reset, | 3505 | .peer_reset = peer_reset, |
3506 | .alloc_msg = mds_alloc_msg, | ||
3484 | }; | 3507 | }; |
3485 | 3508 | ||
3486 | /* eof */ | 3509 | /* eof */ |
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 6ec6051e1672..c7d427876dbc 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
@@ -2804,55 +2804,34 @@ static int ceph_alloc_middle(struct ceph_connection *con, struct ceph_msg *msg) | |||
2804 | static int ceph_con_in_msg_alloc(struct ceph_connection *con, int *skip) | 2804 | static int ceph_con_in_msg_alloc(struct ceph_connection *con, int *skip) |
2805 | { | 2805 | { |
2806 | struct ceph_msg_header *hdr = &con->in_hdr; | 2806 | struct ceph_msg_header *hdr = &con->in_hdr; |
2807 | int type = le16_to_cpu(hdr->type); | ||
2808 | int front_len = le32_to_cpu(hdr->front_len); | ||
2809 | int middle_len = le32_to_cpu(hdr->middle_len); | 2807 | int middle_len = le32_to_cpu(hdr->middle_len); |
2810 | struct ceph_msg *msg; | 2808 | struct ceph_msg *msg; |
2811 | int ret = 0; | 2809 | int ret = 0; |
2812 | 2810 | ||
2813 | BUG_ON(con->in_msg != NULL); | 2811 | BUG_ON(con->in_msg != NULL); |
2812 | BUG_ON(!con->ops->alloc_msg); | ||
2814 | 2813 | ||
2815 | if (con->ops->alloc_msg) { | 2814 | mutex_unlock(&con->mutex); |
2816 | mutex_unlock(&con->mutex); | 2815 | msg = con->ops->alloc_msg(con, hdr, skip); |
2817 | msg = con->ops->alloc_msg(con, hdr, skip); | 2816 | mutex_lock(&con->mutex); |
2818 | mutex_lock(&con->mutex); | 2817 | if (con->state != CON_STATE_OPEN) { |
2819 | if (con->state != CON_STATE_OPEN) { | 2818 | if (msg) |
2820 | if (msg) | ||
2821 | ceph_msg_put(msg); | ||
2822 | return -EAGAIN; | ||
2823 | } | ||
2824 | con->in_msg = msg; | ||
2825 | if (con->in_msg) { | ||
2826 | con->in_msg->con = con->ops->get(con); | ||
2827 | BUG_ON(con->in_msg->con == NULL); | ||
2828 | } | ||
2829 | if (*skip) { | ||
2830 | con->in_msg = NULL; | ||
2831 | return 0; | ||
2832 | } | ||
2833 | if (!con->in_msg) { | ||
2834 | con->error_msg = | ||
2835 | "error allocating memory for incoming message"; | ||
2836 | return -ENOMEM; | ||
2837 | } | ||
2838 | } | ||
2839 | if (!con->in_msg) { | ||
2840 | mutex_unlock(&con->mutex); | ||
2841 | msg = ceph_msg_new(type, front_len, GFP_NOFS, false); | ||
2842 | mutex_lock(&con->mutex); | ||
2843 | if (!msg) { | ||
2844 | pr_err("unable to allocate msg type %d len %d\n", | ||
2845 | type, front_len); | ||
2846 | return -ENOMEM; | ||
2847 | } | ||
2848 | if (con->state != CON_STATE_OPEN) { | ||
2849 | ceph_msg_put(msg); | 2819 | ceph_msg_put(msg); |
2850 | return -EAGAIN; | 2820 | return -EAGAIN; |
2851 | } | 2821 | } |
2852 | con->in_msg = msg; | 2822 | con->in_msg = msg; |
2823 | if (con->in_msg) { | ||
2853 | con->in_msg->con = con->ops->get(con); | 2824 | con->in_msg->con = con->ops->get(con); |
2854 | BUG_ON(con->in_msg->con == NULL); | 2825 | BUG_ON(con->in_msg->con == NULL); |
2855 | con->in_msg->page_alignment = le16_to_cpu(hdr->data_off); | 2826 | } |
2827 | if (*skip) { | ||
2828 | con->in_msg = NULL; | ||
2829 | return 0; | ||
2830 | } | ||
2831 | if (!con->in_msg) { | ||
2832 | con->error_msg = | ||
2833 | "error allocating memory for incoming message"; | ||
2834 | return -ENOMEM; | ||
2856 | } | 2835 | } |
2857 | memcpy(&con->in_msg->hdr, &con->in_hdr, sizeof(con->in_hdr)); | 2836 | memcpy(&con->in_msg->hdr, &con->in_hdr, sizeof(con->in_hdr)); |
2858 | 2837 | ||