From: Yan, Zheng Date: Wed, 30 May 2018 11:26:09 +0000 (+0800) Subject: mds: properly journal root inode's snaprealm X-Git-Tag: v13.2.0~2^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F22322%2Fhead;p=ceph.git mds: properly journal root inode's snaprealm Signed-off-by: "Yan, Zheng" Fixes: http://tracker.ceph.com/issues/24343 (cherry picked from commit 4f5029bdcc598731603918f4a8378b6e00375ca6) --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index c526549ca0ca..d82da8741d67 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -1735,7 +1735,7 @@ void MDCache::journal_cow_inode(MutationRef& mut, EMetaBlob *metablob, void MDCache::journal_dirty_inode(MutationImpl *mut, EMetaBlob *metablob, CInode *in, snapid_t follows) { if (in->is_base()) { - metablob->add_root(true, in, in->get_projected_inode()); + metablob->add_root(true, in); } else { if (follows == CEPH_NOSNAP && in->last != CEPH_NOSNAP) follows = in->first - 1; @@ -12665,7 +12665,7 @@ void MDCache::upgrade_inode_snaprealm_work(MDRequestRef& mdr) mds->mdlog->start_entry(le); if (in->is_base()) { - le->metablob.add_root(true, in, in->get_projected_inode()); + le->metablob.add_root(true, in); } else { CDentry *pdn = in->get_projected_parent_dn(); le->metablob.add_dir_context(pdn->get_dir()); diff --git a/src/mds/events/EMetaBlob.h b/src/mds/events/EMetaBlob.h index c38c2ccb528c..ef8730cb348a 100644 --- a/src/mds/events/EMetaBlob.h +++ b/src/mds/events/EMetaBlob.h @@ -493,20 +493,18 @@ private: add_primary_dentry(dn, 0, dirty, dirty_parent, dirty_pool); } - void add_root(bool dirty, CInode *in, const CInode::mempool_inode *pi=0, fragtree_t *pdft=0, bufferlist *psnapbl=0, - CInode::mempool_xattr_map *px=0) { + void add_root(bool dirty, CInode *in) { in->last_journaled = event_seq; //cout << "journaling " << in->inode.ino << " at " << my_offset << std::endl; - if (!pi) pi = in->get_projected_inode(); - if (!pdft) pdft = &in->dirfragtree; - if (!px) px = in->get_projected_xattrs(); + const auto& pi = *(in->get_projected_inode()); + const auto& pdft = in->dirfragtree; + const auto& px = *(in->get_projected_xattrs()); bufferlist snapbl; - if (psnapbl) - snapbl = *psnapbl; - else - in->encode_snap_blob(snapbl); + const sr_t *sr = in->get_projected_srnode(); + if (sr) + sr->encode(snapbl); for (list >::iterator p = roots.begin(); p != roots.end(); ++p) { if ((*p)->inode.ino == in->ino()) { @@ -516,8 +514,8 @@ private: } string empty; - roots.push_back(ceph::shared_ptr(new fullbit(empty, in->first, in->last, 0, *pi, - *pdft, *px, in->symlink, + roots.push_back(ceph::shared_ptr(new fullbit(empty, in->first, in->last, 0, pi, + pdft, px, in->symlink, in->oldest_snap, snapbl, dirty ? fullbit::STATE_DIRTY : 0, &in->old_inodes)));