diff options
author | Yan, Zheng <zyan@redhat.com> | 2015-02-26 19:54:08 -0500 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2015-04-20 10:30:22 -0400 |
commit | 6e6f09231a134e7523514ed504380f5caafc9334 (patch) | |
tree | a30c557f5f3dd51664c9624e352fbd01ce904f2c /fs/ceph | |
parent | 39a8804455fb23f09157341d3ba7db6d7ae6ee76 (diff) |
ceph: drop cap releases in requests composed before cap reconnect
These cap releases are stale because MDS will re-establish client
caps according to the cap reconnect messages.
Note: MDS can detect stale cap messages, so these stale cap
releases are harmless even we don't drop them.
Signed-off-by: Yan, Zheng <zyan@redhat.com>
Diffstat (limited to 'fs/ceph')
-rw-r--r-- | fs/ceph/mds_client.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 71c073f38e54..0a1a9e452148 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
@@ -1853,7 +1853,7 @@ static int set_request_path_attr(struct inode *rinode, struct dentry *rdentry, | |||
1853 | */ | 1853 | */ |
1854 | static struct ceph_msg *create_request_message(struct ceph_mds_client *mdsc, | 1854 | static struct ceph_msg *create_request_message(struct ceph_mds_client *mdsc, |
1855 | struct ceph_mds_request *req, | 1855 | struct ceph_mds_request *req, |
1856 | int mds) | 1856 | int mds, bool drop_cap_releases) |
1857 | { | 1857 | { |
1858 | struct ceph_msg *msg; | 1858 | struct ceph_msg *msg; |
1859 | struct ceph_mds_request_head *head; | 1859 | struct ceph_mds_request_head *head; |
@@ -1937,6 +1937,12 @@ static struct ceph_msg *create_request_message(struct ceph_mds_client *mdsc, | |||
1937 | releases += ceph_encode_inode_release(&p, | 1937 | releases += ceph_encode_inode_release(&p, |
1938 | req->r_old_dentry->d_inode, | 1938 | req->r_old_dentry->d_inode, |
1939 | mds, req->r_old_inode_drop, req->r_old_inode_unless, 0); | 1939 | mds, req->r_old_inode_drop, req->r_old_inode_unless, 0); |
1940 | |||
1941 | if (drop_cap_releases) { | ||
1942 | releases = 0; | ||
1943 | p = msg->front.iov_base + req->r_request_release_offset; | ||
1944 | } | ||
1945 | |||
1940 | head->num_releases = cpu_to_le16(releases); | 1946 | head->num_releases = cpu_to_le16(releases); |
1941 | 1947 | ||
1942 | /* time stamp */ | 1948 | /* time stamp */ |
@@ -1989,7 +1995,7 @@ static void complete_request(struct ceph_mds_client *mdsc, | |||
1989 | */ | 1995 | */ |
1990 | static int __prepare_send_request(struct ceph_mds_client *mdsc, | 1996 | static int __prepare_send_request(struct ceph_mds_client *mdsc, |
1991 | struct ceph_mds_request *req, | 1997 | struct ceph_mds_request *req, |
1992 | int mds) | 1998 | int mds, bool drop_cap_releases) |
1993 | { | 1999 | { |
1994 | struct ceph_mds_request_head *rhead; | 2000 | struct ceph_mds_request_head *rhead; |
1995 | struct ceph_msg *msg; | 2001 | struct ceph_msg *msg; |
@@ -2048,7 +2054,7 @@ static int __prepare_send_request(struct ceph_mds_client *mdsc, | |||
2048 | ceph_msg_put(req->r_request); | 2054 | ceph_msg_put(req->r_request); |
2049 | req->r_request = NULL; | 2055 | req->r_request = NULL; |
2050 | } | 2056 | } |
2051 | msg = create_request_message(mdsc, req, mds); | 2057 | msg = create_request_message(mdsc, req, mds, drop_cap_releases); |
2052 | if (IS_ERR(msg)) { | 2058 | if (IS_ERR(msg)) { |
2053 | req->r_err = PTR_ERR(msg); | 2059 | req->r_err = PTR_ERR(msg); |
2054 | complete_request(mdsc, req); | 2060 | complete_request(mdsc, req); |
@@ -2132,7 +2138,7 @@ static int __do_request(struct ceph_mds_client *mdsc, | |||
2132 | if (req->r_request_started == 0) /* note request start time */ | 2138 | if (req->r_request_started == 0) /* note request start time */ |
2133 | req->r_request_started = jiffies; | 2139 | req->r_request_started = jiffies; |
2134 | 2140 | ||
2135 | err = __prepare_send_request(mdsc, req, mds); | 2141 | err = __prepare_send_request(mdsc, req, mds, false); |
2136 | if (!err) { | 2142 | if (!err) { |
2137 | ceph_msg_get(req->r_request); | 2143 | ceph_msg_get(req->r_request); |
2138 | ceph_con_send(&session->s_con, req->r_request); | 2144 | ceph_con_send(&session->s_con, req->r_request); |
@@ -2658,7 +2664,7 @@ static void replay_unsafe_requests(struct ceph_mds_client *mdsc, | |||
2658 | 2664 | ||
2659 | mutex_lock(&mdsc->mutex); | 2665 | mutex_lock(&mdsc->mutex); |
2660 | list_for_each_entry_safe(req, nreq, &session->s_unsafe, r_unsafe_item) { | 2666 | list_for_each_entry_safe(req, nreq, &session->s_unsafe, r_unsafe_item) { |
2661 | err = __prepare_send_request(mdsc, req, session->s_mds); | 2667 | err = __prepare_send_request(mdsc, req, session->s_mds, true); |
2662 | if (!err) { | 2668 | if (!err) { |
2663 | ceph_msg_get(req->r_request); | 2669 | ceph_msg_get(req->r_request); |
2664 | ceph_con_send(&session->s_con, req->r_request); | 2670 | ceph_con_send(&session->s_con, req->r_request); |
@@ -2679,7 +2685,8 @@ static void replay_unsafe_requests(struct ceph_mds_client *mdsc, | |||
2679 | continue; /* only old requests */ | 2685 | continue; /* only old requests */ |
2680 | if (req->r_session && | 2686 | if (req->r_session && |
2681 | req->r_session->s_mds == session->s_mds) { | 2687 | req->r_session->s_mds == session->s_mds) { |
2682 | err = __prepare_send_request(mdsc, req, session->s_mds); | 2688 | err = __prepare_send_request(mdsc, req, |
2689 | session->s_mds, true); | ||
2683 | if (!err) { | 2690 | if (!err) { |
2684 | ceph_msg_get(req->r_request); | 2691 | ceph_msg_get(req->r_request); |
2685 | ceph_con_send(&session->s_con, req->r_request); | 2692 | ceph_con_send(&session->s_con, req->r_request); |