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:
parent
bac9532f0a
commit
cb27978c46
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user