goto out;
        }
 
+       /*
+        * Before doing any rename and link operations, do a first pass on the
+        * new references to orphanize any unprocessed inodes that may have a
+        * reference that conflicts with one of the new references of the current
+        * inode. This needs to happen first because a new reference may conflict
+        * with the old reference of a parent directory, so we must make sure
+        * that the path used for link and rename commands don't use an
+        * orphanized name when an ancestor was not yet orphanized.
+        *
+        * Example:
+        *
+        * Parent snapshot:
+        *
+        * .                                                      (ino 256)
+        * |----- testdir/                                        (ino 259)
+        * |          |----- a                                    (ino 257)
+        * |
+        * |----- b                                               (ino 258)
+        *
+        * Send snapshot:
+        *
+        * .                                                      (ino 256)
+        * |----- testdir_2/                                      (ino 259)
+        * |          |----- a                                    (ino 260)
+        * |
+        * |----- testdir                                         (ino 257)
+        * |----- b                                               (ino 257)
+        * |----- b2                                              (ino 258)
+        *
+        * Processing the new reference for inode 257 with name "b" may happen
+        * before processing the new reference with name "testdir". If so, we
+        * must make sure that by the time we send a link command to create the
+        * hard link "b", inode 259 was already orphanized, since the generated
+        * path in "valid_path" already contains the orphanized name for 259.
+        * We are processing inode 257, so only later when processing 259 we do
+        * the rename operation to change its temporary (orphanized) name to
+        * "testdir_2".
+        */
        list_for_each_entry(cur, &sctx->new_refs, list) {
-               /*
-                * We may have refs where the parent directory does not exist
-                * yet. This happens if the parent directories inum is higher
-                * than the current inum. To handle this case, we create the
-                * parent directory out of order. But we need to check if this
-                * did already happen before due to other refs in the same dir.
-                */
                ret = get_cur_inode_state(sctx, cur->dir, cur->dir_gen);
                if (ret < 0)
                        goto out;
-               if (ret == inode_state_will_create) {
-                       ret = 0;
-                       /*
-                        * First check if any of the current inodes refs did
-                        * already create the dir.
-                        */
-                       list_for_each_entry(cur2, &sctx->new_refs, list) {
-                               if (cur == cur2)
-                                       break;
-                               if (cur2->dir == cur->dir) {
-                                       ret = 1;
-                                       break;
-                               }
-                       }
-
-                       /*
-                        * If that did not happen, check if a previous inode
-                        * did already create the dir.
-                        */
-                       if (!ret)
-                               ret = did_create_dir(sctx, cur->dir);
-                       if (ret < 0)
-                               goto out;
-                       if (!ret) {
-                               ret = send_create_inode(sctx, cur->dir);
-                               if (ret < 0)
-                                       goto out;
-                       }
-               }
+               if (ret == inode_state_will_create)
+                       continue;
 
                /*
-                * Check if this new ref would overwrite the first ref of
-                * another unprocessed inode. If yes, orphanize the
-                * overwritten inode. If we find an overwritten ref that is
-                * not the first ref, simply unlink it.
+                * Check if this new ref would overwrite the first ref of another
+                * unprocessed inode. If yes, orphanize the overwritten inode.
+                * If we find an overwritten ref that is not the first ref,
+                * simply unlink it.
                 */
                ret = will_overwrite_ref(sctx, cur->dir, cur->dir_gen,
                                cur->name, cur->name_len,
                        }
                }
 
+       }
+
+       list_for_each_entry(cur, &sctx->new_refs, list) {
+               /*
+                * We may have refs where the parent directory does not exist
+                * yet. This happens if the parent directories inum is higher
+                * than the current inum. To handle this case, we create the
+                * parent directory out of order. But we need to check if this
+                * did already happen before due to other refs in the same dir.
+                */
+               ret = get_cur_inode_state(sctx, cur->dir, cur->dir_gen);
+               if (ret < 0)
+                       goto out;
+               if (ret == inode_state_will_create) {
+                       ret = 0;
+                       /*
+                        * First check if any of the current inodes refs did
+                        * already create the dir.
+                        */
+                       list_for_each_entry(cur2, &sctx->new_refs, list) {
+                               if (cur == cur2)
+                                       break;
+                               if (cur2->dir == cur->dir) {
+                                       ret = 1;
+                                       break;
+                               }
+                       }
+
+                       /*
+                        * If that did not happen, check if a previous inode
+                        * did already create the dir.
+                        */
+                       if (!ret)
+                               ret = did_create_dir(sctx, cur->dir);
+                       if (ret < 0)
+                               goto out;
+                       if (!ret) {
+                               ret = send_create_inode(sctx, cur->dir);
+                               if (ret < 0)
+                                       goto out;
+                       }
+               }
+
                if (S_ISDIR(sctx->cur_inode_mode) && sctx->parent_root) {
                        ret = wait_for_dest_dir_move(sctx, cur, is_orphan);
                        if (ret < 0)