]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: implement get_previous_projected_xattrs; use in MDCache::cow_inode().
authorGreg Farnum <gregf@hq.newdream.net>
Thu, 19 Aug 2010 20:05:30 +0000 (13:05 -0700)
committerGreg Farnum <gregf@hq.newdream.net>
Thu, 19 Aug 2010 22:33:54 +0000 (15:33 -0700)
Fixes #351

src/mds/CInode.cc
src/mds/CInode.h
src/mds/MDCache.cc

index d60454950f152f0811b7252c93d20d93c2bd90d6..670ac671420890a71d98853a8dbb53902b0fba20 100644 (file)
@@ -214,7 +214,10 @@ inode_t *CInode::project_inode(map<string,bufferptr> *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<string,bufferptr> *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);
 
index 1376e06f271ba7440f5c07be05d76bf5f0f64cd9..e234a1581e50639637c372cdc227aa0564bf0ca0 100644 (file)
@@ -199,6 +199,7 @@ public:
 
   sr_t *projected_snaprealm_ptr;
   map<string, bufferptr> *projected_xattrs_ptr;
+  map<string, bufferptr> *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<string,bufferptr> *get_previous_projected_xattrs() {
+    if (previous_projected_xattrs_ptr) return previous_projected_xattrs_ptr;
+    return &xattrs;
+  }
 
   inode_t *project_inode(map<string,bufferptr> *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),
index 0e0bfaa0e4519870dc2d74da09f8871604b5bc26..a2ee9260867a4344005d7b40ee36588f1b4e9e56 100644 (file)
@@ -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);