]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
vfs_glusterfs: Remove special handling of O_CREAT flag
authorAnoop C S <anoopcs@samba.org>
Mon, 3 Oct 2022 10:06:13 +0000 (15:36 +0530)
committerRalph Boehme <slow@samba.org>
Thu, 6 Oct 2022 08:34:56 +0000 (08:34 +0000)
Special handling of O_CREAT flag in SMB_VFS_OPENAT code path was the
only option to ensure correctness due to a bug in libgfapi as detailed
in issue #3838[1] from GlusterFS upstream. This has been fixed recently
so that O_CREAT is handled correctly within glfs_openat() enbaling us to
remove the corresponding special case from vfs_gluster_openat().

[1] https://github.com/gluster/glusterfs/issues/3838

Signed-off-by: Anoop C S <anoopcs@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
Autobuild-User(master): Ralph Böhme <slow@samba.org>
Autobuild-Date(master): Thu Oct  6 08:34:56 UTC 2022 on sn-devel-184

source3/modules/vfs_glusterfs.c

index 33f941aaca987b74a167914cec6ea4d0dbe96751..4284d7dea1d63d8d6b0d4a033fc60eb4c98d4712 100644 (file)
@@ -825,61 +825,43 @@ static int vfs_gluster_openat(struct vfs_handle_struct *handle,
                became_root = true;
        }
 
-       /*
-        * O_CREAT flag in open is handled differently in a way which is *NOT*
-        * safe against symlink race situations. We use glfs_creat() instead
-        * for correctness as glfs_openat() is broken with O_CREAT present
-        * in open flags.
-        */
-       if (flags & O_CREAT) {
-               if (fsp_get_pathref_fd(dirfsp) != AT_FDCWD) {
-                       /*
-                        * Replace smb_fname with full_path constructed above.
-                        */
-                       smb_fname = full_fname;
+       if (fsp_get_pathref_fd(dirfsp) != AT_FDCWD) {
+#ifdef HAVE_GFAPI_VER_7_11
+               /*
+                * Fetch Gluster fd for parent directory using dirfsp
+                * before calling glfs_openat();
+                */
+               pglfd = vfs_gluster_fetch_glfd(handle, dirfsp);
+               if (pglfd == NULL) {
+                       END_PROFILE(syscall_openat);
+                       DBG_ERR("Failed to fetch gluster fd\n");
+                       return -1;
                }
 
+               glfd = glfs_openat(pglfd,
+                                  smb_fname->base_name,
+                                  flags,
+                                  how->mode);
+#else
+               /*
+                * Replace smb_fname with full_path constructed above.
+                */
+               smb_fname = full_fname;
+#endif
+       }
+
+       if (pglfd == NULL) {
                /*
                 * smb_fname can either be a full_path or the same one
                 * as received from the caller. In the latter case we
                 * are operating at current working directory.
                 */
-               glfd = glfs_creat(handle->data,
-                                 smb_fname->base_name,
-                                 flags,
-                                 how->mode);
-       } else {
-               if (fsp_get_pathref_fd(dirfsp) != AT_FDCWD) {
-#ifdef HAVE_GFAPI_VER_7_11
-                       /*
-                        * Fetch Gluster fd for parent directory using dirfsp
-                        * before calling glfs_openat();
-                        */
-                       pglfd = vfs_gluster_fetch_glfd(handle, dirfsp);
-                       if (pglfd == NULL) {
-                               END_PROFILE(syscall_openat);
-                               DBG_ERR("Failed to fetch gluster fd\n");
-                               return -1;
-                       }
-
-                       glfd = glfs_openat(pglfd,
-                                          smb_fname->base_name,
-                                          flags,
-                                          how->mode);
-#else
-                       /*
-                        * Replace smb_fname with full_path constructed above.
-                        */
-                       smb_fname = full_fname;
-#endif
-               }
-
-               if (pglfd == NULL) {
-                       /*
-                        * smb_fname can either be a full_path or the same one
-                        * as received from the caller. In the latter case we
-                        * are operating at current working directory.
-                        */
+               if (flags & O_CREAT) {
+                       glfd = glfs_creat(handle->data,
+                                         smb_fname->base_name,
+                                         flags,
+                                         how->mode);
+               } else {
                        glfd = glfs_open(handle->data,
                                         smb_fname->base_name,
                                         flags);