adding query for FileInternalInformation infoclass
this query asks for a file index which is unique identifier for a file which we can satisfy from file attribute called "fileid"
This commit is contained in:
parent
6aab42a4b5
commit
b9e369fac6
7 changed files with 20 additions and 15 deletions
|
|
@ -252,4 +252,7 @@ typedef struct _FILE_FS_FULL_SIZE_INFORMATION {
|
||||||
ULONG BytesPerSector;
|
ULONG BytesPerSector;
|
||||||
} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
|
} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
|
||||||
|
|
||||||
|
typedef struct _FILE_INTERNAL_INFORMATION {
|
||||||
|
LARGE_INTEGER IndexNumber;
|
||||||
|
} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -116,6 +116,9 @@ static int handle_getattr(nfs41_upcall *upcall)
|
||||||
args->tag_info.ReparseTag = info.type == NF4LNK ?
|
args->tag_info.ReparseTag = info.type == NF4LNK ?
|
||||||
IO_REPARSE_TAG_SYMLINK : 0;
|
IO_REPARSE_TAG_SYMLINK : 0;
|
||||||
break;
|
break;
|
||||||
|
case FileInternalInformation:
|
||||||
|
args->intr_info.IndexNumber.QuadPart = info.fileid;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
eprintf("unhandled file query class %d\n", args->query_class);
|
eprintf("unhandled file query class %d\n", args->query_class);
|
||||||
status = ERROR_INVALID_PARAMETER;
|
status = ERROR_INVALID_PARAMETER;
|
||||||
|
|
@ -153,6 +156,13 @@ static int marshall_getattr(unsigned char *buffer, uint32_t *length, nfs41_upcal
|
||||||
status = safe_write(&buffer, length, &args->tag_info, info_len);
|
status = safe_write(&buffer, length, &args->tag_info, info_len);
|
||||||
if (status) goto out;
|
if (status) goto out;
|
||||||
break;
|
break;
|
||||||
|
case FileInternalInformation:
|
||||||
|
info_len = sizeof(args->intr_info);
|
||||||
|
status = safe_write(&buffer, length, &info_len, sizeof(info_len));
|
||||||
|
if (status) goto out;
|
||||||
|
status = safe_write(&buffer, length, &args->intr_info, info_len);
|
||||||
|
if (status) goto out;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
eprintf("unknown file query class %d\n", args->query_class);
|
eprintf("unknown file query class %d\n", args->query_class);
|
||||||
status = 103;
|
status = 103;
|
||||||
|
|
|
||||||
|
|
@ -294,6 +294,7 @@ static void copy_attrs(
|
||||||
dst->type = src->type;
|
dst->type = src->type;
|
||||||
dst->numlinks = src->numlinks;
|
dst->numlinks = src->numlinks;
|
||||||
dst->mode = src->mode;
|
dst->mode = src->mode;
|
||||||
|
dst->fileid = src->fileid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -318,7 +318,7 @@ int nfs41_open(
|
||||||
info = &tmp_info;
|
info = &tmp_info;
|
||||||
|
|
||||||
init_getattr_request(&attr_request);
|
init_getattr_request(&attr_request);
|
||||||
attr_request.arr[0] |= FATTR4_WORD0_FSID | FATTR4_WORD0_FILEID;
|
attr_request.arr[0] |= FATTR4_WORD0_FSID;
|
||||||
|
|
||||||
compound_init(&compound, argops, resops, "open");
|
compound_init(&compound, argops, resops, "open");
|
||||||
|
|
||||||
|
|
@ -521,7 +521,6 @@ int nfs41_create(
|
||||||
nfs41_restorefh_res restorefh_res;
|
nfs41_restorefh_res restorefh_res;
|
||||||
|
|
||||||
init_getattr_request(&attr_request);
|
init_getattr_request(&attr_request);
|
||||||
attr_request.arr[0] |= FATTR4_WORD0_FILEID;
|
|
||||||
|
|
||||||
compound_init(&compound, argops, resops, "create");
|
compound_init(&compound, argops, resops, "create");
|
||||||
|
|
||||||
|
|
@ -1029,7 +1028,7 @@ void init_getattr_request(bitmap4 *attr_request)
|
||||||
{
|
{
|
||||||
attr_request->count = 2;
|
attr_request->count = 2;
|
||||||
attr_request->arr[0] = FATTR4_WORD0_TYPE |
|
attr_request->arr[0] = FATTR4_WORD0_TYPE |
|
||||||
FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE;
|
FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE | FATTR4_WORD0_FILEID;
|
||||||
attr_request->arr[1] = FATTR4_WORD1_NUMLINKS |
|
attr_request->arr[1] = FATTR4_WORD1_NUMLINKS |
|
||||||
FATTR4_WORD1_TIME_ACCESS | FATTR4_WORD1_TIME_CREATE |
|
FATTR4_WORD1_TIME_ACCESS | FATTR4_WORD1_TIME_CREATE |
|
||||||
FATTR4_WORD1_TIME_MODIFY | FATTR4_WORD1_MODE |
|
FATTR4_WORD1_TIME_MODIFY | FATTR4_WORD1_MODE |
|
||||||
|
|
@ -1338,9 +1337,8 @@ int nfs41_link(
|
||||||
|
|
||||||
ZeroMemory(&info, sizeof(info));
|
ZeroMemory(&info, sizeof(info));
|
||||||
init_getattr_request(&info[0].attrmask);
|
init_getattr_request(&info[0].attrmask);
|
||||||
info[0].attrmask.arr[0] |= FATTR4_WORD0_FILEID;
|
|
||||||
init_getattr_request(&info[1].attrmask);
|
init_getattr_request(&info[1].attrmask);
|
||||||
info[1].attrmask.arr[0] |= FATTR4_WORD0_FILEID | FATTR4_WORD0_FSID;
|
info[1].attrmask.arr[0] |= FATTR4_WORD0_FSID;
|
||||||
|
|
||||||
compound_init(&compound, argops, resops, "link");
|
compound_init(&compound, argops, resops, "link");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -146,7 +146,7 @@ static void readdir_copy_dir_info(
|
||||||
IN nfs41_readdir_entry *entry,
|
IN nfs41_readdir_entry *entry,
|
||||||
IN PFILE_DIR_INFO_UNION info)
|
IN PFILE_DIR_INFO_UNION info)
|
||||||
{
|
{
|
||||||
info->fdi.FileIndex = 0;
|
info->fdi.FileIndex = entry->attr_info.fileid;
|
||||||
nfs_time_to_file_time(&entry->attr_info.time_create,
|
nfs_time_to_file_time(&entry->attr_info.time_create,
|
||||||
&info->fdi.CreationTime);
|
&info->fdi.CreationTime);
|
||||||
nfs_time_to_file_time(&entry->attr_info.time_access,
|
nfs_time_to_file_time(&entry->attr_info.time_access,
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,7 @@ typedef struct __getattr_upcall_args {
|
||||||
FILE_BASIC_INFO basic_info;
|
FILE_BASIC_INFO basic_info;
|
||||||
FILE_STANDARD_INFO std_info;
|
FILE_STANDARD_INFO std_info;
|
||||||
FILE_ATTRIBUTE_TAG_INFO tag_info;
|
FILE_ATTRIBUTE_TAG_INFO tag_info;
|
||||||
|
FILE_INTERNAL_INFORMATION intr_info;
|
||||||
nfs41_root *root;
|
nfs41_root *root;
|
||||||
nfs41_open_state *state;
|
nfs41_open_state *state;
|
||||||
int query_class;
|
int query_class;
|
||||||
|
|
|
||||||
|
|
@ -3881,15 +3881,6 @@ NTSTATUS nfs41_QueryFileInformation (
|
||||||
|
|
||||||
DbgEn();
|
DbgEn();
|
||||||
switch (InfoClass) {
|
switch (InfoClass) {
|
||||||
case FileInternalInformation:
|
|
||||||
{
|
|
||||||
PFILE_INTERNAL_INFORMATION info =
|
|
||||||
(PFILE_INTERNAL_INFORMATION)RxContext->Info.Buffer;
|
|
||||||
info->IndexNumber.QuadPart = 0;
|
|
||||||
RxContext->Info.LengthRemaining -= sizeof(FILE_INTERNAL_INFORMATION);
|
|
||||||
status = STATUS_SUCCESS;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
case FileEaInformation:
|
case FileEaInformation:
|
||||||
{
|
{
|
||||||
PFILE_EA_INFORMATION info =
|
PFILE_EA_INFORMATION info =
|
||||||
|
|
@ -3922,6 +3913,7 @@ NTSTATUS nfs41_QueryFileInformation (
|
||||||
case FileBasicInformation:
|
case FileBasicInformation:
|
||||||
case FileStandardInformation:
|
case FileStandardInformation:
|
||||||
#endif
|
#endif
|
||||||
|
case FileInternalInformation:
|
||||||
case FileAttributeTagInformation:
|
case FileAttributeTagInformation:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue