1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-22 02:50:28 +03:00

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

BUG: https://bugzilla.samba.org/show_bug.cgi?id=15192

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

(cherry picked from commit 9a8bc67f4a5e4afecd648523f43a8e97584fcfd0)

Autobuild-User(v4-17-test): Jule Anger <janger@samba.org>
Autobuild-Date(v4-17-test): Fri Oct  7 09:59:55 UTC 2022 on sn-devel-184
This commit is contained in:
Anoop C S 2022-10-03 15:36:13 +05:30 committed by Jule Anger
parent bac9532f0a
commit cb27978c46

View File

@ -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);