summaryrefslogtreecommitdiffstats
path: root/fs/ceph/mds_client.c
diff options
context:
space:
mode:
authorSage Weil2010-07-15 23:58:39 +0200
committerSage Weil2010-07-16 19:30:18 +0200
commite979cf50395e24c4bdd489f60e2d5dd5ae66d255 (patch)
tree5d26b26b4b7eb9bed0812800ea4d2d5704c5eaa3 /fs/ceph/mds_client.c
parentceph: reuse request message when replaying against recovering mds (diff)
downloadkernel-qcow2-linux-e979cf50395e24c4bdd489f60e2d5dd5ae66d255.tar.gz
kernel-qcow2-linux-e979cf50395e24c4bdd489f60e2d5dd5ae66d255.tar.xz
kernel-qcow2-linux-e979cf50395e24c4bdd489f60e2d5dd5ae66d255.zip
ceph: do not include cap/dentry releases in replayed messages
Strip the cap and dentry releases from replayed messages. They can cause the shared state to get out of sync because they were generated (with the request message) earlier, and no longer reflect the current client state. Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph/mds_client.c')
-rw-r--r--fs/ceph/mds_client.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 23332bc44515..416c08d315db 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -1514,6 +1514,9 @@ static struct ceph_msg *create_request_message(struct ceph_mds_client *mdsc,
ceph_encode_filepath(&p, end, ino1, path1);
ceph_encode_filepath(&p, end, ino2, path2);
+ /* make note of release offset, in case we need to replay */
+ req->r_request_release_offset = p - msg->front.iov_base;
+
/* cap releases */
releases = 0;
if (req->r_inode_drop)
@@ -1598,6 +1601,11 @@ static int __prepare_send_request(struct ceph_mds_client *mdsc,
rhead->ino = cpu_to_le64(ceph_ino(req->r_target_inode));
rhead->num_retry = req->r_attempts - 1;
+
+ /* remove cap/dentry releases from message */
+ rhead->num_releases = 0;
+ msg->hdr.front_len = cpu_to_le32(req->r_request_release_offset);
+ msg->front.iov_len = req->r_request_release_offset;
return 0;
}