]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: set dirty flag when subtree root dirfrag gets scatter
authorSage Weil <sage@newdream.net>
Mon, 26 May 2008 17:27:26 +0000 (10:27 -0700)
committerSage Weil <sage@newdream.net>
Mon, 26 May 2008 17:27:26 +0000 (10:27 -0700)
src/include/types.h
src/mds/CDir.cc
src/mds/CDir.h
src/mds/CInode.cc

index fcd4633fc73aa7d93264747ca3616880c6e67428..c9d40d899ecb109de45bb6a48f3b1dad3443a859 100644 (file)
@@ -250,6 +250,10 @@ struct frag_info_t {
 };
 WRITE_CLASS_ENCODER(frag_info_t)
 
+inline bool operator==(const frag_info_t &l, const frag_info_t &r) {
+  return memcmp(&l, &r, sizeof(l)) == 0;
+}
+
 inline ostream& operator<<(ostream &out, const frag_info_t &f) {
   return out << "f(v" << f.version
             << " m" << f.mtime
index 3274762726bb8f953138b1ceb52fe8dd6d675688..cb9842f6708d0c457d4ee9c176daec6fee56506e 100644 (file)
@@ -822,9 +822,8 @@ void CDir::mark_dirty(version_t pv, LogSegment *ls)
 void CDir::_mark_dirty(LogSegment *ls)
 {
   if (!state_test(STATE_DIRTY)) {
-    state_set(STATE_DIRTY);
     dout(10) << "mark_dirty (was clean) " << *this << " version " << get_version() << dendl;
-    get(PIN_DIRTY);
+    _set_dirty_flag();
     assert(ls);
   } else {
     dout(10) << "mark_dirty (already dirty) " << *this << " version " << get_version() << dendl;
index 4109113ea7c0a70a5e39c22da377946f9b80265c..3eac0af84331c6efc734ec39f62193705c03673b 100644 (file)
@@ -182,6 +182,10 @@ public:
   bool is_projected() { return get_projected_version() > get_version(); }
   version_t pre_dirty(version_t min=0);
   void _mark_dirty(LogSegment *ls);
+  void _set_dirty_flag() {
+    state_set(STATE_DIRTY);
+    get(PIN_DIRTY);
+  }
   void mark_dirty(version_t pv, LogSegment *ls);
   void mark_clean();
 
index 886b68e71c8d656b0e3544608722e6e85d5a6471..8122f0634ae18ce65a7164dcb57de261521fefe2 100644 (file)
@@ -603,7 +603,7 @@ void CInode::decode_lock_state(int type, bufferlist& bl)
       frag_info_t dirstat;
       ::decode(dirstat, p);
       if (!is_auth())
-       inode.dirstat = dirstat;    // ignore inode summaction unless i'm a replica
+       inode.dirstat = dirstat;    // take inode summation if replica
       __u32 n;
       ::decode(n, p);
       while (n--) {
@@ -616,9 +616,13 @@ void CInode::decode_lock_state(int type, bufferlist& bl)
          assert(dir);                // i am auth; i had better have this dir open
          dir->fnode.fragstat = fragstat;
        } else {
-         if (dir) {
-           dir->fnode.accounted_fragstat = fragstat;
-           // mark dirty?  FIXME
+         if (dir &&
+             !(dir->fnode.accounted_fragstat == fragstat)) {
+           dout(10) << " setting accounted_fragstat " << fragstat << " and setting dirty bit on "
+                    << *dir << dendl;
+           fnode_t *pf = dir->get_projected_fnode();
+           pf->accounted_fragstat = fragstat;
+           dir->_set_dirty_flag();         // bit of a hack
          }
        }
       }