double fac = 1.0 / (double)(1 << bits); // for scaling load vecs
+ frag_info_t olddiff; // old += f - af;
+ dout(10) << " fragstat " << fnode.fragstat << dendl;
+ dout(10) << " accounted_fragstat " << fnode.accounted_fragstat << dendl;
+ olddiff.zero();
+ olddiff.take_diff(fnode.fragstat, fnode.accounted_fragstat);
+ dout(10) << " olddiff " << olddiff << dendl;
+
// create subfrag dirs
int n = 0;
for (list<frag_t>::iterator p = frags.begin(); p != frags.end(); ++p) {
f->steal_dentry(dn);
}
+ // fix up new frag fragstats
+ for (int i=0; i<n; i++) {
+ subfrags[i]->fnode.fragstat.version = fnode.fragstat.version;
+ subfrags[i]->fnode.accounted_fragstat = subfrags[i]->fnode.fragstat;
+ dout(10) << " fragstat " << subfrags[i]->fnode.fragstat << " on " << *subfrags[i] << dendl;
+ }
+
+ // give any outstanding frag stat differential to first frag
+ // af[0] -= olddiff
+ dout(10) << "giving olddiff " << olddiff << " to " << *subfrags[0] << dendl;
+ frag_info_t zero;
+ zero.zero();
+ subfrags[0]->fnode.accounted_fragstat.take_diff(zero, olddiff);
+ dout(10) << " " << subfrags[0]->fnode.accounted_fragstat << dendl;
+
purge_stolen(waiters);
inode->close_dirfrag(frag); // selft deletion, watch out.
}
}
pi->dirstat.version++;
dout(20) << " final dirstat " << pi->dirstat << dendl;
+ assert(pi->dirstat.size() >= 0);
+ assert(pi->dirstat.nfiles >= 0);
+ assert(pi->dirstat.nsubdirs >= 0);
}
break;
// this frag
utime_t mtime;
- __u64 nfiles; // files
- __u64 nsubdirs; // subdirs
- __u64 size() const { return nfiles + nsubdirs; }
+ __s64 nfiles; // files
+ __s64 nsubdirs; // subdirs
+ __s64 size() const { return nfiles + nsubdirs; }
// this frag + children
utime_t rctime;
- __u64 rbytes;
- __u64 rfiles;
- __u64 rsubdirs;
- __u64 rsize() const { return rfiles + rsubdirs; }
- __u64 ranchors; // for dirstat, includes inode's anchored flag.
+ __s64 rbytes;
+ __s64 rfiles;
+ __s64 rsubdirs;
+ __s64 rsize() const { return rfiles + rsubdirs; }
+ __s64 ranchors; // for dirstat, includes inode's anchored flag.
+ void zero() {
+ memset(this, 0, sizeof(*this));
+ }
void take_diff(const frag_info_t &cur, frag_info_t &acc) {
if (cur.mtime > mtime)
rctime = mtime = cur.mtime;