]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Merge branch 'next'
authorGreg Farnum <gregory.farnum@dreamhost.com>
Fri, 3 Jun 2011 17:02:32 +0000 (10:02 -0700)
committerGreg Farnum <gregory.farnum@dreamhost.com>
Fri, 3 Jun 2011 17:12:10 +0000 (10:12 -0700)
Conflicts:
src/mds/Server.cc

Signed-off-by: Greg Farnum <gregory.farnum@dreamhost.com>
1  2 
src/mds/Server.cc

index 559f97715a5d58256db1fa759368d2509e8d1249,2e479f11ed3a918b7abdf31439514abe93bc339b..3134e778428b15ac4bb948f961e9c9b4c5a54a00
@@@ -5202,27 -5203,20 +5204,28 @@@ void Server::_rename_prepare(MDRequest 
    }
  
    // 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