From 61f8dbb76c8bcc1bfe43880146005aa834184a92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnther=20Deschner?= Date: Tue, 18 Dec 2018 17:20:29 +0100 Subject: [PATCH 1/2] s3-vfs-streams_xattr: add close call MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://bugzilla.samba.org/show_bug.cgi?id=13725 We cannot always rely on vfs_default to close the fake fds. This mostly is relevant when used with another non-local VFS filesystem module such as gluster. Guenther Signed-off-by: Günther Deschner Reviewed-by: Jeremy Allison Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Thu Dec 20 07:18:20 CET 2018 on sn-devel-144 (cherry picked from commit 1b263ed631c86bf4117c9388fce3fa1f24cea4c9) --- source3/modules/vfs_streams_xattr.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/source3/modules/vfs_streams_xattr.c b/source3/modules/vfs_streams_xattr.c index 87c5589395a..ae80effc544 100644 --- a/source3/modules/vfs_streams_xattr.c +++ b/source3/modules/vfs_streams_xattr.c @@ -544,6 +544,31 @@ static int streams_xattr_open(vfs_handle_struct *handle, return -1; } +static int streams_xattr_close(vfs_handle_struct *handle, + files_struct *fsp) +{ + int ret; + int fd; + + fd = fsp->fh->fd; + + DBG_DEBUG("streams_xattr_close called [%s] fd [%d]\n", + smb_fname_str_dbg(fsp->fsp_name), fd); + + if (!is_ntfs_stream_smb_fname(fsp->fsp_name)) { + return SMB_VFS_NEXT_CLOSE(handle, fsp); + } + + if (is_ntfs_default_stream_smb_fname(fsp->fsp_name)) { + return SMB_VFS_NEXT_CLOSE(handle, fsp); + } + + ret = close(fd); + fsp->fh->fd = -1; + + return ret; +} + static int streams_xattr_unlink(vfs_handle_struct *handle, const struct smb_filename *smb_fname) { @@ -1643,6 +1668,7 @@ static struct vfs_fn_pointers vfs_streams_xattr_fns = { .fs_capabilities_fn = streams_xattr_fs_capabilities, .connect_fn = streams_xattr_connect, .open_fn = streams_xattr_open, + .close_fn = streams_xattr_close, .stat_fn = streams_xattr_stat, .fstat_fn = streams_xattr_fstat, .lstat_fn = streams_xattr_lstat, -- 2.20.1 From 9c59a5a28cf4493dbbf3d8175c879891bf6990fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnther=20Deschner?= Date: Tue, 18 Dec 2018 17:18:33 +0100 Subject: [PATCH 2/2] s3-vfs-fruit: add close call MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://bugzilla.samba.org/show_bug.cgi?id=13725 We cannot always rely on vfs_default to close the fake fds. This mostly is relevant when used with another non-local VFS filesystem module such as gluster. Guenther Signed-off-by: Günther Deschner Reviewed-by: Jeremy Allison Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Fri Dec 21 07:20:49 CET 2018 on sn-devel-144 (cherry picked from commit ba016939aa91e0806f509c8b8ce9506bebceb7e5) --- source3/modules/vfs_fruit.c | 82 +++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c index 9d6efb2c38c..90fcd5d5d34 100644 --- a/source3/modules/vfs_fruit.c +++ b/source3/modules/vfs_fruit.c @@ -3719,6 +3719,87 @@ static int fruit_open(vfs_handle_struct *handle, return fd; } +static int fruit_close_meta(vfs_handle_struct *handle, + files_struct *fsp) +{ + int ret; + struct fruit_config_data *config = NULL; + + SMB_VFS_HANDLE_GET_DATA(handle, config, + struct fruit_config_data, return -1); + + switch (config->meta) { + case FRUIT_META_STREAM: + ret = SMB_VFS_NEXT_CLOSE(handle, fsp); + break; + + case FRUIT_META_NETATALK: + ret = close(fsp->fh->fd); + fsp->fh->fd = -1; + break; + + default: + DBG_ERR("Unexpected meta config [%d]\n", config->meta); + return -1; + } + + return ret; +} + + +static int fruit_close_rsrc(vfs_handle_struct *handle, + files_struct *fsp) +{ + int ret; + struct fruit_config_data *config = NULL; + + SMB_VFS_HANDLE_GET_DATA(handle, config, + struct fruit_config_data, return -1); + + switch (config->rsrc) { + case FRUIT_RSRC_STREAM: + case FRUIT_RSRC_ADFILE: + ret = SMB_VFS_NEXT_CLOSE(handle, fsp); + break; + + case FRUIT_RSRC_XATTR: + ret = close(fsp->fh->fd); + fsp->fh->fd = -1; + break; + + default: + DBG_ERR("Unexpected rsrc config [%d]\n", config->rsrc); + return -1; + } + + return ret; +} + +static int fruit_close(vfs_handle_struct *handle, + files_struct *fsp) +{ + int ret; + int fd; + + fd = fsp->fh->fd; + + DBG_DEBUG("Path [%s] fd [%d]\n", smb_fname_str_dbg(fsp->fsp_name), fd); + + if (!is_ntfs_stream_smb_fname(fsp->fsp_name)) { + return SMB_VFS_NEXT_CLOSE(handle, fsp); + } + + if (is_afpinfo_stream(fsp->fsp_name)) { + ret = fruit_close_meta(handle, fsp); + } else if (is_afpresource_stream(fsp->fsp_name)) { + ret = fruit_close_rsrc(handle, fsp); + } else { + ret = SMB_VFS_NEXT_CLOSE(handle, fsp); + } + + return ret; +} + static int fruit_rename(struct vfs_handle_struct *handle, const struct smb_filename *smb_fname_src, const struct smb_filename *smb_fname_dst) @@ -7024,6 +7105,7 @@ static struct vfs_fn_pointers vfs_fruit_fns = { .rename_fn = fruit_rename, .rmdir_fn = fruit_rmdir, .open_fn = fruit_open, + .close_fn = fruit_close, .pread_fn = fruit_pread, .pwrite_fn = fruit_pwrite, .pread_send_fn = fruit_pread_send, -- 2.20.1