aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2015-02-26 19:54:08 -0500
committerIlya Dryomov <idryomov@gmail.com>2015-04-20 10:30:22 -0400
commit6e6f09231a134e7523514ed504380f5caafc9334 (patch)
treea30c557f5f3dd51664c9624e352fbd01ce904f2c /fs/ceph
parent39a8804455fb23f09157341d3ba7db6d7ae6ee76 (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.c19
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 */
1854static struct ceph_msg *create_request_message(struct ceph_mds_client *mdsc, 1854static 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 */
1990static int __prepare_send_request(struct ceph_mds_client *mdsc, 1996static 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);