ceph: avoid sending duplicated cap flush message
authorYan, Zheng <zyan@redhat.com>
Tue, 5 Jul 2016 08:45:21 +0000 (16:45 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Thu, 28 Jul 2016 01:00:43 +0000 (03:00 +0200)
make ceph_kick_flushing_caps() ignore inodes whose cap flushes
have already been re-sent by ceph_early_kick_flushing_caps()

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

index 0ac6047..f12d59d 100644 (file)
@@ -2107,8 +2107,11 @@ void ceph_early_kick_flushing_caps(struct ceph_mds_client *mdsc,
                 */
                if ((cap->issued & ci->i_flushing_caps) !=
                    ci->i_flushing_caps) {
+                       ci->i_ceph_flags &= ~CEPH_I_KICK_FLUSH;
                        __kick_flushing_caps(mdsc, session, ci,
                                             oldest_flush_tid);
+               } else {
+                       ci->i_ceph_flags |= CEPH_I_KICK_FLUSH;
                }
 
                spin_unlock(&ci->i_ceph_lock);
@@ -2119,6 +2122,7 @@ void ceph_kick_flushing_caps(struct ceph_mds_client *mdsc,
                             struct ceph_mds_session *session)
 {
        struct ceph_inode_info *ci;
+       struct ceph_cap *cap;
        u64 oldest_flush_tid;
 
        dout("kick_flushing_caps mds%d\n", session->s_mds);
@@ -2129,7 +2133,18 @@ void ceph_kick_flushing_caps(struct ceph_mds_client *mdsc,
 
        list_for_each_entry(ci, &session->s_cap_flushing, i_flushing_item) {
                spin_lock(&ci->i_ceph_lock);
-               __kick_flushing_caps(mdsc, session, ci, oldest_flush_tid);
+               cap = ci->i_auth_cap;
+               if (!(cap && cap->session == session)) {
+                       pr_err("%p auth cap %p not mds%d ???\n",
+                               &ci->vfs_inode, cap, session->s_mds);
+                       spin_unlock(&ci->i_ceph_lock);
+                       continue;
+               }
+               if (ci->i_ceph_flags & CEPH_I_KICK_FLUSH) {
+                       ci->i_ceph_flags &= ~CEPH_I_KICK_FLUSH;
+                       __kick_flushing_caps(mdsc, session, ci,
+                                            oldest_flush_tid);
+               }
                spin_unlock(&ci->i_ceph_lock);
        }
 }
@@ -2154,6 +2169,7 @@ static void kick_flushing_inode_caps(struct ceph_mds_client *mdsc,
                oldest_flush_tid = __get_oldest_flush_tid(mdsc);
                spin_unlock(&mdsc->cap_dirty_lock);
 
+               ci->i_ceph_flags &= ~CEPH_I_KICK_FLUSH;
                __kick_flushing_caps(mdsc, session, ci, oldest_flush_tid);
                spin_unlock(&ci->i_ceph_lock);
        } else {
index 08ed512..1606878 100644 (file)
@@ -468,6 +468,7 @@ static inline struct inode *ceph_find_inode(struct super_block *sb,
 #define CEPH_I_POOL_WR         (1 << 6)  /* can write to pool */
 #define CEPH_I_SEC_INITED      (1 << 7)  /* security initialized */
 #define CEPH_I_CAP_DROPPED     (1 << 8)  /* caps were forcibly dropped */
+#define CEPH_I_KICK_FLUSH      (1 << 9)  /* kick flushing caps */
 
 static inline void __ceph_dir_set_complete(struct ceph_inode_info *ci,
                                           long long release_count,