From c291a55a352a8ee09e9e6ac118e3b0c31a9905e8 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 9 May 2009 11:12:52 +0200 Subject: Do not call SMB_VFS_GET_REAL_FILENAME if the name is mangled The GPFS get_real_file name does not know about mangled names. Tim, if onefs does not either, you need this bugfix :-) In case onefs does 8.3 names, we need to pass the mangled flag down to SMB_VFS_GET_REAL_FILENAME to give GPFS a chance say ENOTSUPP and do the fallback. --- source3/smbd/filename.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'source3/smbd') diff --git a/source3/smbd/filename.c b/source3/smbd/filename.c index 774ab27a74..0d5529b6b0 100644 --- a/source3/smbd/filename.c +++ b/source3/smbd/filename.c @@ -791,16 +791,14 @@ static bool fname_equal(const char *name1, const char *name2, static int get_real_filename_full_scan(connection_struct *conn, const char *path, const char *name, + bool mangled, TALLOC_CTX *mem_ctx, char **found_name) { struct smb_Dir *cur_dir; const char *dname; - bool mangled; char *unmangled_name = NULL; long curpos; - mangled = mangle_is_mangled(name, conn->params); - /* handle null paths */ if ((path == NULL) || (*path == 0)) { path = "."; @@ -897,6 +895,14 @@ int get_real_filename(connection_struct *conn, const char *path, char **found_name) { int ret; + bool mangled; + + mangled = mangle_is_mangled(name, conn->params); + + if (mangled) { + return get_real_filename_full_scan(conn, path, name, mangled, + mem_ctx, found_name); + } /* Try the vfs first to take advantage of case-insensitive stat. */ ret = SMB_VFS_GET_REAL_FILENAME(conn, path, name, mem_ctx, found_name); @@ -910,9 +916,8 @@ int get_real_filename(connection_struct *conn, const char *path, return ret; } - ret = get_real_filename_full_scan(conn, path, name, mem_ctx, - found_name); - return ret; + return get_real_filename_full_scan(conn, path, name, mangled, mem_ctx, + found_name); } static NTSTATUS build_stream_path(TALLOC_CTX *mem_ctx, -- cgit