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 | ||
