From 481402a430af1fafacd80e08139af97458593c1e Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Thu, 19 Aug 2010 13:05:30 -0700 Subject: [PATCH] mds: implement get_previous_projected_xattrs; use in MDCache::cow_inode(). Fixes #351 --- src/mds/CInode.cc | 11 ++++++++--- src/mds/CInode.h | 7 ++++++- src/mds/MDCache.cc | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index d60454950f152..670ac67142089 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -214,7 +214,10 @@ inode_t *CInode::project_inode(map *px) *px = *get_projected_xattrs(); } projected_nodes.back()->xattrs = px; - if (px) projected_xattrs_ptr = px; + if (px) { + previous_projected_xattrs_ptr = projected_xattrs_ptr; + projected_xattrs_ptr = px; + } dout(15) << "project_inode " << projected_nodes.back()->inode << dendl; return projected_nodes.back()->inode; } @@ -230,7 +233,9 @@ void CInode::pop_and_dirty_projected_inode(LogSegment *ls) map *px = projected_nodes.front()->xattrs; if (px) { xattrs = *px; - if (projected_xattrs_ptr && projected_xattrs_ptr == px) + if (previous_projected_xattrs_ptr == px) + previous_projected_xattrs_ptr = NULL; + else if (projected_xattrs_ptr == px) projected_xattrs_ptr = NULL; delete px; } @@ -1566,7 +1571,7 @@ old_inode_t& CInode::cow_old_inode(snapid_t follows, inode_t *pi) old_inode_t &old = old_inodes[follows]; old.first = first; old.inode = *pi; - old.xattrs = xattrs; + old.xattrs = *get_previous_projected_xattrs(); old.inode.trim_client_ranges(follows); diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 1376e06f271ba..e234a1581e506 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -199,6 +199,7 @@ public: sr_t *projected_snaprealm_ptr; map *projected_xattrs_ptr; + map *previous_projected_xattrs_ptr; version_t get_projected_version() { if (projected_nodes.empty()) @@ -220,6 +221,10 @@ public: if (projected_xattrs_ptr) return projected_xattrs_ptr; return &xattrs; } + map *get_previous_projected_xattrs() { + if (previous_projected_xattrs_ptr) return previous_projected_xattrs_ptr; + return &xattrs; + } inode_t *project_inode(map *px=0); void pop_and_dirty_projected_inode(LogSegment *ls); @@ -345,7 +350,7 @@ private: last_journaled(0), //last_open_journaled(0), //hack_accessed(true), projected_snaprealm_ptr(NULL), - projected_xattrs_ptr(NULL), + projected_xattrs_ptr(NULL), previous_projected_xattrs_ptr(NULL), stickydir_ref(0), parent(0), inode_auth(CDIR_AUTH_DEFAULT), diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 0e0bfaa0e4519..a2ee9260867a4 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -1258,7 +1258,7 @@ CInode *MDCache::cow_inode(CInode *in, snapid_t last) CInode *oldin = new CInode(this, true, in->first, last); oldin->inode = *in->get_previous_projected_inode(); oldin->symlink = in->symlink; - oldin->xattrs = in->xattrs; + oldin->xattrs = *in->get_previous_projected_xattrs(); oldin->inode.trim_client_ranges(last); -- 2.39.5