changing silly rename scheme
instead of appending a fh value when creating a silly rename name, we'll append a timestamp. using fh value was problematic because it was creating a filename longer than 64char long which is currently out max_filename_size.
This commit is contained in:
parent
61998b5968
commit
4d18cf9ce7
4 changed files with 16 additions and 17 deletions
|
|
@ -790,7 +790,7 @@ static int handle_close(nfs41_upcall *upcall)
|
||||||
|
|
||||||
if (args->renamed) {
|
if (args->renamed) {
|
||||||
dprintf(1, "removing a renamed file %s\n", name->name);
|
dprintf(1, "removing a renamed file %s\n", name->name);
|
||||||
create_silly_rename(&state->path, &state->file.fh, name);
|
create_silly_rename(&state->path, name);
|
||||||
status = do_nfs41_close(state);
|
status = do_nfs41_close(state);
|
||||||
if (status)
|
if (status)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
||||||
|
|
@ -209,7 +209,7 @@ static int handle_nfs41_rename(setattr_upcall_args *args)
|
||||||
path_fh_init(&dst_dir, &dst_path);
|
path_fh_init(&dst_dir, &dst_path);
|
||||||
fh_copy(&dst_dir.fh, &state->parent.fh);
|
fh_copy(&dst_dir.fh, &state->parent.fh);
|
||||||
|
|
||||||
create_silly_rename(&dst_path, &state->file.fh, &dst_name);
|
create_silly_rename(&dst_path, &dst_name);
|
||||||
dprintf(1, "silly rename: %s -> %s\n", src_name->name, dst_name.name);
|
dprintf(1, "silly rename: %s -> %s\n", src_name->name, dst_name.name);
|
||||||
|
|
||||||
/* break any delegations and truncate before silly rename */
|
/* break any delegations and truncate before silly rename */
|
||||||
|
|
|
||||||
|
|
@ -347,35 +347,35 @@ void path_fh_copy(
|
||||||
fh_copy(&dst->fh, &src->fh);
|
fh_copy(&dst->fh, &src->fh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* DWORD MAX_DWORD = 4294967295 -- max string for the timestamp */
|
||||||
int create_silly_rename(
|
int create_silly_rename(
|
||||||
IN nfs41_abs_path *path,
|
IN nfs41_abs_path *path,
|
||||||
IN const nfs41_fh *fh,
|
|
||||||
OUT nfs41_component *silly)
|
OUT nfs41_component *silly)
|
||||||
{
|
{
|
||||||
const char *end = path->path + NFS41_MAX_PATH_LEN;
|
const char *end = path->path + NFS41_MAX_PATH_LEN;
|
||||||
const unsigned short extra_len = 2 + 2*(unsigned short)fh->len;
|
char name[NFS41_MAX_COMPONENT_LEN+1], *tmp, stime[13];
|
||||||
char name[NFS41_MAX_COMPONENT_LEN+1];
|
|
||||||
char *tmp;
|
|
||||||
uint32_t i;
|
|
||||||
int status = NO_ERROR;
|
int status = NO_ERROR;
|
||||||
|
const DWORD ntime = GetTickCount();
|
||||||
|
|
||||||
if (path->len + extra_len >= NFS41_MAX_PATH_LEN) {
|
StringCchPrintf(stime, 13, "%u", ntime);
|
||||||
|
if (path->len + 13 >= NFS41_MAX_PATH_LEN) {
|
||||||
status = ERROR_BUFFER_OVERFLOW;
|
status = ERROR_BUFFER_OVERFLOW;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
last_component(path->path, path->path + path->len, silly);
|
last_component(path->path, path->path + path->len, silly);
|
||||||
|
if (silly->len + 13 > NFS41_MAX_COMPONENT_LEN) {
|
||||||
|
status = ERROR_BUFFER_OVERFLOW;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
StringCchCopyNA(name, NFS41_MAX_COMPONENT_LEN+1, silly->name, silly->len);
|
StringCchCopyNA(name, NFS41_MAX_COMPONENT_LEN+1, silly->name, silly->len);
|
||||||
|
|
||||||
tmp = (char*)silly->name;
|
tmp = (char*)silly->name;
|
||||||
StringCchPrintf(tmp, end - tmp, ".%s.", name);
|
StringCchPrintf(tmp, end - tmp, ".%s.%s", name, stime);
|
||||||
tmp += silly->len + 2;
|
|
||||||
|
|
||||||
for (i = 0; i < fh->len; i++, tmp += 2)
|
path->len = (unsigned short)strlen(path->path);
|
||||||
StringCchPrintf(tmp, end - tmp, "%02x", fh->fh[i]);
|
silly->len = (unsigned short)strlen(silly->name);
|
||||||
|
|
||||||
path->len = path->len + extra_len;
|
|
||||||
silly->len = silly->len + extra_len;
|
|
||||||
out:
|
out:
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
@ -153,7 +153,6 @@ static __inline void nfstime_abs(
|
||||||
|
|
||||||
int create_silly_rename(
|
int create_silly_rename(
|
||||||
IN nfs41_abs_path *path,
|
IN nfs41_abs_path *path,
|
||||||
IN const nfs41_fh *fh,
|
|
||||||
OUT nfs41_component *silly);
|
OUT nfs41_component *silly);
|
||||||
|
|
||||||
bool_t multi_addr_find(
|
bool_t multi_addr_find(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue