respond_to_request(mdr, -EEXIST);
return 0;
}
- } else {
+ } else if (!dir->inode->is_stray()) {
dn->first = dir->inode->find_snaprealm()->get_newest_seq() + 1;
}
if (cmode & CEPH_FILE_MODE_WR) {
pi->client_ranges[client].range.first = 0;
pi->client_ranges[client].range.last = pi->get_layout_size_increment();
- pi->client_ranges[client].follows = in->find_snaprealm()->get_newest_seq();
+ pi->client_ranges[client].follows = realm->get_newest_seq();
changed_ranges = true;
}
return;
}
+ SnapRealm *realm = in->find_snaprealm();
+ snapid_t follows = realm->get_newest_seq();
+ if (straydn)
+ straydn->first = MAX((uint64_t)in->first, follows + 1);
+
// yay!
if (in->is_dir() && in->has_subtree_root_dirfrag()) {
// subtree root auths need to be witnesses
if (dnl->is_remote() && !dnl->get_inode()->is_auth())
_link_remote(mdr, false, dn, dnl->get_inode());
else
- _unlink_local(mdr, dn, straydn);
+ _unlink_local(mdr, dn, straydn, follows);
}
class C_MDS_unlink_local_finish : public ServerLogContext {
}
};
-void Server::_unlink_local(MDRequestRef& mdr, CDentry *dn, CDentry *straydn)
+void Server::_unlink_local(MDRequestRef& mdr, CDentry *dn, CDentry *straydn, snapid_t follows)
{
dout(10) << "_unlink_local " << *dn << dendl;
CDentry::linkage_t *dnl = dn->get_projected_linkage();
CInode *in = dnl->get_inode();
- SnapRealm *realm = in->find_snaprealm();
- snapid_t follows = realm->get_newest_seq();
// ok, let's do it.
mdr->ls = mdlog->get_current_segment();
if (straydn) {
assert(dnl->is_primary());
straydn->push_projected_linkage(in);
- straydn->first = follows + 1;
}
// the unlinked dentry
dn->push_projected_linkage();
+ if (straydn) {
+ assert(in->first <= straydn->first);
+ in->first = straydn->first;
+ }
+
if (in->is_dir()) {
assert(straydn);
mdcache->project_subtree_rename(in, dn->get_dir(), straydn->get_dir());
SnapRealm *src_realm = srci->find_snaprealm();
SnapRealm *dest_realm = destdn->get_dir()->inode->find_snaprealm();
- snapid_t next_dest_snap = dest_realm->get_newest_seq() + 1;
+ snapid_t next_dest_snap = MAX(dest_realm->get_newest_seq(), src_realm->get_newest_seq()) + 1;
// add it all to the metablob
// target inode
// project snaprealm, too
if (oldin->snaprealm || dest_realm->get_newest_seq() + 1 > oldin->get_oldest_snap())
oldin->project_past_snaprealm_parent(straydn->get_dir()->inode->find_snaprealm());
- straydn->first = MAX(oldin->first, next_dest_snap);
+ straydn->first = MAX((uint64_t)oldin->first, dest_realm->get_newest_seq() + 1);
metablob->add_primary_dentry(straydn, oldin, true, true);
} else if (force_journal_stray) {
dout(10) << " forced journaling straydn " << *straydn << dendl;
if (destdn->is_auth() && !destdnl->is_null())
mdcache->journal_cow_dentry(mdr.get(), metablob, destdn, CEPH_NOSNAP, 0, destdnl);
else
- destdn->first = MAX(destdn->first, next_dest_snap);
+ destdn->first = next_dest_snap;
if (destdn->is_auth())
metablob->add_remote_dentry(destdn, true, srcdnl->get_remote_ino(), srcdnl->get_remote_d_type());
if (destdn->is_auth() && !destdnl->is_null())
mdcache->journal_cow_dentry(mdr.get(), metablob, destdn, CEPH_NOSNAP, 0, destdnl);
else
+ // FIXME: stray reintegration, do we need to update destdn->first?
destdn->first = MAX(destdn->first, next_dest_snap);
if (destdn->is_auth())
if (destdn->is_auth() && !destdnl->is_null())
mdcache->journal_cow_dentry(mdr.get(), metablob, destdn, CEPH_NOSNAP, 0, destdnl);
- else
- destdn->first = MAX(destdn->first, next_dest_snap);
+
+ destdn->first = MAX(srci->first, next_dest_snap);
if (destdn->is_auth())
metablob->add_primary_dentry(destdn, srci, true, true);
dout(10) << " NOT journaling srcdn " << *srcdn << dendl;
// make renamed inode first track the dn
- if (srcdnl->is_primary() && destdn->is_auth())
- srci->first = destdn->first;
+ if (srcdnl->is_primary() && destdn->is_auth()) {
+ assert(srci->first <= destdn->first);
+ srci->first = destdn->first;
+ }
+ // make stray inode first track the straydn
+ if (straydn && straydn->is_auth()) {
+ assert(oldin->first <= straydn->first);
+ oldin->first = straydn->first;
+ }
if (oldin && oldin->is_dir()) {
assert(straydn);