From bbd203bca402874c8081b7d8e49cf9e263025293 Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Mon, 7 Mar 2022 13:53:19 +0800 Subject: [PATCH] mds: make _need_flush_mdlog() check in both stable and unstable cases lock_state_any is true will ignore the lock state. Signed-off-by: Xiubo Li (cherry picked from commit 9ceaa3ae9621b7034c02fd57a28885b2b4652af9) --- src/mds/Locker.cc | 12 ++++++------ src/mds/Locker.h | 2 +- src/mds/SimpleLock.h | 5 +++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 503f65718da37..6329e1a42d4f2 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -2230,7 +2230,7 @@ Capability* Locker::issue_new_caps(CInode *in, // [auth] twiddle mode? eval(in, CEPH_CAP_LOCKS); - if (_need_flush_mdlog(in, my_want)) + if (_need_flush_mdlog(in, my_want, true)) mds->mdlog->flush(); } else { @@ -2934,18 +2934,18 @@ void Locker::share_inode_max_size(CInode *in, Capability *only_cap) } } -bool Locker::_need_flush_mdlog(CInode *in, int wanted) +bool Locker::_need_flush_mdlog(CInode *in, int wanted, bool lock_state_any) { /* flush log if caps are wanted by client but corresponding lock is unstable and locked by * pending mutations. */ if (((wanted & (CEPH_CAP_FILE_RD|CEPH_CAP_FILE_WR|CEPH_CAP_FILE_SHARED|CEPH_CAP_FILE_EXCL)) && - in->filelock.is_unstable_and_locked()) || + (lock_state_any ? in->filelock.is_locked() : in->filelock.is_unstable_and_locked())) || ((wanted & (CEPH_CAP_AUTH_SHARED|CEPH_CAP_AUTH_EXCL)) && - in->authlock.is_unstable_and_locked()) || + (lock_state_any ? in->authlock.is_locked() : in->authlock.is_unstable_and_locked())) || ((wanted & (CEPH_CAP_LINK_SHARED|CEPH_CAP_LINK_EXCL)) && - in->linklock.is_unstable_and_locked()) || + (lock_state_any ? in->linklock.is_locked() : in->linklock.is_unstable_and_locked())) || ((wanted & (CEPH_CAP_XATTR_SHARED|CEPH_CAP_XATTR_EXCL)) && - in->xattrlock.is_unstable_and_locked())) + (lock_state_any ? in->xattrlock.is_locked() : in->xattrlock.is_unstable_and_locked()))) return true; return false; } diff --git a/src/mds/Locker.h b/src/mds/Locker.h index c8ddaccd6a6a8..2dedde8e62563 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -212,7 +212,7 @@ protected: void scatter_writebehind_finish(ScatterLock *lock, MutationRef& mut); - bool _need_flush_mdlog(CInode *in, int wanted_caps); + bool _need_flush_mdlog(CInode *in, int wanted_caps, bool lock_state_any=false); void adjust_cap_wanted(Capability *cap, int wanted, int issue_seq); void handle_client_caps(const cref_t &m); void _update_cap_fields(CInode *in, int dirty, const cref_t &m, CInode::mempool_inode *pi); diff --git a/src/mds/SimpleLock.h b/src/mds/SimpleLock.h index 5c625b6af06f2..725c4488c17f0 100644 --- a/src/mds/SimpleLock.h +++ b/src/mds/SimpleLock.h @@ -256,8 +256,9 @@ public: return get_sm()->states[state].next == 0; } bool is_unstable_and_locked() const { - if (is_stable()) - return false; + return (!is_stable() && is_locked()); + } + bool is_locked() const { return is_rdlocked() || is_wrlocked() || is_xlocked(); } int get_next_state() { -- 2.39.5