]> Pileus Git - ~andy/linux/blobdiff - fs/ceph/caps.c
Merge branch 'master' into for-3.9-async
[~andy/linux] / fs / ceph / caps.c
index 3251e9cc64014fc99f7660d46388427732c88114..a1d9bb30c1bf9fc5460286ff465e2bcbc338bf30 100644 (file)
@@ -236,8 +236,10 @@ static struct ceph_cap *get_cap(struct ceph_mds_client *mdsc,
        if (!ctx) {
                cap = kmem_cache_alloc(ceph_cap_cachep, GFP_NOFS);
                if (cap) {
+                       spin_lock(&mdsc->caps_list_lock);
                        mdsc->caps_use_count++;
                        mdsc->caps_total_count++;
+                       spin_unlock(&mdsc->caps_list_lock);
                }
                return cap;
        }
@@ -1349,11 +1351,15 @@ int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask)
                if (!ci->i_head_snapc)
                        ci->i_head_snapc = ceph_get_snap_context(
                                ci->i_snap_realm->cached_context);
-               dout(" inode %p now dirty snapc %p\n", &ci->vfs_inode,
-                       ci->i_head_snapc);
+               dout(" inode %p now dirty snapc %p auth cap %p\n",
+                    &ci->vfs_inode, ci->i_head_snapc, ci->i_auth_cap);
                BUG_ON(!list_empty(&ci->i_dirty_item));
                spin_lock(&mdsc->cap_dirty_lock);
-               list_add(&ci->i_dirty_item, &mdsc->cap_dirty);
+               if (ci->i_auth_cap)
+                       list_add(&ci->i_dirty_item, &mdsc->cap_dirty);
+               else
+                       list_add(&ci->i_dirty_item,
+                                &mdsc->cap_dirty_migrating);
                spin_unlock(&mdsc->cap_dirty_lock);
                if (ci->i_flushing_caps == 0) {
                        ihold(inode);
@@ -2388,7 +2394,7 @@ static void handle_cap_grant(struct inode *inode, struct ceph_mds_caps *grant,
                            &atime);
 
        /* max size increase? */
-       if (max_size != ci->i_max_size) {
+       if (ci->i_auth_cap == cap && max_size != ci->i_max_size) {
                dout("max_size %lld -> %llu\n", ci->i_max_size, max_size);
                ci->i_max_size = max_size;
                if (max_size >= ci->i_wanted_max_size) {
@@ -2745,6 +2751,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);
 }
@@ -2840,8 +2847,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 */
@@ -2858,6 +2863,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;