};
WRITE_CLASS_ENCODER(frag_info_t)
+inline bool operator==(const frag_info_t &l, const frag_info_t &r) {
+ return memcmp(&l, &r, sizeof(l)) == 0;
+}
+
inline ostream& operator<<(ostream &out, const frag_info_t &f) {
return out << "f(v" << f.version
<< " m" << f.mtime
void CDir::_mark_dirty(LogSegment *ls)
{
if (!state_test(STATE_DIRTY)) {
- state_set(STATE_DIRTY);
dout(10) << "mark_dirty (was clean) " << *this << " version " << get_version() << dendl;
- get(PIN_DIRTY);
+ _set_dirty_flag();
assert(ls);
} else {
dout(10) << "mark_dirty (already dirty) " << *this << " version " << get_version() << dendl;
bool is_projected() { return get_projected_version() > get_version(); }
version_t pre_dirty(version_t min=0);
void _mark_dirty(LogSegment *ls);
+ void _set_dirty_flag() {
+ state_set(STATE_DIRTY);
+ get(PIN_DIRTY);
+ }
void mark_dirty(version_t pv, LogSegment *ls);
void mark_clean();
frag_info_t dirstat;
::decode(dirstat, p);
if (!is_auth())
- inode.dirstat = dirstat; // ignore inode summaction unless i'm a replica
+ inode.dirstat = dirstat; // take inode summation if replica
__u32 n;
::decode(n, p);
while (n--) {
assert(dir); // i am auth; i had better have this dir open
dir->fnode.fragstat = fragstat;
} else {
- if (dir) {
- dir->fnode.accounted_fragstat = fragstat;
- // mark dirty? FIXME
+ if (dir &&
+ !(dir->fnode.accounted_fragstat == fragstat)) {
+ dout(10) << " setting accounted_fragstat " << fragstat << " and setting dirty bit on "
+ << *dir << dendl;
+ fnode_t *pf = dir->get_projected_fnode();
+ pf->accounted_fragstat = fragstat;
+ dir->_set_dirty_flag(); // bit of a hack
}
}
}