*px = *get_projected_xattrs();
}
projected_nodes.back()->xattrs = px;
- if (px) projected_xattrs_ptr = px;
+ if (px) {
+ previous_projected_xattrs_ptr = projected_xattrs_ptr;
+ projected_xattrs_ptr = px;
+ }
dout(15) << "project_inode " << projected_nodes.back()->inode << dendl;
return projected_nodes.back()->inode;
}
map<string,bufferptr> *px = projected_nodes.front()->xattrs;
if (px) {
xattrs = *px;
- if (projected_xattrs_ptr && projected_xattrs_ptr == px)
+ if (previous_projected_xattrs_ptr == px)
+ previous_projected_xattrs_ptr = NULL;
+ else if (projected_xattrs_ptr == px)
projected_xattrs_ptr = NULL;
delete px;
}
old_inode_t &old = old_inodes[follows];
old.first = first;
old.inode = *pi;
- old.xattrs = xattrs;
+ old.xattrs = *get_previous_projected_xattrs();
old.inode.trim_client_ranges(follows);
sr_t *projected_snaprealm_ptr;
map<string, bufferptr> *projected_xattrs_ptr;
+ map<string, bufferptr> *previous_projected_xattrs_ptr;
version_t get_projected_version() {
if (projected_nodes.empty())
if (projected_xattrs_ptr) return projected_xattrs_ptr;
return &xattrs;
}
+ map<string,bufferptr> *get_previous_projected_xattrs() {
+ if (previous_projected_xattrs_ptr) return previous_projected_xattrs_ptr;
+ return &xattrs;
+ }
inode_t *project_inode(map<string,bufferptr> *px=0);
void pop_and_dirty_projected_inode(LogSegment *ls);
last_journaled(0), //last_open_journaled(0),
//hack_accessed(true),
projected_snaprealm_ptr(NULL),
- projected_xattrs_ptr(NULL),
+ projected_xattrs_ptr(NULL), previous_projected_xattrs_ptr(NULL),
stickydir_ref(0),
parent(0),
inode_auth(CDIR_AUTH_DEFAULT),
CInode *oldin = new CInode(this, true, in->first, last);
oldin->inode = *in->get_previous_projected_inode();
oldin->symlink = in->symlink;
- oldin->xattrs = in->xattrs;
+ oldin->xattrs = *in->get_previous_projected_xattrs();
oldin->inode.trim_client_ranges(last);