]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: continue linking if targeti is temporarily located in stray dir 53495/head
authorXiubo Li <xiubli@redhat.com>
Wed, 30 Aug 2023 05:24:01 +0000 (13:24 +0800)
committerXiubo Li <xiubli@redhat.com>
Mon, 18 Sep 2023 02:08:09 +0000 (10:08 +0800)
If one inode has more than one hardlink and after the primary dentry
is unlinked it will located the inode in the stray dir temporarily,
which is pending reintegration.

Just before the linkmerge/migrate is triggered a link request comes
it will fail with -EXDEV.

Just skip it and continue the linking.

Fixes: https://tracker.ceph.com/issues/56695
Signed-off-by: Xiubo Li <xiubli@redhat.com>
(cherry picked from commit 5b9df823a2ab333be6205b8add8fbae7c3d2cc17)

src/mds/Server.cc

index 5b115144731fd0d849be62808d03781f249f6d44..8ce40989d78c13ba16857abf3bc997fd1997556f 100644 (file)
@@ -7125,7 +7125,9 @@ void Server::handle_client_link(MDRequestRef& mdr)
   SnapRealm *target_realm = target_pin->find_snaprealm();
   if (target_pin != dir->inode &&
       target_realm->get_subvolume_ino() !=
-      dir->inode->find_snaprealm()->get_subvolume_ino()) {
+      dir->inode->find_snaprealm()->get_subvolume_ino() &&
+      /* The inode is temporarily located in the stray dir pending reintegration */
+      !target_pin->is_stray()) {
     dout(7) << "target is in different subvolume, failing..." << dendl;
     respond_to_request(mdr, -CEPHFS_EXDEV);
     return;