dout(10) << "_committed v " << v << " (last renamed " << lrv << ") on " << *this << dendl;
assert(is_auth());
+ bool stray = inode->is_stray();
+
// did we update the parent pointer too?
if (get_frag() == frag_t() && // only counts on first frag
inode->state_test(CInode::STATE_DIRTYPARENT) &&
CDentry *dn = it->second;
it++;
- // dentry
- if (committed_version >= dn->get_version()) {
- if (dn->is_dirty()) {
- dout(15) << " dir " << committed_version << " >= dn " << dn->get_version() << " now clean " << *dn << dendl;
- dn->mark_clean();
- }
- } else {
- dout(15) << " dir " << committed_version << " < dn " << dn->get_version() << " still dirty " << *dn << dendl;
- }
-
// inode?
if (dn->linkage.is_primary()) {
CInode *in = dn->linkage.get_inode();
assert(in->is_dirty() || in->last < CEPH_NOSNAP); // special case for cow snap items (not predirtied)
}
}
+
+ // dentry
+ if (committed_version >= dn->get_version()) {
+ if (dn->is_dirty()) {
+ dout(15) << " dir " << committed_version << " >= dn " << dn->get_version() << " now clean " << *dn << dendl;
+ dn->mark_clean();
+
+ // drop clean null stray dentries immediately
+ if (stray &&
+ dn->get_num_ref() == 0 &&
+ dn->get_linkage()->is_null())
+ remove_dentry(dn);
+ }
+ } else {
+ dout(15) << " dir " << committed_version << " < dn " << dn->get_version() << " still dirty " << *dn << dendl;
+ }
}
// finishers?