vfs_glusterfs: cope with AT_FDCWD dirfps in vfs_gluster_renameat()
authorRalph Boehme <slow@samba.org>
Wed, 29 Nov 2023 15:17:28 +0000 (16:17 +0100)
committerRalph Boehme <slow@samba.org>
Mon, 4 Dec 2023 09:58:22 +0000 (10:58 +0100)
(cherry picked from commit 1d321ae689b57bc52a9b90e8ad365ae4e7c867f9)

source3/modules/vfs_glusterfs.c

index 18f3f470ad4f4cf34b441f57490d1090735c449a..5c49306bc760049191336ea6df77cf314fd61039 100644 (file)
@@ -1293,35 +1293,45 @@ static int vfs_gluster_renameat(struct vfs_handle_struct *handle,
                        files_struct *dstfsp,
                        const struct smb_filename *smb_fname_dst)
 {
+       struct smb_filename *full_fname_src = NULL;
+       struct smb_filename *full_fname_dst = NULL;
        int ret;
 
-#ifdef HAVE_GFAPI_VER_7_11
-       glfs_fd_t *src_pglfd = NULL;
-       glfs_fd_t *dst_pglfd = NULL;
-
        START_PROFILE(syscall_renameat);
 
-       src_pglfd = vfs_gluster_fetch_glfd(handle, srcfsp);
-       if (src_pglfd == NULL) {
-               END_PROFILE(syscall_renameat);
-               DBG_ERR("Failed to fetch gluster fd\n");
-               return -1;
+       if (fsp_get_pathref_fd(srcfsp) == AT_FDCWD ||
+           fsp_get_pathref_fd(dstfsp) == AT_FDCWD)
+       {
+               SMB_ASSERT(fsp_get_pathref_fd(srcfsp) == AT_FDCWD &&
+                          fsp_get_pathref_fd(dstfsp) == AT_FDCWD);
+               goto do_rename;
        }
 
-       dst_pglfd = vfs_gluster_fetch_glfd(handle, dstfsp);
-       if (dst_pglfd == NULL) {
-               END_PROFILE(syscall_renameat);
-               DBG_ERR("Failed to fetch gluster fd\n");
-               return -1;
-       }
+#ifdef HAVE_GFAPI_VER_7_11
+       {
+               glfs_fd_t *src_pglfd = NULL;
+               glfs_fd_t *dst_pglfd = NULL;
 
-       ret = glfs_renameat(src_pglfd, smb_fname_src->base_name,
-                           dst_pglfd, smb_fname_dst->base_name);
-#else
-       struct smb_filename *full_fname_src = NULL;
-       struct smb_filename *full_fname_dst = NULL;
+               src_pglfd = vfs_gluster_fetch_glfd(handle, srcfsp);
+               if (src_pglfd == NULL) {
+                       END_PROFILE(syscall_renameat);
+                       DBG_ERR("Failed to fetch gluster fd\n");
+                       return -1;
+               }
 
-       START_PROFILE(syscall_renameat);
+               dst_pglfd = vfs_gluster_fetch_glfd(handle, dstfsp);
+               if (dst_pglfd == NULL) {
+                       END_PROFILE(syscall_renameat);
+                       DBG_ERR("Failed to fetch gluster fd\n");
+                       return -1;
+               }
+
+               ret = glfs_renameat(src_pglfd, smb_fname_src->base_name,
+                                   dst_pglfd, smb_fname_dst->base_name);
+               END_PROFILE(syscall_renameat);
+               return ret;
+       }
+#endif
 
        full_fname_src = full_path_from_dirfsp_atname(talloc_tos(),
                                                      srcfsp,
@@ -1331,6 +1341,7 @@ static int vfs_gluster_renameat(struct vfs_handle_struct *handle,
                errno = ENOMEM;
                return -1;
        }
+       smb_fname_src = full_fname_src;
 
        full_fname_dst = full_path_from_dirfsp_atname(talloc_tos(),
                                                      dstfsp,
@@ -1341,13 +1352,15 @@ static int vfs_gluster_renameat(struct vfs_handle_struct *handle,
                errno = ENOMEM;
                return -1;
        }
+       smb_fname_dst = full_fname_dst;
+
+do_rename:
        ret = glfs_rename(handle->data,
-                         full_fname_src->base_name,
-                         full_fname_dst->base_name);
+                         smb_fname_src->base_name,
+                         smb_fname_dst->base_name);
 
        TALLOC_FREE(full_fname_src);
        TALLOC_FREE(full_fname_dst);
-#endif
 
        END_PROFILE(syscall_renameat);