The branch, master has been updated via 688604a423b smbd: Simplify non_widelink_open() via 854e8091b78 vfs: Convert get_real_filename() to NTSTATUS via 812cb602e3b vfs: Add SMB_VFS_FSTATAT via c51f9ab233e vfs: Don't mask shadow_copy2_convert()'s errno from db94eefdd54 s3: smbd: Plumb in and use smbd_smb2_server_connection_read_handler() when server min protocol > NT1 (i.e. SMB2-only).
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 688604a423bb4dbb36ea6bc86e629d6ab0c4082d Author: Volker Lendecke <v...@samba.org> Date: Fri Mar 4 14:56:24 2022 +0100 smbd: Simplify non_widelink_open() Don't depend on fsp->fsp_flags.is_directory: We can always take the parent directory fname, chdir into it and openat(O_PATH|O_NOFOLLOW) the relative file name. To properly handle the symlink case without having O_PATH, upon failure we need the call to fstatat(AT_SYMLINK_NOFOLLOW) as a replacement for the fstat-call that we can do when we successfully opened the relative file name with O_NOFOLLOW. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> Autobuild-User(master): Jeremy Allison <j...@samba.org> Autobuild-Date(master): Thu Mar 10 19:19:06 UTC 2022 on sn-devel-184 commit 854e8091b78dfcfb909dc34f5d1943fa0dd7deb1 Author: Volker Lendecke <v...@samba.org> Date: Mon Mar 7 18:00:20 2022 +0100 vfs: Convert get_real_filename() to NTSTATUS This makes it possible to more easily handle STOPPED_ON_SYMLINK vs OBJECT_PATH_NOT_FOUND vs OBJECT_NAME_NOT_FOUND and so on. The next patch needs this to properly handle symlinks. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit 812cb602e3be3ffc4400cff1df63295cf2f4cd21 Author: Volker Lendecke <v...@samba.org> Date: Thu Jan 6 15:59:05 2022 +0100 vfs: Add SMB_VFS_FSTATAT Useful if you want to stat/fstat/lstat relative to a directory without doing chdir first. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> commit c51f9ab233e548010816f9774784880340fa8c79 Author: Volker Lendecke <v...@samba.org> Date: Fri Mar 4 16:38:34 2022 +0100 vfs: Don't mask shadow_copy2_convert()'s errno If it's really ENOMEM, shadow_copy2_convert() did set this itself. It might also return ENOENT for example. Found this while working on other patches. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Jeremy Allison <j...@samba.org> ----------------------------------------------------------------------- Summary of changes: examples/VFS/skel_opaque.c | 24 +++-- examples/VFS/skel_transparent.c | 20 ++++- source3/include/smbprofile.h | 1 + source3/include/vfs.h | 51 +++++++---- source3/include/vfs_macros.h | 7 ++ source3/modules/vfs_ceph.c | 14 +-- source3/modules/vfs_ceph_snapshots.c | 24 ++--- source3/modules/vfs_default.c | 41 +++++++-- source3/modules/vfs_full_audit.c | 44 +++++++-- source3/modules/vfs_glusterfs.c | 21 +++-- source3/modules/vfs_glusterfs_fuse.c | 21 +++-- source3/modules/vfs_gpfs.c | 25 +++--- source3/modules/vfs_not_implemented.c | 27 ++++-- source3/modules/vfs_shadow_copy2.c | 164 +++++++++++++++++++++++++++------- source3/modules/vfs_snapper.c | 31 +++---- source3/modules/vfs_time_audit.c | 37 ++++++-- source3/smbd/dir.c | 16 ++-- source3/smbd/filename.c | 110 +++++++++++------------ source3/smbd/open.c | 84 +++++++++++------ source3/smbd/proto.h | 12 +-- source3/smbd/vfs.c | 21 +++-- 21 files changed, 535 insertions(+), 260 deletions(-) Changeset truncated at 500 lines: diff --git a/examples/VFS/skel_opaque.c b/examples/VFS/skel_opaque.c index cc7bb880d5c..4719a45e7bb 100644 --- a/examples/VFS/skel_opaque.c +++ b/examples/VFS/skel_opaque.c @@ -345,6 +345,17 @@ static int skel_lstat(vfs_handle_struct *handle, return -1; } +static int skel_fstatat( + struct vfs_handle_struct *handle, + const struct files_struct *dirfsp, + const struct smb_filename *smb_fname, + SMB_STRUCT_STAT *sbuf, + int flags) +{ + errno = ENOSYS; + return -1; +} + static uint64_t skel_get_alloc_size(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_STAT *sbuf) @@ -640,13 +651,13 @@ static NTSTATUS skel_fstreaminfo(struct vfs_handle_struct *handle, return NT_STATUS_NOT_IMPLEMENTED; } -static int skel_get_real_filename(struct vfs_handle_struct *handle, - const struct smb_filename *path, - const char *name, - TALLOC_CTX *mem_ctx, char **found_name) +static NTSTATUS skel_get_real_filename(struct vfs_handle_struct *handle, + const struct smb_filename *path, + const char *name, + TALLOC_CTX *mem_ctx, + char **found_name) { - errno = ENOSYS; - return -1; + return NT_STATUS_NOT_IMPLEMENTED; } static const char *skel_connectpath(struct vfs_handle_struct *handle, @@ -1001,6 +1012,7 @@ static struct vfs_fn_pointers skel_opaque_fns = { .stat_fn = skel_stat, .fstat_fn = skel_fstat, .lstat_fn = skel_lstat, + .fstatat_fn = skel_fstatat, .get_alloc_size_fn = skel_get_alloc_size, .unlinkat_fn = skel_unlinkat, .fchmod_fn = skel_fchmod, diff --git a/examples/VFS/skel_transparent.c b/examples/VFS/skel_transparent.c index e145881b704..ecd3c282240 100644 --- a/examples/VFS/skel_transparent.c +++ b/examples/VFS/skel_transparent.c @@ -473,6 +473,16 @@ static int skel_lstat(vfs_handle_struct *handle, return SMB_VFS_NEXT_LSTAT(handle, smb_fname); } +static int skel_fstatat( + struct vfs_handle_struct *handle, + const struct files_struct *dirfsp, + const struct smb_filename *smb_fname, + SMB_STRUCT_STAT *sbuf, + int flags) +{ + return SMB_VFS_NEXT_FSTATAT(handle, dirfsp, smb_fname, sbuf, flags); +} + static uint64_t skel_get_alloc_size(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_STAT *sbuf) @@ -865,10 +875,11 @@ static NTSTATUS skel_fstreaminfo(struct vfs_handle_struct *handle, streams); } -static int skel_get_real_filename(struct vfs_handle_struct *handle, - const struct smb_filename *path, - const char *name, - TALLOC_CTX *mem_ctx, char **found_name) +static NTSTATUS skel_get_real_filename(struct vfs_handle_struct *handle, + const struct smb_filename *path, + const char *name, + TALLOC_CTX *mem_ctx, + char **found_name) { return SMB_VFS_NEXT_GET_REAL_FILENAME(handle, path, name, mem_ctx, found_name); @@ -1316,6 +1327,7 @@ static struct vfs_fn_pointers skel_transparent_fns = { .stat_fn = skel_stat, .fstat_fn = skel_fstat, .lstat_fn = skel_lstat, + .fstatat_fn = skel_fstatat, .get_alloc_size_fn = skel_get_alloc_size, .unlinkat_fn = skel_unlinkat, .fchmod_fn = skel_fchmod, diff --git a/source3/include/smbprofile.h b/source3/include/smbprofile.h index 3ddd4eb6f5d..ce7a7405bf4 100644 --- a/source3/include/smbprofile.h +++ b/source3/include/smbprofile.h @@ -66,6 +66,7 @@ struct tevent_context; SMBPROFILE_STATS_BASIC(syscall_stat) \ SMBPROFILE_STATS_BASIC(syscall_fstat) \ SMBPROFILE_STATS_BASIC(syscall_lstat) \ + SMBPROFILE_STATS_BASIC(syscall_fstatat) \ SMBPROFILE_STATS_BASIC(syscall_get_alloc_size) \ SMBPROFILE_STATS_BASIC(syscall_unlinkat) \ SMBPROFILE_STATS_BASIC(syscall_chmod) \ diff --git a/source3/include/vfs.h b/source3/include/vfs.h index 695ba0aebd0..333fdba1548 100644 --- a/source3/include/vfs.h +++ b/source3/include/vfs.h @@ -362,6 +362,8 @@ * Version 45 - Remove SMB_VFS_GETXATTR * Version 46 - Rename SMB_VFS_KERNEL_FLOCK to SMB_VFS_FILESYSTEM_SHAREMODE * Version 46 - Add flags and xferlen args to SMB_VFS_OFFLOAD_READ_RECV + * Version 46 - Add SMB_VFS_FSTATAT + * Version 46 - Change SMB_VFS_GET_REAL_FILENAME to return NTSTATUS */ #define SMB_VFS_INTERFACE_VERSION 46 @@ -1016,6 +1018,12 @@ struct vfs_fn_pointers { int (*stat_fn)(struct vfs_handle_struct *handle, struct smb_filename *smb_fname); int (*fstat_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_STAT *sbuf); int (*lstat_fn)(struct vfs_handle_struct *handle, struct smb_filename *smb_filename); + int (*fstatat_fn)( + struct vfs_handle_struct *handle, + const struct files_struct *dirfsp, + const struct smb_filename *smb_fname, + SMB_STRUCT_STAT *sbuf, + int flags); uint64_t (*get_alloc_size_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_STAT *sbuf); int (*unlinkat_fn)(struct vfs_handle_struct *handle, struct files_struct *srcdir_fsp, @@ -1135,11 +1143,11 @@ struct vfs_fn_pointers { unsigned int *num_streams, struct stream_struct **streams); - int (*get_real_filename_fn)(struct vfs_handle_struct *handle, - const struct smb_filename *path, - const char *name, - TALLOC_CTX *mem_ctx, - char **found_name); + NTSTATUS (*get_real_filename_fn)(struct vfs_handle_struct *handle, + const struct smb_filename *path, + const char *name, + TALLOC_CTX *mem_ctx, + char **found_name); const char *(*connectpath_fn)(struct vfs_handle_struct *handle, const struct smb_filename *smb_fname); @@ -1514,6 +1522,12 @@ int smb_vfs_call_fstat(struct vfs_handle_struct *handle, struct files_struct *fsp, SMB_STRUCT_STAT *sbuf); int smb_vfs_call_lstat(struct vfs_handle_struct *handle, struct smb_filename *smb_filename); +int smb_vfs_call_fstatat( + struct vfs_handle_struct *handle, + const struct files_struct *dirfsp, + const struct smb_filename *smb_fname, + SMB_STRUCT_STAT *sbuf, + int flags); uint64_t smb_vfs_call_get_alloc_size(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_STAT *sbuf); @@ -1598,11 +1612,11 @@ NTSTATUS smb_vfs_call_fstreaminfo(struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx, unsigned int *num_streams, struct stream_struct **streams); -int smb_vfs_call_get_real_filename(struct vfs_handle_struct *handle, - const struct smb_filename *path, - const char *name, - TALLOC_CTX *mem_ctx, - char **found_name); +NTSTATUS smb_vfs_call_get_real_filename(struct vfs_handle_struct *handle, + const struct smb_filename *path, + const char *name, + TALLOC_CTX *mem_ctx, + char **found_name); const char *smb_vfs_call_connectpath(struct vfs_handle_struct *handle, const struct smb_filename *smb_fname); NTSTATUS smb_vfs_call_brl_lock_windows(struct vfs_handle_struct *handle, @@ -1942,6 +1956,12 @@ int vfs_not_implemented_fstat(vfs_handle_struct *handle, files_struct *fsp, SMB_STRUCT_STAT *sbuf); int vfs_not_implemented_lstat(vfs_handle_struct *handle, struct smb_filename *smb_fname); +int vfs_not_implemented_fstatat( + struct vfs_handle_struct *handle, + const struct files_struct *dirfsp, + const struct smb_filename *smb_fname, + SMB_STRUCT_STAT *sbuf, + int flags); uint64_t vfs_not_implemented_get_alloc_size(struct vfs_handle_struct *handle, struct files_struct *fsp, const SMB_STRUCT_STAT *sbuf); @@ -2058,11 +2078,12 @@ NTSTATUS vfs_not_implemented_fstreaminfo(struct vfs_handle_struct *handle, TALLOC_CTX *mem_ctx, unsigned int *num_streams, struct stream_struct **streams); -int vfs_not_implemented_get_real_filename(struct vfs_handle_struct *handle, - const struct smb_filename *path, - const char *name, - TALLOC_CTX *mem_ctx, - char **found_name); +NTSTATUS vfs_not_implemented_get_real_filename( + struct vfs_handle_struct *handle, + const struct smb_filename *path, + const char *name, + TALLOC_CTX *mem_ctx, + char **found_name); const char *vfs_not_implemented_connectpath(struct vfs_handle_struct *handle, const struct smb_filename *smb_fname); NTSTATUS vfs_not_implemented_brl_lock_windows(struct vfs_handle_struct *handle, diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h index 49654f59ff2..99619320df4 100644 --- a/source3/include/vfs_macros.h +++ b/source3/include/vfs_macros.h @@ -228,6 +228,13 @@ #define SMB_VFS_NEXT_LSTAT(handle, smb_fname) \ smb_vfs_call_lstat((handle)->next, (smb_fname)) +#define SMB_VFS_FSTATAT(conn, dirfsp, smb_fname, sbuf, flags) \ + smb_vfs_call_fstatat((conn)->vfs_handles, (dirfsp), (smb_fname), \ + (sbuf), (flags)) +#define SMB_VFS_NEXT_FSTATAT(conn, dirfsp, smb_fname, sbuf, flags) \ + smb_vfs_call_fstatat((handle)->next, (dirfsp), (smb_fname), \ + (sbuf), (flags)) + #define SMB_VFS_GET_ALLOC_SIZE(conn, fsp, sbuf) \ smb_vfs_call_get_alloc_size((conn)->vfs_handles, (fsp), (sbuf)) #define SMB_VFS_NEXT_GET_ALLOC_SIZE(conn, fsp, sbuf) \ diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c index 4e1fa6a2df4..9188b7991d4 100644 --- a/source3/modules/vfs_ceph.c +++ b/source3/modules/vfs_ceph.c @@ -1276,18 +1276,18 @@ static int cephwrap_fchflags(struct vfs_handle_struct *handle, return -1; } -static int cephwrap_get_real_filename(struct vfs_handle_struct *handle, - const struct smb_filename *path, - const char *name, - TALLOC_CTX *mem_ctx, - char **found_name) +static NTSTATUS cephwrap_get_real_filename( + struct vfs_handle_struct *handle, + const struct smb_filename *path, + const char *name, + TALLOC_CTX *mem_ctx, + char **found_name) { /* * Don't fall back to get_real_filename so callers can differentiate * between a full directory scan and an actual case-insensitive stat. */ - errno = EOPNOTSUPP; - return -1; + return NT_STATUS_NOT_SUPPORTED; } static const char *cephwrap_connectpath(struct vfs_handle_struct *handle, diff --git a/source3/modules/vfs_ceph_snapshots.c b/source3/modules/vfs_ceph_snapshots.c index d533b9479a3..ad4c8f1dd94 100644 --- a/source3/modules/vfs_ceph_snapshots.c +++ b/source3/modules/vfs_ceph_snapshots.c @@ -1313,23 +1313,24 @@ static int ceph_snap_gmt_fsetxattr(struct vfs_handle_struct *handle, aname, value, size, flags); } -static int ceph_snap_gmt_get_real_filename(struct vfs_handle_struct *handle, - const struct smb_filename *path, - const char *name, - TALLOC_CTX *mem_ctx, - char **found_name) +static NTSTATUS ceph_snap_gmt_get_real_filename( + struct vfs_handle_struct *handle, + const struct smb_filename *path, + const char *name, + TALLOC_CTX *mem_ctx, + char **found_name) { time_t timestamp = 0; char stripped[PATH_MAX + 1]; char conv[PATH_MAX + 1]; struct smb_filename conv_fname; int ret; + NTSTATUS status; ret = ceph_snap_gmt_strip_snapshot(handle, path, ×tamp, stripped, sizeof(stripped)); if (ret < 0) { - errno = -ret; - return -1; + return map_nt_error_from_unix(-ret); } if (timestamp == 0) { return SMB_VFS_NEXT_GET_REAL_FILENAME(handle, path, name, @@ -1338,17 +1339,16 @@ static int ceph_snap_gmt_get_real_filename(struct vfs_handle_struct *handle, ret = ceph_snap_gmt_convert_dir(handle, stripped, timestamp, conv, sizeof(conv)); if (ret < 0) { - errno = -ret; - return -1; + return map_nt_error_from_unix(-ret); } conv_fname = (struct smb_filename) { .base_name = conv, }; - ret = SMB_VFS_NEXT_GET_REAL_FILENAME(handle, &conv_fname, name, - mem_ctx, found_name); - return ret; + status = SMB_VFS_NEXT_GET_REAL_FILENAME( + handle, &conv_fname, name, mem_ctx, found_name); + return status; } static uint64_t ceph_snap_gmt_disk_free(vfs_handle_struct *handle, diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index 64760874792..6c4f15ba39f 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -1314,6 +1314,33 @@ static int vfswrap_lstat(vfs_handle_struct *handle, return result; } +static int vfswrap_fstatat( + struct vfs_handle_struct *handle, + const struct files_struct *dirfsp, + const struct smb_filename *smb_fname, + SMB_STRUCT_STAT *sbuf, + int flags) +{ + int result = -1; + + START_PROFILE(syscall_fstatat); + + if (is_named_stream(smb_fname)) { + errno = ENOENT; + goto out; + } + + result = sys_fstatat( + fsp_get_pathref_fd(dirfsp), + smb_fname->base_name, + sbuf, + flags, + lp_fake_directory_create_times(SNUM(handle->conn))); + out: + END_PROFILE(syscall_fstatat); + return result; +} + static NTSTATUS vfswrap_translate_name(struct vfs_handle_struct *handle, const char *name, enum vfs_translate_direction direction, @@ -3335,18 +3362,17 @@ static NTSTATUS vfswrap_fstreaminfo(vfs_handle_struct *handle, return NT_STATUS_OK; } -static int vfswrap_get_real_filename(struct vfs_handle_struct *handle, - const struct smb_filename *path, - const char *name, - TALLOC_CTX *mem_ctx, - char **found_name) +static NTSTATUS vfswrap_get_real_filename(struct vfs_handle_struct *handle, + const struct smb_filename *path, + const char *name, + TALLOC_CTX *mem_ctx, + char **found_name) { /* * Don't fall back to get_real_filename so callers can differentiate * between a full directory scan and an actual case-insensitive stat. */ - errno = EOPNOTSUPP; - return -1; + return NT_STATUS_NOT_SUPPORTED; } static const char *vfswrap_connectpath(struct vfs_handle_struct *handle, @@ -3968,6 +3994,7 @@ static struct vfs_fn_pointers vfs_default_fns = { .stat_fn = vfswrap_stat, .fstat_fn = vfswrap_fstat, .lstat_fn = vfswrap_lstat, + .fstatat_fn = vfswrap_fstatat, .get_alloc_size_fn = vfswrap_get_alloc_size, .unlinkat_fn = vfswrap_unlinkat, .fchmod_fn = vfswrap_fchmod, diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c index 5903849931e..a905971c1b9 100644 --- a/source3/modules/vfs_full_audit.c +++ b/source3/modules/vfs_full_audit.c @@ -140,6 +140,7 @@ typedef enum _vfs_op_type { SMB_VFS_OP_STAT, SMB_VFS_OP_FSTAT, SMB_VFS_OP_LSTAT, + SMB_VFS_OP_FSTATAT, SMB_VFS_OP_GET_ALLOC_SIZE, SMB_VFS_OP_UNLINKAT, SMB_VFS_OP_FCHMOD, @@ -276,6 +277,7 @@ static struct { { SMB_VFS_OP_STAT, "stat" }, { SMB_VFS_OP_FSTAT, "fstat" }, { SMB_VFS_OP_LSTAT, "lstat" }, + { SMB_VFS_OP_FSTATAT, "fstatat" }, { SMB_VFS_OP_GET_ALLOC_SIZE, "get_alloc_size" }, { SMB_VFS_OP_UNLINKAT, "unlinkat" }, { SMB_VFS_OP_FCHMOD, "fchmod" }, @@ -1568,6 +1570,26 @@ static int smb_full_audit_lstat(vfs_handle_struct *handle, return result; } +static int smb_full_audit_fstatat( + struct vfs_handle_struct *handle, + const struct files_struct *dirfsp, + const struct smb_filename *smb_fname, + SMB_STRUCT_STAT *sbuf, + int flags) +{ + int result; + + result = SMB_VFS_NEXT_FSTATAT(handle, dirfsp, smb_fname, sbuf, flags); + + do_log(SMB_VFS_OP_FSTATAT, + (result >= 0), + handle, + "%s/%s", + fsp_str_do_log(dirfsp), + smb_fname_str_do_log(handle->conn, smb_fname)); + + return result; +} static uint64_t smb_full_audit_get_alloc_size(vfs_handle_struct *handle, files_struct *fsp, const SMB_STRUCT_STAT *sbuf) { @@ -2058,20 +2080,25 @@ static NTSTATUS smb_full_audit_fstreaminfo(vfs_handle_struct *handle, return result; } -static int smb_full_audit_get_real_filename(struct vfs_handle_struct *handle, - const struct smb_filename *path, - const char *name, - TALLOC_CTX *mem_ctx, - char **found_name) +static NTSTATUS smb_full_audit_get_real_filename( + struct vfs_handle_struct *handle, + const struct smb_filename *path, + const char *name, + TALLOC_CTX *mem_ctx, + char **found_name) { - int result; + NTSTATUS result; result = SMB_VFS_NEXT_GET_REAL_FILENAME(handle, path, name, mem_ctx, found_name); - do_log(SMB_VFS_OP_GET_REAL_FILENAME, (result == 0), handle, + do_log(SMB_VFS_OP_GET_REAL_FILENAME, + NT_STATUS_IS_OK(result), + handle, "%s/%s->%s", - path->base_name, name, (result == 0) ? *found_name : ""); + path->base_name, + name, + NT_STATUS_IS_OK(result) ? *found_name : ""); return result; } @@ -2930,6 +2957,7 @@ static struct vfs_fn_pointers vfs_full_audit_fns = { .stat_fn = smb_full_audit_stat, .fstat_fn = smb_full_audit_fstat, .lstat_fn = smb_full_audit_lstat, + .fstatat_fn = smb_full_audit_fstatat, .get_alloc_size_fn = smb_full_audit_get_alloc_size, .unlinkat_fn = smb_full_audit_unlinkat, .fchmod_fn = smb_full_audit_fchmod, diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c index 25b82bdd471..bce73094c54 100644 --- a/source3/modules/vfs_glusterfs.c +++ b/source3/modules/vfs_glusterfs.c @@ -2003,19 +2003,19 @@ static int vfs_gluster_fchflags(struct vfs_handle_struct *handle, return -1; } -static int vfs_gluster_get_real_filename(struct vfs_handle_struct *handle, - const struct smb_filename *path, - const char *name, - TALLOC_CTX *mem_ctx, - char **found_name) +static NTSTATUS vfs_gluster_get_real_filename( + struct vfs_handle_struct *handle, + const struct smb_filename *path, + const char *name, + TALLOC_CTX *mem_ctx, + char **found_name) { int ret; char key_buf[GLUSTER_NAME_MAX + 64]; char val_buf[GLUSTER_NAME_MAX + 1]; -- Samba Shared Repository