}
// dest
+ /* FIXME: this looks to largely assume that a remote
+ * src implies a local dest, that's not good -- we might be
+ * auth for the srci or the desti without being auth on the dentries */
if (srcdnl->is_remote()) {
- (srcdnl->get_inode() && srcdnl->get_inode()->is_auth()) ||
+ assert(not_journaling || srcdn->is_auth() ||destdn->is_auth() ||
++ (srci && srci->is_auth()) ||
+ (destdnl->get_inode() && destdnl->get_inode()->is_auth()));
if (!linkmerge) {
- if (!destdnl->is_null())
+ if (destdn->is_auth() && !destdnl->is_null())
mdcache->journal_cow_dentry(mdr, metablob, destdn, CEPH_NOSNAP, 0, destdnl);
else
destdn->first = MAX(destdn->first, next_dest_snap);
- metablob->add_remote_dentry(destdn, true, srcdnl->get_remote_ino(), srcdnl->get_remote_d_type());
- if (srci->is_auth()) {
+
+ if (destdn->is_auth())
+ metablob->add_remote_dentry(destdn, true, srcdnl->get_remote_ino(), srcdnl->get_remote_d_type());
- if (srcdnl->get_inode()->get_parent_dn()->is_auth()) { // it's remote
- mdcache->journal_cow_dentry(mdr, metablob, srcdnl->get_inode()->get_parent_dn(), CEPH_NOSNAP, 0, srcdnl);
- ji = metablob->add_primary_dentry(srcdnl->get_inode()->get_parent_dn(), true, srcdnl->get_inode());
++ if (srci->get_parent_dn()->is_auth()) { // it's remote
+ metablob->add_dir_context(srci->get_parent_dir());
- mdcache->journal_cow_dentry(mdr, metablob, srci->get_parent_dn(), CEPH_NOSNAP, 0, srcdnl);
++ mdcache->journal_cow_dentry(mdr, metablob, srci->get_parent_dn(), CEPH_NOSNAP, 0, srcdnl);
+ ji = metablob->add_primary_dentry(srci->get_parent_dn(), true, srci);
}
} else {
- if (!destdnl->is_null())
+ if (destdn->is_auth() && !destdnl->is_null())
mdcache->journal_cow_dentry(mdr, metablob, destdn, CEPH_NOSNAP, 0, destdnl);
else
destdn->first = MAX(destdn->first, next_dest_snap);
} else if (srcdnl->is_primary()) {
// project snap parent update?
bufferlist snapbl;
- if (destdn->is_auth() && srcdnl->get_inode()->snaprealm)
- srcdnl->get_inode()->project_past_snaprealm_parent(dest_realm, snapbl);
+ if (destdn->is_auth() && srci->snaprealm)
+ srci->project_past_snaprealm_parent(dest_realm, snapbl);
- if (!destdnl->is_null())
+ if (destdn->is_auth() && !destdnl->is_null())
mdcache->journal_cow_dentry(mdr, metablob, destdn, CEPH_NOSNAP, 0, destdnl);
else
destdn->first = MAX(destdn->first, next_dest_snap);
- ji = metablob->add_primary_dentry(destdn, true, srci, 0, &snapbl);
+
+ if (destdn->is_auth() ||
+ (destdnl->get_inode() && destdnl->get_inode()->is_auth()))
- ji = metablob->add_primary_dentry(destdn, true, srcdnl->get_inode(), 0, &snapbl);
++ ji = metablob->add_primary_dentry(destdn, true, srci, 0, &snapbl);
}
// src