]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: disallow across subvolume rename
authorYan, Zheng <zyan@redhat.com>
Wed, 5 Aug 2020 07:37:20 +0000 (15:37 +0800)
committerYan, Zheng <zyan@redhat.com>
Wed, 26 Aug 2020 06:32:37 +0000 (14:32 +0800)
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit 53348ab67f0f3e691cfeb6b02d80b868fdb98d89)

src/mds/Server.cc

index ecbd380df6a559e80304a18d589e3beb11c9db8c..0fe3f900e3b6c51539f7e6f2b3332e306c2db75a 100644 (file)
@@ -7743,6 +7743,21 @@ void Server::handle_client_rename(MDRequestRef& mdr)
   }
   */
 
+  SnapRealm *dest_realm = nullptr;
+  SnapRealm *src_realm = nullptr;
+  if (!linkmerge) {
+    dest_realm = destdir->inode->find_snaprealm();
+    if (srcdir->inode == destdir->inode)
+      src_realm = dest_realm;
+    else
+      src_realm = srcdir->inode->find_snaprealm();
+    if (src_realm != dest_realm &&
+       src_realm->get_subvolume_ino() != dest_realm->get_subvolume_ino()) {
+      respond_to_request(mdr, -EXDEV);
+      return;
+    }
+  }
+
   ceph_assert(g_conf()->mds_kill_rename_at != 1);
 
   // -- open all srcdn inode frags, if any --
@@ -7792,7 +7807,6 @@ void Server::handle_client_rename(MDRequestRef& mdr)
          oldin->clear_snaprealm_global(new_srnode);
        mdr->more()->desti_srnode = new_srnode;
       } else if (destdnl->is_primary()) {
-       SnapRealm *dest_realm = destdir->inode->find_snaprealm();
        snapid_t follows = dest_realm->get_newest_seq();
        if (oldin->snaprealm || follows + 1 > oldin->get_oldest_snap()) {
          sr_t *new_srnode = oldin->prepare_new_srnode(follows);
@@ -7802,13 +7816,11 @@ void Server::handle_client_rename(MDRequestRef& mdr)
       }
     }
     if (!mdr->more()->srci_srnode) {
-      SnapRealm *dest_realm = destdir->inode->find_snaprealm();
       if (srci->is_projected_snaprealm_global()) {
        sr_t *new_srnode = srci->prepare_new_srnode(0);
        srci->record_snaprealm_parent_dentry(new_srnode, dest_realm, srcdn, srcdnl->is_primary());
        mdr->more()->srci_srnode = new_srnode;
       } else if (srcdnl->is_primary()) {
-       SnapRealm *src_realm = srcdir->inode->find_snaprealm();
        snapid_t follows = src_realm->get_newest_seq();
        if (src_realm != dest_realm &&
            (srci->snaprealm || follows + 1 > srci->get_oldest_snap())) {