]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: force update backtraces for previously created FS 1219/head
authorYan, Zheng <zheng.z.yan@intel.com>
Tue, 4 Feb 2014 13:53:31 +0000 (21:53 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Wed, 12 Feb 2014 06:24:09 +0000 (14:24 +0800)
Update inode format version to 10, treat any previously created
inode as no backtrace. When inode with no backtrace is modified,
force update its backtrace.

Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
src/mds/CInode.cc
src/mds/Locker.cc
src/mds/Server.cc
src/mds/events/EMetaBlob.h
src/mds/mdstypes.cc
src/mds/mdstypes.h

index 1933deaee3fb996ab8f05117951676b4898269d9..a579f3dfa9d93d3170b4149251b7e93041ee9876 100644 (file)
@@ -809,6 +809,12 @@ version_t CInode::pre_dirty()
     assert(is_base());
     pv = get_projected_version() + 1;
   }
+  // force update backtrace for old format inode (see inode_t::decode)
+  if (inode.backtrace_version == 0 && !projected_nodes.empty()) {
+    inode_t *pi = projected_nodes.back()->inode;
+    if (pi->backtrace_version == 0)
+      pi->update_backtrace(pv);
+  }
   return pv;
 }
 
index 4f399e3c4d54634da4a6888d9b3dc24f4b5a07e8..4976ef3e80516daba842de32ef45e4dd0b209a87 100644 (file)
@@ -2941,10 +2941,6 @@ bool Locker::_do_cap_update(CInode *in, Capability *cap,
 
     wrlock_force(&in->xattrlock, mut);
   }
-
-  // update backtrace for old format inode. (see inode_t::decode)
-  if (pi->backtrace_version == 0)
-    pi->update_backtrace();
   
   mut->auth_pin(in);
   mdcache->predirty_journal_parents(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY, 0, follows);
index 0e377277b0e54ac33d21e4ed8c9ca470fb1699da..36c11402840c537a714da3a98d74cec4c35541d5 100644 (file)
@@ -3264,11 +3264,6 @@ void Server::handle_client_setattr(MDRequest *mdr)
 
   // log + wait
   le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid());
-
-  // update backtrace for old format inode. (see inode_t::decode)
-  if (pi->backtrace_version == 0)
-    pi->update_backtrace();
-
   mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false);
   mdcache->journal_dirty_inode(mdr, &le->metablob, cur);
   
index 685f5ff472d785e712b2c024a7c03c27a9dd7817..5123fac2f2efaf5dd2e0dc4bf10e5fe5bf01fab3 100644 (file)
@@ -448,6 +448,9 @@ private:
     //cout << "journaling " << in->inode.ino << " at " << my_offset << std::endl;
 
     inode_t *pi = in->get_projected_inode();
+    if ((state & fullbit::STATE_DIRTY) && pi->is_backtrace_updated())
+      state |= fullbit::STATE_DIRTYPARENT;
+
     bufferlist snapbl;
     sr_t *sr = in->get_projected_srnode();
     if (sr)
index e39a723961e8bdc86f64c3e7bc5841b441db3b6f..aadf123ccae06f30765701c53d6a74f59e29937c 100644 (file)
@@ -204,7 +204,7 @@ ostream& operator<<(ostream& out, const client_writeable_range_t& r)
  */
 void inode_t::encode(bufferlist &bl) const
 {
-  ENCODE_START(9, 6, bl);
+  ENCODE_START(10, 6, bl);
 
   ::encode(ino, bl);
   ::encode(rdev, bl);
@@ -247,7 +247,7 @@ void inode_t::encode(bufferlist &bl) const
 
 void inode_t::decode(bufferlist::iterator &p)
 {
-  DECODE_START_LEGACY_COMPAT_LEN(9, 6, 6, p);
+  DECODE_START_LEGACY_COMPAT_LEN(10, 6, 6, p);
 
   ::decode(ino, p);
   ::decode(rdev, p);
@@ -297,8 +297,6 @@ void inode_t::decode(bufferlist::iterator &p)
     ::decode(backtrace_version, p);
   if (struct_v >= 7)
     ::decode(old_pools, p);
-  else
-    backtrace_version = 0; // note inode which has no backtrace
   if (struct_v >= 8)
     ::decode(max_size_ever, p);
   if (struct_v >= 9) {
@@ -307,6 +305,8 @@ void inode_t::decode(bufferlist::iterator &p)
   } else {
     inline_version = CEPH_INLINE_NONE;
   }
+  if (struct_v < 10)
+    backtrace_version = 0; // force update backtrace
 
   DECODE_FINISH(p);
 }
index 22eba07462bbdd0d9865e836984b6e3a95bb6959..8e7d9a9b5f0cfe75cc1461b69f9561c81f4f08e3 100644 (file)
@@ -440,8 +440,8 @@ struct inode_t {
   bool is_backtrace_updated() {
     return backtrace_version == version;
   }
-  void update_backtrace() {
-    backtrace_version = version;
+  void update_backtrace(version_t pv=0) {
+    backtrace_version = pv ? pv : version;
   }
 
   void add_old_pool(int64_t l) {