inode_t *CInode::project_inode(map<string,bufferptr> *px)
{
- if (projected_inode.empty()) {
- projected_inode.push_back(new inode_t(inode));
+ if (projected_nodes.empty()) {
+ projected_nodes.push_back(new projection_node(new inode_t(inode)));
if (px)
*px = xattrs;
} else {
- projected_inode.push_back(new inode_t(*projected_inode.back()));
+ projected_nodes.push_back(new projection_node(
+ new inode_t(*projected_nodes.back()->inode)));
if (px)
*px = *get_projected_xattrs();
}
- projected_xattrs.push_back(px);
- projected_nodes.push_back(projection_node(projected_inode.back(), px));
- dout(15) << "project_inode " << projected_inode.back() << dendl;
- return projected_inode.back();
+ projected_nodes.back()->xattrs = px;
+ if (px) projected_xattrs_ptr = px;
+ dout(15) << "project_inode " << projected_nodes.back()->inode << dendl;
+ return projected_nodes.back()->inode;
}
void CInode::pop_and_dirty_projected_inode(LogSegment *ls)
{
- assert(!projected_inode.empty());
- dout(15) << "pop_and_dirty_projected_inode " << projected_inode.front()
- << " v" << projected_inode.front()->version << dendl;
- mark_dirty(projected_inode.front()->version, ls);
- inode = *projected_inode.front();
- delete projected_inode.front();
+ assert(!projected_nodes.empty());
+ dout(15) << "pop_and_dirty_projected_inode " << projected_nodes.front()->inode
+ << " v" << projected_nodes.front()->inode->version << dendl;
+ mark_dirty(projected_nodes.front()->inode->version, ls);
+ inode = *projected_nodes.front()->inode;
- map<string,bufferptr> *px = projected_xattrs.front();
+ map<string,bufferptr> *px = projected_nodes.front()->xattrs;
if (px) {
xattrs = *px;
+ if (projected_xattrs_ptr && projected_xattrs_ptr == px)
+ projected_xattrs_ptr = NULL;
delete px;
}
- projected_inode.pop_front();
- projected_xattrs.pop_front();
+ delete projected_nodes.front()->inode;
+ delete projected_nodes.front();
+
+ projected_nodes.pop_front();
}
sr_t *CInode::project_snaprealm(snapid_t snapid)
projection_node(inode_t *in, map<string, bufferptr> *xp = NULL, sr_t *sn = NULL) :
inode(in), xattrs(xp), snapnode(sn) {}
};
- list<projection_node*> projected_nodes;
-
// projected values (only defined while dirty)
- list<inode_t*> projected_inode;
+ list<projection_node*> projected_nodes;
- // if xattr* is null, it is defined to be the same as the previous version
- list<map<string,bufferptr>*> projected_xattrs;
+ sr_t *projected_snaprealm_ptr;
+ map<string, bufferptr> *projected_xattrs_ptr;
version_t get_projected_version() {
- if (projected_inode.empty())
+ if (projected_nodes.empty())
return inode.version;
else
- return projected_inode.back()->version;
+ return projected_nodes.back()->inode->version;
}
bool is_projected() {
- return !projected_inode.empty();
+ return !projected_nodes.empty();
}
inode_t *get_projected_inode() {
- if (projected_inode.empty())
+ if (projected_nodes.empty())
return &inode;
else
- return projected_inode.back();
+ return projected_nodes.back()->inode;
}
map<string,bufferptr> *get_projected_xattrs() {
- if (!projected_xattrs.empty())
- for (list<map<string,bufferptr>*>::reverse_iterator p = projected_xattrs.rbegin();
- p != projected_xattrs.rend();
- p++)
- if (*p)
- return *p;
+ if (projected_xattrs_ptr) return projected_xattrs_ptr;
return &xattrs;
}
void pop_and_dirty_projected_inode(LogSegment *ls);
inode_t *get_previous_projected_inode() {
- assert(!projected_inode.empty());
- list<inode_t*>::reverse_iterator p = projected_inode.rbegin();
+ assert(!projected_nodes.empty());
+ list<projection_node*>::reverse_iterator p = projected_nodes.rbegin();
p++;
- if (p != projected_inode.rend())
- return *p;
+ if (p != projected_nodes.rend())
+ return (*p)->inode;
else
return &inode;
}
first(f), last(l),
last_journaled(0), //last_open_journaled(0),
//hack_accessed(true),
+ projected_snaprealm_ptr(NULL),
+ projected_xattrs_ptr(NULL),
stickydir_ref(0),
parent(0),
inode_auth(CDIR_AUTH_DEFAULT),