]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ceph: call handle_cap_grant() for cap import message
authorYan, Zheng <zheng.z.yan@intel.com>
Mon, 19 Nov 2012 02:49:09 +0000 (10:49 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 Jan 2013 16:46:50 +0000 (08:46 -0800)
(cherry picked from commit 0e5e1774a92e6fe9c511585de8f078b4c4c68dbb)

If client sends cap message that requests new max size during
exporting caps, the exporting MDS will drop the message quietly.
So the client may wait for the reply that updates the max size
forever. call handle_cap_grant() for cap import message can
avoid this issue.

Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
Signed-off-by: Sage Weil <sage@inktank.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/ceph/caps.c

index cac471814f47a0d3e8b5d5afd26b53d3da421b58..6be9bf7e3a31f27005da29dc0cf1fc6e848107dc 100644 (file)
@@ -2749,6 +2749,7 @@ static void handle_cap_import(struct ceph_mds_client *mdsc,
 
        /* make sure we re-request max_size, if necessary */
        spin_lock(&ci->i_ceph_lock);
+       ci->i_wanted_max_size = 0;  /* reset */
        ci->i_requested_max_size = 0;
        spin_unlock(&ci->i_ceph_lock);
 }
@@ -2844,8 +2845,6 @@ void ceph_handle_caps(struct ceph_mds_session *session,
        case CEPH_CAP_OP_IMPORT:
                handle_cap_import(mdsc, inode, h, session,
                                  snaptrace, snaptrace_len);
-               ceph_check_caps(ceph_inode(inode), 0, session);
-               goto done_unlocked;
        }
 
        /* the rest require a cap */
@@ -2862,6 +2861,7 @@ void ceph_handle_caps(struct ceph_mds_session *session,
        switch (op) {
        case CEPH_CAP_OP_REVOKE:
        case CEPH_CAP_OP_GRANT:
+       case CEPH_CAP_OP_IMPORT:
                handle_cap_grant(inode, h, session, cap, msg->middle);
                goto done_unlocked;