inode_t *pi = in->project_inode();
pi->version = in->pre_dirty();
- inode->mdcache->project_rstat_inode_to_frag(in, this, 0, 0);
+ inode->mdcache->project_rstat_inode_to_frag(in, this, 0, 0, NULL);
}
state_set(STATE_ASSIMRSTAT);
dout(10) << "assimilate_dirty_rstat_inodes done" << dendl;
// nested ---------------------------------------------------------------
-void MDCache::project_rstat_inode_to_frag(CInode *cur, CDir *parent, snapid_t first, int linkunlink)
+void MDCache::project_rstat_inode_to_frag(CInode *cur, CDir *parent, snapid_t first,
+ int linkunlink, SnapRealm *prealm)
{
CDentry *parentdn = cur->get_projected_parent_dn();
inode_t *curi = cur->get_projected_inode();
snapid_t floor = parentdn->first;
dout(20) << " floor of " << floor << " from parent dn " << *parentdn << dendl;
+ if (!prealm)
+ prealm = parent->inode->find_snaprealm();
+ const set<snapid_t> snaps = prealm->get_snaps();
+
+ if (cur->last != CEPH_NOSNAP) {
+ assert(cur->dirty_old_rstats.empty());
+ set<snapid_t>::const_iterator q = snaps.lower_bound(MAX(first, floor));
+ if (q == snaps.end() || *q > cur->last)
+ return;
+ }
+
if (cur->last >= floor)
_project_rstat_inode_to_frag(*curi, MAX(first, floor), cur->last, parent, linkunlink);
p != cur->dirty_old_rstats.end();
++p) {
old_inode_t& old = cur->old_inodes[*p];
+ snapid_t ofirst = MAX(old.first, floor);
+ set<snapid_t>::const_iterator q = snaps.lower_bound(ofirst);
+ if (q == snaps.end() || *q > *p)
+ continue;
if (*p >= floor)
- _project_rstat_inode_to_frag(old.inode, MAX(old.first, floor), *p, parent);
+ _project_rstat_inode_to_frag(old.inode, ofirst, *p, parent, 0);
}
cur->dirty_old_rstats.clear();
}
parent->resync_accounted_rstat();
// now push inode rstats into frag
- project_rstat_inode_to_frag(cur, parent, first, linkunlink);
+ project_rstat_inode_to_frag(cur, parent, first, linkunlink, prealm);
cur->clear_dirty_rstat();
}
CInode **pcow_inode=0);
void journal_dirty_inode(MutationImpl *mut, EMetaBlob *metablob, CInode *in, snapid_t follows=CEPH_NOSNAP);
- void project_rstat_inode_to_frag(CInode *cur, CDir *parent, snapid_t first, int linkunlink);
+ void project_rstat_inode_to_frag(CInode *cur, CDir *parent, snapid_t first,
+ int linkunlink, SnapRealm *prealm);
void _project_rstat_inode_to_frag(inode_t& inode, snapid_t ofirst, snapid_t last,
CDir *parent, int linkunlink=0);
void project_rstat_frag_to_inode(nest_info_t& rstat, nest_info_t& accounted_rstat,