Skip to content

Commit

Permalink
ceph: do not include cap/dentry releases in replayed messages
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
liewegas committed Jul 16, 2010
1 parent 01a92f1 commit e979cf5
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 0 deletions.
8 changes: 8 additions & 0 deletions fs/ceph/mds_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}

Expand Down
1 change: 1 addition & 0 deletions fs/ceph/mds_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,7 @@ struct ceph_mds_request {
int r_old_inode_drop, r_old_inode_unless;

struct ceph_msg *r_request; /* original request */
int r_request_release_offset;
struct ceph_msg *r_reply;
struct ceph_mds_reply_info_parsed r_reply_info;
int r_err;
Expand Down

0 comments on commit e979cf5

Please sign in to comment.