diff options
Diffstat (limited to 'net/ceph')
-rw-r--r-- | net/ceph/messenger.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 13b549b6b1bf..b6655b131558 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
@@ -2735,9 +2735,16 @@ static int ceph_con_in_msg_alloc(struct ceph_connection *con, int *skip) | |||
2735 | BUG_ON(con->in_msg != NULL); | 2735 | BUG_ON(con->in_msg != NULL); |
2736 | 2736 | ||
2737 | if (con->ops->alloc_msg) { | 2737 | if (con->ops->alloc_msg) { |
2738 | struct ceph_msg *msg; | ||
2739 | |||
2738 | mutex_unlock(&con->mutex); | 2740 | mutex_unlock(&con->mutex); |
2739 | con->in_msg = con->ops->alloc_msg(con, hdr, skip); | 2741 | msg = con->ops->alloc_msg(con, hdr, skip); |
2740 | mutex_lock(&con->mutex); | 2742 | mutex_lock(&con->mutex); |
2743 | if (con->state != CON_STATE_OPEN) { | ||
2744 | ceph_msg_put(msg); | ||
2745 | return -EAGAIN; | ||
2746 | } | ||
2747 | con->in_msg = msg; | ||
2741 | if (con->in_msg) { | 2748 | if (con->in_msg) { |
2742 | con->in_msg->con = con->ops->get(con); | 2749 | con->in_msg->con = con->ops->get(con); |
2743 | BUG_ON(con->in_msg->con == NULL); | 2750 | BUG_ON(con->in_msg->con == NULL); |