1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-13 13:18:06 +03:00

r3227: added a per-share option "case insensitive filesystem", that tells the

backend that the underlying filesystem is case insensitive, so it can
bypass the directory search if the name is not found.
This commit is contained in:
Andrew Tridgell 2004-10-26 00:59:06 +00:00 committed by Gerald (Jerry) Carter
parent b2bdde6d14
commit d84ade90ce
5 changed files with 36 additions and 10 deletions

View File

@ -125,6 +125,18 @@ static NTSTATUS pvfs_case_search(struct pvfs_state *pvfs, struct pvfs_filename *
}
continue;
}
/* the filesystem might be case insensitive, in which
case a search is pointless unless the name is
mangled */
if ((pvfs->flags & PVFS_FLAG_CI_FILESYSTEM) &&
!pvfs_is_mangled_component(pvfs, components[i])) {
if (i < num_components-1) {
return NT_STATUS_OBJECT_PATH_NOT_FOUND;
}
partial_name = test_name;
continue;
}
dir = opendir(partial_name);
if (!dir) {
@ -319,12 +331,6 @@ NTSTATUS pvfs_resolve_name(struct pvfs_state *pvfs, TALLOC_CTX *mem_ctx,
return pvfs_fill_dos_info(pvfs, *name);
}
/* the filesystem might be case insensitive, in which
case a search is pointless */
if (pvfs->flags & PVFS_FLAG_CI_FILESYSTEM) {
return NT_STATUS_OK;
}
/* search for a matching filename */
status = pvfs_case_search(pvfs, *name);

View File

@ -237,7 +237,7 @@ static BOOL is_mangled(struct pvfs_mangle_context *ctx, const char *name)
}
/* and the last part ... */
return is_mangled_component(ctx, s,strlen(s));
return is_mangled_component(ctx, s, strlen(s));
}
@ -301,7 +301,8 @@ static BOOL is_8_3(struct pvfs_mangle_context *ctx,
/* the length are all OK. Now check to see if the characters themselves are OK */
for (i=0; name[i]; i++) {
/* note that we may allow wildcard petterns! */
if (!FLAG_CHECK(name[i], FLAG_ASCII|(allow_wildcards ? FLAG_WILDCARD : 0)) && name[i] != '.') {
if (!FLAG_CHECK(name[i], FLAG_ASCII|(allow_wildcards ? FLAG_WILDCARD : 0)) &&
name[i] != '.') {
return False;
}
}
@ -686,3 +687,13 @@ BOOL pvfs_is_reserved_name(struct pvfs_state *pvfs, const char *name)
{
return is_reserved_name(pvfs->mangle_ctx, name);
}
/*
see if a component of a filename could be a mangled name from our
mangling code
*/
BOOL pvfs_is_mangled_component(struct pvfs_state *pvfs, const char *name)
{
return is_mangled_component(pvfs->mangle_ctx, name, strlen(name));
}

View File

@ -41,6 +41,7 @@ static void pvfs_setup_options(struct pvfs_state *pvfs)
if (lp_readonly(snum)) pvfs->flags |= PVFS_FLAG_READONLY;
if (lp_strict_sync(snum)) pvfs->flags |= PVFS_FLAG_STRICT_SYNC;
if (lp_strict_locking(snum)) pvfs->flags |= PVFS_FLAG_STRICT_LOCKING;
if (lp_ci_filesystem(snum)) pvfs->flags |= PVFS_FLAG_CI_FILESYSTEM;
pvfs->share_name = talloc_strdup(pvfs, lp_servicename(snum));
}

View File

@ -94,8 +94,7 @@ struct pvfs_search_state {
struct pvfs_dir *dir;
};
/* open file state - this is a temporary implementation
to allow some tests to work */
/* open file state */
struct pvfs_file {
struct pvfs_file *next, *prev;
int fd;

View File

@ -272,6 +272,7 @@ typedef struct
BOOL bMSDfsRoot;
BOOL bShareModes;
BOOL bStrictSync;
BOOL bCIFileSystem;
struct param_opt *param_opt;
char dummy[3]; /* for alignment */
@ -330,6 +331,7 @@ static service sDefault = {
False, /* bMSDfsRoot */
True, /* bShareModes */
False, /* bStrictSync */
False, /* bCIFileSystem */
NULL, /* Parametric options */
"" /* dummy */
@ -623,6 +625,7 @@ static struct parm_struct parm_table[] = {
{"name cache timeout", P_INTEGER, P_GLOBAL, &Globals.name_cache_timeout, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"strict sync", P_BOOL, P_LOCAL, &sDefault.bStrictSync, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
{"case insensitive filesystem", P_BOOL, P_LOCAL, &sDefault.bCIFileSystem, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE},
{"Printing Options", P_SEP, P_SEPARATOR},
@ -1253,6 +1256,7 @@ FN_LOCAL_BOOL(lp_locking, bLocking)
FN_LOCAL_BOOL(lp_strict_locking, bStrictLocking)
FN_LOCAL_BOOL(lp_posix_locking, bPosixLocking)
FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
FN_LOCAL_BOOL(lp_ci_filesystem, bCIFileSystem)
FN_LOCAL_BOOL(lp_share_modes, bShareModes)
FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)
@ -2444,6 +2448,11 @@ BOOL lp_set_cmdline(const char *pszParmName, const char *pszParmValue)
return lp_do_parameter_parametric(-1, pszParmName, pszParmValue, FLAG_CMDLINE);
}
if (parmnum < 0) {
DEBUG(0,("Unknown option '%s'\n", pszParmName));
return False;
}
/* reset the CMDLINE flag in case this has been called before */
parm_table[parmnum].flags &= ~FLAG_CMDLINE;