]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: don't create snap inode during trans-authority rename
authorYan, Zheng <zyan@redhat.com>
Fri, 11 Aug 2017 08:25:30 +0000 (16:25 +0800)
committerYan, Zheng <zyan@redhat.com>
Mon, 4 Dec 2017 04:02:55 +0000 (12:02 +0800)
MDCache::cow_inode() may add auth pin to frozen inode

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
src/mds/MDCache.cc

index 1e4f89e26389194fe9509ce8b22edd3d0453c80b..b74a06faa626b894cf8dc6ce1339851addaae0d1 100644 (file)
@@ -1493,8 +1493,8 @@ CInode *MDCache::cow_inode(CInode *in, snapid_t last)
 
   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)
@@ -1581,9 +1581,14 @@ void MDCache::journal_cow_dentry(MutationImpl *mut, EMetaBlob *metablob,
     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) {
@@ -1604,7 +1609,7 @@ void MDCache::journal_cow_dentry(MutationImpl *mut, EMetaBlob *metablob,
          // 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);
        }
       }
 
@@ -1631,7 +1636,7 @@ void MDCache::journal_cow_dentry(MutationImpl *mut, EMetaBlob *metablob,
       return;
     }
 
-    in->cow_old_inode(follows, false);
+    in->cow_old_inode(follows, cow_head);
 
   } else {
     SnapRealm *realm = dn->dir->inode->find_snaprealm();
@@ -1648,8 +1653,6 @@ void MDCache::journal_cow_dentry(MutationImpl *mut, EMetaBlob *metablob,
     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)