{
dout(10) << "dir_is_nonempty " << *in << dendl;
assert(in->is_auth());
+ assert(in->filelock.can_read(-1));
- if (in->snaprealm && in->snaprealm->srnode.snaps.size())
- return true; // in a snapshot!
+ frag_info_t dirstat;
+ version_t dirstat_version = in->get_projected_inode()->dirstat.version;
- if (in->get_projected_inode()->dirstat.size() > 0) {
- dout(10) << "dir_is_nonempty projected dir size still "
- << in->get_projected_inode()->dirstat.size()
- << " on " << *in
- << dendl;
- return true;
+ list<CDir*> ls;
+ in->get_dirfrags(ls);
+ for (list<CDir*>::iterator p = ls.begin(); p != ls.end(); ++p) {
+ CDir *dir = *p;
+ fnode_t *pf = dir->get_projected_fnode();
+ if (pf->fragstat.size()) {
+ dout(10) << "dir_is_nonempty_unlocked dirstat has "
+ << pf->fragstat.size() << " items " << *dir << dendl;
+ return true;
+ }
+
+ if (pf->accounted_fragstat.version == dirstat_version)
+ dirstat.add(pf->accounted_fragstat);
+ else
+ dirstat.add(pf->fragstat);
}
- return false;
+ return dirstat.size() != in->get_projected_inode()->dirstat.size();
}