diff options
Diffstat (limited to 'net/ceph/messenger.c')
-rw-r--r-- | net/ceph/messenger.c | 59 |
1 files changed, 19 insertions, 40 deletions
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 | ||