aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph/messenger.c
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@hq.newdream.net>2010-01-11 17:47:13 -0500
committerSage Weil <sage@newdream.net>2010-01-25 15:57:46 -0500
commit0547a9b30a5ac8680325752b61d3ffa9d4971b6e (patch)
tree0e54e227d44fab7b98c97ee4c3bed185a1238487 /fs/ceph/messenger.c
parent9d7f0f139edfdce1a1539b100c617fd9182b0829 (diff)
ceph: alloc message data pages and check if tid exists
Now doing it in the same callback that is also responsible for allocating the 'front' part of the message. If we get a message that we haven't got a corresponding tid for, mark it for skipping. Moving the mutex unlock/lock from the osd alloc_msg callback to the calling function in the messenger. Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net>
Diffstat (limited to 'fs/ceph/messenger.c')
-rw-r--r--fs/ceph/messenger.c33
1 files changed, 2 insertions, 31 deletions
diff --git a/fs/ceph/messenger.c b/fs/ceph/messenger.c
index e8742cc9ecdf..f708803e6857 100644
--- a/fs/ceph/messenger.c
+++ b/fs/ceph/messenger.c
@@ -2114,25 +2114,6 @@ static int ceph_alloc_middle(struct ceph_connection *con, struct ceph_msg *msg)
2114 return 0; 2114 return 0;
2115} 2115}
2116 2116
2117static int ceph_alloc_data_section(struct ceph_connection *con, struct ceph_msg *msg)
2118{
2119 int ret;
2120 int want;
2121 int data_len = le32_to_cpu(msg->hdr.data_len);
2122 unsigned data_off = le16_to_cpu(msg->hdr.data_off);
2123
2124 want = calc_pages_for(data_off & ~PAGE_MASK, data_len);
2125 ret = -1;
2126 mutex_unlock(&con->mutex);
2127 if (con->ops->prepare_pages)
2128 ret = con->ops->prepare_pages(con, msg, want);
2129 mutex_lock(&con->mutex);
2130
2131 BUG_ON(msg->nr_pages < want);
2132
2133 return ret;
2134}
2135
2136/* 2117/*
2137 * Generic message allocator, for incoming messages. 2118 * Generic message allocator, for incoming messages.
2138 */ 2119 */
@@ -2143,12 +2124,13 @@ static struct ceph_msg *ceph_alloc_msg(struct ceph_connection *con,
2143 int type = le16_to_cpu(hdr->type); 2124 int type = le16_to_cpu(hdr->type);
2144 int front_len = le32_to_cpu(hdr->front_len); 2125 int front_len = le32_to_cpu(hdr->front_len);
2145 int middle_len = le32_to_cpu(hdr->middle_len); 2126 int middle_len = le32_to_cpu(hdr->middle_len);
2146 int data_len = le32_to_cpu(hdr->data_len);
2147 struct ceph_msg *msg = NULL; 2127 struct ceph_msg *msg = NULL;
2148 int ret; 2128 int ret;
2149 2129
2150 if (con->ops->alloc_msg) { 2130 if (con->ops->alloc_msg) {
2131 mutex_unlock(&con->mutex);
2151 msg = con->ops->alloc_msg(con, hdr, skip); 2132 msg = con->ops->alloc_msg(con, hdr, skip);
2133 mutex_lock(&con->mutex);
2152 if (IS_ERR(msg)) 2134 if (IS_ERR(msg))
2153 return msg; 2135 return msg;
2154 2136
@@ -2175,17 +2157,6 @@ static struct ceph_msg *ceph_alloc_msg(struct ceph_connection *con,
2175 } 2157 }
2176 } 2158 }
2177 2159
2178 if (data_len) {
2179 ret = ceph_alloc_data_section(con, msg);
2180
2181 if (ret < 0) {
2182 *skip = 1;
2183 ceph_msg_put(msg);
2184 return NULL;
2185 }
2186 }
2187
2188
2189 return msg; 2160 return msg;
2190} 2161}
2191 2162