ceph: make sure flushsnap messages are sent in proper order
authorYan, Zheng <zyan@redhat.com>
Tue, 15 Aug 2017 03:37:32 +0000 (11:37 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Wed, 6 Sep 2017 17:56:47 +0000 (19:56 +0200)
Before sending new flushsnap message, check if there are old
flushsnap messages that need to be re-sent. If there are, re-send
old messages first. This guarantees ordering of flushsnap messages.

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/caps.c

index 19b97b4..f1c5691 100644 (file)
@@ -1457,6 +1457,12 @@ retry:
                goto retry;
        }
 
+       // make sure flushsnap messages are sent in proper order.
+       if (ci->i_ceph_flags & CEPH_I_KICK_FLUSH) {
+               __kick_flushing_caps(mdsc, session, ci, 0);
+               ci->i_ceph_flags &= ~CEPH_I_KICK_FLUSH;
+       }
+
        __ceph_flush_snaps(ci, session);
 out:
        spin_unlock(&ci->i_ceph_lock);
@@ -1904,11 +1910,7 @@ ack:
                    (ci->i_ceph_flags &
                     (CEPH_I_KICK_FLUSH | CEPH_I_FLUSH_SNAPS))) {
                        if (ci->i_ceph_flags & CEPH_I_KICK_FLUSH) {
-                               spin_lock(&mdsc->cap_dirty_lock);
-                               oldest_flush_tid = __get_oldest_flush_tid(mdsc);
-                               spin_unlock(&mdsc->cap_dirty_lock);
-                               __kick_flushing_caps(mdsc, session, ci,
-                                                    oldest_flush_tid);
+                               __kick_flushing_caps(mdsc, session, ci, 0);
                                ci->i_ceph_flags &= ~CEPH_I_KICK_FLUSH;
                        }
                        if (ci->i_ceph_flags & CEPH_I_FLUSH_SNAPS)