share_inode_max_size(in);
// unlinked stray? may need to purge (e.g., after all caps are released)
- if (in->inode.nlink == 0 &&
- in->get_parent_dn() &&
- in->get_parent_dn()->get_dir()->get_inode()->is_stray() &&
- !in->is_any_caps()) {
- if (!in->is_auth())
- mdcache->touch_dentry_bottom(in->get_parent_dn()); // move to bottom of lru so that we trim quickly!
- else if (!in->is_replicated())
- mdcache->eval_stray(in->get_parent_dn());
- }
+ mdcache->maybe_eval_stray(in);
}
Capability* Locker::issue_new_caps(CInode *in,
if (in->nestlock.remove_replica(from)) mds->locker->eval_gather(&in->nestlock);
// trim?
- if (in->inode.nlink == 0 &&
- in->get_parent_dn() &&
- in->get_parent_dn()->get_dir()->get_inode()->is_stray() &&
- !in->is_any_caps())
- eval_stray(in->get_parent_dn());
+ maybe_eval_stray(in);
}
void MDCache::dentry_remove_replica(CDentry *dn, int from)
mds->locker->eval(in, CEPH_CAP_LOCKS);
- // unlinked stray? may need to purge (e.g., after all caps are released)
- if (in->inode.nlink == 0 &&
- in->get_parent_dn() &&
- in->get_parent_dn()->get_dir()->get_inode()->is_stray() &&
- !in->is_any_caps()) {
- if (!in->is_auth())
- touch_dentry_bottom(in->get_parent_dn()); // move to bottom of lru so that we trim quickly!
- else if (!in->is_replicated())
- eval_stray(in->get_parent_dn());
- }
+ maybe_eval_stray(in);
}
CInode *in = dnl->get_inode();
assert(in);
- if (!dn->is_auth()) return; // has to be mine
+ assert(dn->get_dir()->get_inode()->is_stray());
+
+ if (!dn->is_auth()) {
+ // has to be mine
+ // move to bottom of lru so that we trim quickly!
+ touch_dentry_bottom(dn);
+ return;
+ }
// purge?
if (in->inode.nlink == 0) {
public:
void eval_stray(CDentry *dn);
void eval_remote(CDentry *dn);
+
+ void maybe_eval_stray(CInode *in) {
+ if (in->inode.nlink > 0 || in->is_base())
+ return;
+ CDentry *dn = in->get_projected_parent_dn();
+ if (dn->get_projected_linkage()->is_primary() &&
+ dn->get_dir()->get_inode()->is_stray() &&
+ !dn->is_replicated())
+ eval_stray(dn);
+ }
protected:
void purge_stray(CDentry *dn);
void _purge_stray_purged(CDentry *dn);