ceph: don't mark dirty caps when there is no auth cap
authorYan, Zheng <zyan@redhat.com>
Tue, 24 Mar 2015 03:36:08 +0000 (11:36 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 20 Apr 2015 15:55:36 +0000 (18:55 +0300)
No i_auth_cap means reconnecting to MDS was denied. So don't
add new dirty caps.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
fs/ceph/caps.c
fs/ceph/mds_client.c

index 4ddadc13d162291134a30c41dee4180975b1a92d..37a42353b9834a5e87414f24f4f6d9fe0eb5cf95 100644 (file)
@@ -1404,6 +1404,13 @@ int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask)
        int was = ci->i_dirty_caps;
        int dirty = 0;
 
+       if (!ci->i_auth_cap) {
+               pr_warn("__mark_dirty_caps %p %llx mask %s, "
+                       "but no auth cap (session was closed?)\n",
+                       inode, ceph_ino(inode), ceph_cap_string(mask));
+               return 0;
+       }
+
        dout("__mark_dirty_caps %p %s dirty %s -> %s\n", &ci->vfs_inode,
             ceph_cap_string(mask), ceph_cap_string(was),
             ceph_cap_string(was | mask));
@@ -1414,7 +1421,6 @@ int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask)
                                ci->i_snap_realm->cached_context);
                dout(" inode %p now dirty snapc %p auth cap %p\n",
                     &ci->vfs_inode, ci->i_head_snapc, ci->i_auth_cap);
-               WARN_ON(!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);
index 0122491d947cdc8f4324ec3ec70be7bc88ffce61..0cfc2d16354917e00ab3ca42dc831b2faedaf48c 100644 (file)
@@ -1098,7 +1098,7 @@ static int remove_session_caps_cb(struct inode *inode, struct ceph_cap *cap,
             cap, ci, &ci->vfs_inode);
        spin_lock(&ci->i_ceph_lock);
        __ceph_remove_cap(cap, false);
-       if (!__ceph_is_any_real_caps(ci)) {
+       if (!ci->i_auth_cap) {
                struct ceph_mds_client *mdsc =
                        ceph_sb_to_client(inode->i_sb)->mdsc;