From 88ddfddc5e9832a12ede5c05e2eaa73b0f59ab6a Mon Sep 17 00:00:00 2001 From: Anoop C S Date: Mon, 3 Oct 2022 15:36:13 +0530 Subject: [PATCH] vfs_glusterfs: Remove special handling of O_CREAT flag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 (cherry picked from commit 9a8bc67f4a5e4afecd648523f43a8e97584fcfd0) --- source3/modules/vfs_glusterfs.c | 78 +++++++++++++-------------------- 1 file changed, 30 insertions(+), 48 deletions(-) diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c index e2f9fbd8bd4..8fef8c8bf9c 100644 --- a/source3/modules/vfs_glusterfs.c +++ b/source3/modules/vfs_glusterfs.c @@ -824,61 +824,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); -- 2.37.3