From: Greg Farnum Date: Fri, 29 Jul 2011 00:12:28 +0000 (-0700) Subject: scatterlock: compress boolean flags into a set of state flags X-Git-Tag: v0.33~88 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=925cb462f969bdec11a57af1d767601e846f1bb4;p=ceph.git scatterlock: compress boolean flags into a set of state flags While we're at it, unify the naming structure a bit and remove the unused stale flag. Signed-off-by: Greg Farnum --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 58bb039b1e15..4fcfedc8d423 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -1461,9 +1461,9 @@ bool CInode::is_dirty_scattered() void CInode::clear_scatter_dirty() { - filelock.clear_dirty(); - nestlock.clear_dirty(); - dirfragtreelock.clear_dirty(); + filelock.remove_dirty(); + nestlock.remove_dirty(); + dirfragtreelock.remove_dirty(); } void CInode::clear_dirty_scattered(int type) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 9bc39703355c..9832a0dced28 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -231,9 +231,9 @@ void MDCache::remove_inode(CInode *o) if (o->is_dirty()) o->mark_clean(); - o->filelock.clear_dirty(); - o->nestlock.clear_dirty(); - o->dirfragtreelock.clear_dirty(); + o->filelock.remove_dirty(); + o->nestlock.remove_dirty(); + o->dirfragtreelock.remove_dirty(); o->item_open_file.remove_myself(); @@ -3140,9 +3140,9 @@ void MDCache::recalc_auth_bits() dnl->get_inode()->mark_clean(); // avoid touching scatterlocks for our subtree roots! if (subtree_inodes.count(dnl->get_inode()) == 0) { - dnl->get_inode()->filelock.clear_dirty(); - dnl->get_inode()->nestlock.clear_dirty(); - dnl->get_inode()->dirfragtreelock.clear_dirty(); + dnl->get_inode()->filelock.remove_dirty(); + dnl->get_inode()->nestlock.remove_dirty(); + dnl->get_inode()->dirfragtreelock.remove_dirty(); } } diff --git a/src/mds/ScatterLock.h b/src/mds/ScatterLock.h index 3c74bccb7863..699621099444 100644 --- a/src/mds/ScatterLock.h +++ b/src/mds/ScatterLock.h @@ -21,26 +21,20 @@ class ScatterLock : public SimpleLock { struct more_bits_t { - bool dirty, flushing, flushed; int state_flags; utime_t last_scatter; xlist::item item_updated; utime_t update_stamp; - bool stale; more_bits_t(ScatterLock *lock) : - dirty(false), flushing(false), flushed(false), state_flags(0), - item_updated(lock), stale(false) + state_flags(0), + item_updated(lock) {} bool empty() const { return - dirty == false && - flushing == false && - flushed == false && !state_flags && - !item_updated.is_on_list() && - !stale; + !item_updated.is_on_list(); } }; more_bits_t *_more; @@ -64,7 +58,6 @@ class ScatterLock : public SimpleLock { DIRTY = 1 << 2, FLUSHING = 1 << 3, FLUSHED = 1 << 4, - STALE = 1 << 5 }; public: @@ -120,10 +113,12 @@ public: void clear_scatter_wanted() { if (have_more()) _more->state_flags &= ~SCATTER_WANTED; + try_clear_more(); } void clear_unscatter_wanted() { if (have_more()) _more->state_flags &= ~UNSCATTER_WANTED; + try_clear_more(); } bool get_scatter_wanted() const { return have_more() ? _more->state_flags & SCATTER_WANTED : false; @@ -133,46 +128,48 @@ public: } bool is_dirty() const { - return have_more() ? _more->dirty : false; + return have_more() ? _more->state_flags & DIRTY : false; } bool is_flushing() const { - return have_more() ? _more->flushing : false; + return have_more() ? _more->state_flags & FLUSHING: false; } bool is_flushed() const { - return have_more() ? _more->flushed : false; + return have_more() ? _more->state_flags & FLUSHED: false; } bool is_dirty_or_flushing() const { - return have_more() ? (_more->dirty || _more->flushing) : false; + return have_more() ? (is_dirty() || is_flushing()) : false; } void mark_dirty() { - if (!more()->dirty) { - if (!_more->flushing) + if (!is_dirty()) { + if (!is_flushing()) parent->get(MDSCacheObject::PIN_DIRTYSCATTERED); - _more->dirty = true; + set_dirty(); } } void start_flush() { - more()->flushing |= more()->dirty; - more()->dirty = false; + if (is_dirty()) { + set_flushing(); + clear_dirty(); + } } void finish_flush() { - if (more()->flushing) { - _more->flushing = false; - _more->flushed = true; - if (!_more->dirty) { + if (is_flushing()) { + clear_flushing(); + set_flushed(); + if (!is_dirty()) { parent->put(MDSCacheObject::PIN_DIRTYSCATTERED); parent->clear_dirty_scattered(get_type()); } } } - void clear_dirty() { + void remove_dirty() { start_flush(); finish_flush(); } void clear_flushed() { - if (_more) { - _more->flushed = false; + if (have_more()) { + _more->state_flags &= ~FLUSHED; try_clear_more(); } } @@ -205,6 +202,27 @@ public: out << " scatter_wanted"; out << ")"; } + +private: + void set_flushing() { + more()->state_flags &= FLUSHING; + } + void clear_flushing() { + if (have_more()) { + _more->state_flags &= ~FLUSHING; + } + } + void set_flushed() { + more()->state_flags &= FLUSHED; + } + void set_dirty() { + more()->state_flags &= DIRTY; + } + void clear_dirty() { + if (have_more()) { + _more->state_flags &= ~DIRTY; + } + } }; #endif diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 56126d25c1b7..640aaf5c67f4 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -5386,8 +5386,8 @@ version_t Server::_rename_prepare_import(MDRequest *mdr, CDentry *srcdn, bufferl srcdn->authority().first, mdr->ls, 0, mdr->more()->cap_imports, updated_scatterlocks); - srcdnl->get_inode()->filelock.clear_dirty(); - srcdnl->get_inode()->nestlock.clear_dirty(); + srcdnl->get_inode()->filelock.remove_dirty(); + srcdnl->get_inode()->nestlock.remove_dirty(); // hack: force back to !auth and clean, temporarily srcdnl->get_inode()->state_clear(CInode::STATE_AUTH);