]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix pre_dirty + projected_parent to bump pv properly; fix unlink vs cap release...
authorSage Weil <sage@newdream.net>
Fri, 29 Feb 2008 18:57:02 +0000 (10:57 -0800)
committerSage Weil <sage@newdream.net>
Fri, 29 Feb 2008 18:57:02 +0000 (10:57 -0800)
src/mds/CInode.cc
src/mds/CInode.h
src/mds/Server.cc

index a358a7aaf2c185b3aa12671961e561701f70d305..f66009264660f13f3948534df2d44e1b10060b47 100644 (file)
@@ -407,10 +407,13 @@ void CInode::name_stray_dentry(string& dname)
 version_t CInode::pre_dirty()
 {    
   assert(parent);
+  version_t pv;
   if (projected_parent)
-    return projected_parent->pre_dirty();
+    pv = projected_parent->pre_dirty(get_projected_version());
   else
-    return parent->pre_dirty();
+    pv = parent->pre_dirty();
+  dout(10) << "pre_dirty " << pv << " (current v " << inode.version << ")" << dendl;
+  return pv;
 }
 
 void CInode::_mark_dirty(LogSegment *ls)
index 5f77210cae371038a789cfe8fbe39897d3a7e72d..2362eb6f8d61a5368be8c004a77fc0e9ce6b95bb 100644 (file)
@@ -139,7 +139,7 @@ class CInode : public MDSCacheObject {
   //utime_t hack_load_stamp;
 
   // projected values (only defined while dirty)
-  list<inode_t*>    projected_inode;
+  list<inode_t*>   projected_inode;
   list<fragtree_t> projected_dirfragtree;
 
   version_t get_projected_version() {
index 43a281183fe7b4f369e441420cb2f22f9bda8082..628b509aed7eaee307aaa787b04b325922227420 100644 (file)
@@ -2488,7 +2488,8 @@ void Server::_unlink_local(MDRequest *mdr, CDentry *dn, CDentry *straydn)
   if (dn->is_primary()) {
     // primary link.  add stray dentry.
     assert(straydn);
-    ipv = straydn->pre_dirty(dn->inode->inode.version);
+    dn->inode->projected_parent = straydn;    
+    ipv = dn->inode->pre_dirty();
     le->metablob.add_dir_context(straydn->dir);
     ji = le->metablob.add_primary_dentry(straydn, true, dn->inode);
   } else {
@@ -2504,7 +2505,7 @@ void Server::_unlink_local(MDRequest *mdr, CDentry *dn, CDentry *straydn)
   pi->ctime = mdr->now;
   pi->version = ipv;
   *ji = *pi;  // copy into journal
-  
+
   // the unlinked dentry
   dn->pre_dirty();
   version_t dirpv = predirty_dn_diri(mdr, dn, &le->metablob);