From d99d887ba8e2c9bdda35c7d714f862782e434e2a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 29 Feb 2008 10:57:02 -0800 Subject: [PATCH] mds: fix pre_dirty + projected_parent to bump pv properly; fix unlink vs cap release race --- src/mds/CInode.cc | 7 +++++-- src/mds/CInode.h | 2 +- src/mds/Server.cc | 5 +++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index a358a7aaf2c18..f66009264660f 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -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) diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 5f77210cae371..2362eb6f8d61a 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -139,7 +139,7 @@ class CInode : public MDSCacheObject { //utime_t hack_load_stamp; // projected values (only defined while dirty) - list projected_inode; + list projected_inode; list projected_dirfragtree; version_t get_projected_version() { diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 43a281183fe7b..628b509aed7ea 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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); -- 2.39.5