CInode *oldin = new CInode(this, true, in->first, last);
oldin->inode = *in->get_previous_projected_inode();
- oldin->symlink = in->symlink;
oldin->xattrs = *in->get_previous_projected_xattrs();
+ oldin->symlink = in->symlink;
oldin->inode.trim_client_ranges(last);
if (in->first < in->oldest_snap)
dnl = dn->get_projected_linkage();
assert(!dnl->is_null());
- if (dnl->is_primary() && dnl->get_inode()->is_multiversion()) {
+ CInode *in = dnl->is_primary() ? dnl->get_inode() : NULL;
+ bool cow_head = false;
+ if (in && in->state_test(CInode::STATE_AMBIGUOUSAUTH)) {
+ assert(in->is_frozen_inode());
+ cow_head = true;
+ }
+ if (in && (in->is_multiversion() || cow_head)) {
// multiversion inode.
- CInode *in = dnl->get_inode();
SnapRealm *realm = NULL;
if (in->get_projected_parent_dn() != dn) {
// FIXME: adjust link count here? hmm.
if (dir_follows+1 > in->first)
- in->cow_old_inode(dir_follows, false);
+ in->cow_old_inode(dir_follows, cow_head);
}
}
return;
}
- in->cow_old_inode(follows, false);
+ in->cow_old_inode(follows, cow_head);
} else {
SnapRealm *realm = dn->dir->inode->find_snaprealm();
snapid_t oldfirst = dn->first;
dn->first = follows+1;
- CInode *in = dnl->is_primary() ? dnl->get_inode() : NULL;
-
if (!realm->has_snaps_in_range(oldfirst, follows)) {
dout(10) << "journal_cow_dentry no snapshot follows " << follows << " on " << *dn << dendl;
if (in)