return old;
}
+void CInode::split_old_inode(snapid_t snap)
+{
+ map<snapid_t, old_inode_t>::iterator p = old_inodes.lower_bound(snap);
+ assert(p != old_inodes.end() && p->second.first < snap);
+
+ old_inode_t &old = old_inodes[snap - 1];
+ old = p->second;
+
+ p->second.first = snap;
+ dout(10) << "split_old_inode " << "[" << old.first << "," << p->first
+ << "] to [" << snap << "," << p->first << "] on " << *this << dendl;
+}
+
void CInode::pre_cow_old_inode()
{
snapid_t follows = find_snaprealm()->get_newest_seq();
public:
old_inode_t& cow_old_inode(snapid_t follows, bool cow_head);
+ void split_old_inode(snapid_t snap);
old_inode_t *pick_old_inode(snapid_t last);
void pre_cow_old_inode();
void purge_stale_snap_data(const std::set<snapid_t>& snaps);
old_inode_t *oi = 0;
if (in->is_multiversion()) {
oi = in->pick_old_inode(snap);
- if (oi) {
- dout(10) << " writing into old inode" << dendl;
- if (xattrs)
- px = &oi->xattrs;
- }
}
- if (xattrs && !px)
- px = new map<string,bufferptr>;
- inode_t *pi = in->project_inode(px);
- pi->version = in->pre_dirty();
- if (oi)
+ inode_t *pi;
+ if (oi) {
+ dout(10) << " writing into old inode" << dendl;
+ pi = in->project_inode();
+ pi->version = in->pre_dirty();
+ if (snap > oi->first)
+ in->split_old_inode(snap);
pi = &oi->inode;
+ if (xattrs)
+ px = &oi->xattrs;
+ } else {
+ if (xattrs)
+ px = new map<string,bufferptr>;
+ pi = in->project_inode(px);
+ pi->version = in->pre_dirty();
+ }
_update_cap_fields(in, dirty, m, pi);