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:
Olga Kornievskaia 2011-03-30 14:21:40 -04:00 committed by unknown
parent 6aab42a4b5
commit b9e369fac6
7 changed files with 20 additions and 15 deletions

View file

@ -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

View file

@ -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;

View file

@ -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;
} }

View file

@ -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");

View file

@ -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,

View file

@ -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;

View file

@ -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: