From: Anoop C S Date: Mon, 3 Oct 2022 10:06:13 +0000 (+0530) Subject: vfs_glusterfs: Remove special handling of O_CREAT flag X-Git-Tag: talloc-2.4.0~743 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9a8bc67f4a5e4afecd648523f43a8e97584fcfd0;p=thirdparty%2Fsamba.git vfs_glusterfs: Remove special handling of O_CREAT flag 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 Reviewed-by: Ralph Boehme Autobuild-User(master): Ralph Böhme Autobuild-Date(master): Thu Oct 6 08:34:56 UTC 2022 on sn-devel-184 --- diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c index 33f941aaca9..4284d7dea1d 100644 --- a/source3/modules/vfs_glusterfs.c +++ b/source3/modules/vfs_glusterfs.c @@ -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);