From: Yan, Zheng Date: Tue, 4 Feb 2014 13:53:31 +0000 (+0800) Subject: mds: force update backtraces for previously created FS X-Git-Tag: v0.78~190^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F1219%2Fhead;p=ceph.git mds: force update backtraces for previously created FS 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 --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 1933deaee3fb..a579f3dfa9d9 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -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; } diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 4f399e3c4d54..4976ef3e8051 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -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); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 0e377277b0e5..36c11402840c 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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); diff --git a/src/mds/events/EMetaBlob.h b/src/mds/events/EMetaBlob.h index 685f5ff472d7..5123fac2f2ef 100644 --- a/src/mds/events/EMetaBlob.h +++ b/src/mds/events/EMetaBlob.h @@ -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) diff --git a/src/mds/mdstypes.cc b/src/mds/mdstypes.cc index e39a723961e8..aadf123ccae0 100644 --- a/src/mds/mdstypes.cc +++ b/src/mds/mdstypes.cc @@ -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); } diff --git a/src/mds/mdstypes.h b/src/mds/mdstypes.h index 22eba07462bb..8e7d9a9b5f0c 100644 --- a/src/mds/mdstypes.h +++ b/src/mds/mdstypes.h @@ -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) {