Windows: Add CCB NonPaged Resource for synchronization
[openafs.git] / src / WINNT / afsrdr / kernel / lib / Include / AFSStructs.h
1 /*
2  * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3  * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * - Redistributions of source code must retain the above copyright notice,
11  *   this list of conditions and the following disclaimer.
12  * - Redistributions in binary form must reproduce the above copyright
13  *   notice,
14  *   this list of conditions and the following disclaimer in the
15  *   documentation
16  *   and/or other materials provided with the distribution.
17  * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
18  *   nor the names of their contributors may be used to endorse or promote
19  *   products derived from this software without specific prior written
20  *   permission from Kernel Drivers, LLC and Your File System, Inc.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
26  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34
35 #ifndef _AFS_STRUCTS_H
36 #define _AFS_STRUCTS_H
37
38 //
39 // File: AFSStructs.h
40 //
41
42 typedef struct _AFS_DIR_HDR
43 {
44
45     struct _AFS_DIRECTORY_CB *CaseSensitiveTreeHead;
46
47     struct _AFS_DIRECTORY_CB *CaseInsensitiveTreeHead;
48
49     ERESOURCE               *TreeLock;
50
51     LONG                     ContentIndex;
52
53 } AFSDirHdr;
54
55 //
56 // Worker pool header
57 //
58
59 typedef struct _AFS_WORKER_QUEUE_HDR
60 {
61
62     struct _AFS_WORKER_QUEUE_HDR    *fLink;
63
64     KEVENT           WorkerThreadReady;
65
66     void            *WorkerThreadObject;
67
68     ULONG            State;
69
70 } AFSWorkQueueContext, *PAFSWorkQueueContext;
71
72 //
73 // These are the context control blocks for the open instance
74 //
75
76 typedef struct _AFS_NONPAGED_CCB
77 {
78
79     ERESOURCE           CcbLock;
80
81 } AFSNonPagedCcb;
82
83
84 typedef struct _AFS_CCB
85 {
86
87     USHORT        Size;
88
89     USHORT        Type;
90
91     ULONG         Flags;
92
93     AFSNonPagedCcb  *NPCcb;
94
95     AFSListEntry  ListEntry;
96
97     //
98     // Directory enumeration informaiton
99     //
100
101     UNICODE_STRING MaskName;
102
103     struct _AFS_DIRECTORY_SS_HDR    *DirectorySnapshot;
104
105     ULONG          CurrentDirIndex;
106
107     //
108     // PIOCtl and share interface request id
109     //
110
111     ULONG          RequestID;
112
113     //
114     // Full path of how the instance was opened
115     //
116
117     UNICODE_STRING FullFileName;
118
119     //
120     // Name array for this open
121     //
122
123     struct _AFS_NAME_ARRAY_HEADER  *NameArray;
124
125     //
126     // Pointer to this entries meta data
127     //
128
129     struct _AFS_DIRECTORY_CB  *DirectoryCB;
130
131     //
132     // Notification name
133     //
134
135     UNICODE_STRING          NotifyMask;
136
137     ACCESS_MASK             GrantedAccess;
138
139     //
140     // File unwind info
141     //
142
143     struct
144     {
145
146         ULONG           FileAttributes;
147
148         LARGE_INTEGER   CreationTime;
149
150         LARGE_INTEGER   LastAccessTime;
151
152         LARGE_INTEGER   LastWriteTime;
153
154         LARGE_INTEGER   ChangeTime;
155
156     } FileUnwindInfo;
157
158     //
159     // Granted File Access
160     //
161
162     ULONG               FileAccess;
163
164     //
165     // Authentication group GUID
166     //
167
168     GUID                AuthGroup;
169
170 } AFSCcb;
171
172 //
173 // Object information block
174 //
175
176 typedef struct _AFS_NONPAGED_OBJECT_INFO_CB
177 {
178
179     ERESOURCE           DirectoryNodeHdrLock;
180
181 } AFSNonPagedObjectInfoCB;
182
183 typedef struct _AFS_OBJECT_INFORMATION_CB
184 {
185
186     AFSBTreeEntry             TreeEntry;
187
188     AFSListEntry              ListEntry;
189
190     ULONG                     Flags;
191
192     LONG                      ObjectReferenceCount;
193
194     AFSNonPagedObjectInfoCB  *NonPagedInfo;
195
196     //
197     // The VolumeCB where this entry resides
198     //
199
200     struct _AFS_VOLUME_CB    *VolumeCB;
201
202     //
203     // Parent object information
204     //
205
206     struct _AFS_OBJECT_INFORMATION_CB   *ParentObjectInformation;
207
208     //
209     // Pointer to the current Fcb, if available
210     //
211
212     AFSFcb                   *Fcb;
213
214     //
215     // Last access time.
216     //
217
218     LARGE_INTEGER           LastAccessCount;
219
220     //
221     // Per file metadata information
222     //
223
224     AFSFileID               FileId;
225
226     AFSFileID               TargetFileId;
227
228     LARGE_INTEGER           Expiration;         /* FILETIME */
229
230     LARGE_INTEGER           DataVersion;
231
232     ULONG                   FileType;           /* File, Dir, MountPoint, Symlink */
233
234     LARGE_INTEGER           CreationTime;       /* FILETIME */
235
236     LARGE_INTEGER           LastAccessTime;     /* FILETIME */
237
238     LARGE_INTEGER           LastWriteTime;      /* FILETIME */
239
240     LARGE_INTEGER           ChangeTime;         /* FILETIME */
241
242     ULONG                   FileAttributes;     /* NTFS FILE_ATTRIBUTE_xxxx see below */
243
244     LARGE_INTEGER           EndOfFile;
245
246     LARGE_INTEGER           AllocationSize;
247
248     ULONG                   EaSize;
249
250     ULONG                   Links;
251
252     //
253     // Directory and file specific information
254     //
255
256         union
257         {
258
259                 struct
260                 {
261
262                         //
263                         // The directory search and listing information for the node
264                         //
265
266                         AFSDirHdr                  DirectoryNodeHdr;
267
268                         struct _AFS_DIRECTORY_CB  *DirectoryNodeListHead;
269
270                         struct _AFS_DIRECTORY_CB  *DirectoryNodeListTail;
271
272             LONG                       DirectoryNodeCount;
273
274                         struct _AFS_DIRECTORY_CB  *ShortNameTree;
275
276             //
277             // PIOCtl directory cb entry
278             //
279
280             struct _AFS_DIRECTORY_CB  *PIOCtlDirectoryCB;
281
282             //
283             // Open handle and reference count for this object
284             //
285
286             LONG                       ChildOpenHandleCount;
287
288             LONG                       ChildOpenReferenceCount;
289
290             //
291             // Index for the PIOCtl and share open count
292             //
293
294             LONG                OpenRequestIndex;
295
296                 } Directory;
297
298                 struct
299                 {
300
301             ULONG       Reserved;
302
303                 } File;
304
305         } Specific;
306
307 } AFSObjectInfoCB;
308
309 //
310 // Volume control block structure
311 //
312
313 typedef struct _AFS_NON_PAGED_VOLUME_CB
314 {
315
316     ERESOURCE           VolumeLock;
317
318     ERESOURCE           ObjectInfoTreeLock;
319
320     ERESOURCE           DirectoryNodeHdrLock;
321
322 }AFSNonPagedVolumeCB;
323
324 typedef struct _AFS_VOLUME_CB
325 {
326
327     //
328     // Our tree entry.
329     //
330
331     AFSBTreeEntry             TreeEntry;
332
333     //
334     // This is the linked list of nodes processed asynchronously by the respective worker thread
335     //
336
337     AFSListEntry              ListEntry;
338
339     ULONG                     Flags;
340
341     AFSNonPagedVolumeCB      *NonPagedVcb;
342
343     ERESOURCE                *VolumeLock;
344
345     //
346     // Reference count on the object
347     //
348
349     LONG                      VolumeReferenceCount;
350
351     //
352     // Object information tree
353     //
354
355     AFSTreeHdr                ObjectInfoTree;
356
357     AFSObjectInfoCB          *ObjectInfoListHead;
358
359     AFSObjectInfoCB          *ObjectInfoListTail;
360
361     //
362     // Object information for the volume
363     //
364
365     AFSObjectInfoCB           ObjectInformation;
366
367     //
368     // Root directory cb for this volume
369     //
370
371     struct _AFS_DIRECTORY_CB *DirectoryCB;
372
373     //
374     // The Fcb for this volume
375     //
376
377     AFSFcb                   *RootFcb;
378
379     //
380     // Volume worker thread
381     //
382
383     AFSWorkQueueContext       VolumeWorkerContext;
384
385     //
386     // Volume information
387     //
388
389     AFSVolumeInfoCB           VolumeInformation;
390
391 } AFSVolumeCB;
392
393 typedef struct _AFS_NAME_INFORMATION_CB
394 {
395
396     CCHAR           ShortNameLength;
397
398     WCHAR           ShortName[12];
399
400     UNICODE_STRING  FileName;
401
402     UNICODE_STRING  TargetName;
403
404 } AFSNameInfoCB;
405
406 typedef struct _AFS_NON_PAGED_DIRECTORY_CB
407 {
408
409     ERESOURCE       Lock;
410
411 } AFSNonPagedDirectoryCB;
412
413 typedef struct _AFS_DIRECTORY_CB
414 {
415
416     AFSBTreeEntry    CaseSensitiveTreeEntry;    // For entries in the NameEntry tree, the
417                                                 // Index is a CRC on the name. For Volume,
418                                                 // MP and SL nodes, the Index is the Cell, Volume
419                                                 // For all others it is the vnode, uniqueid
420
421     AFSBTreeEntry    CaseInsensitiveTreeEntry;
422
423     AFSListEntry     CaseInsensitiveList;
424
425     ULONG            Flags;
426
427     //
428     // Current open reference count on the directory entry. This count is used
429     // for tear down
430     //
431
432     LONG             OpenReferenceCount;
433
434     //
435     // File index used in directory enumerations
436     //
437
438     ULONG            FileIndex;
439
440     //
441     // Name information for this entry
442     //
443
444     AFSNameInfoCB    NameInformation;
445
446     //
447     // List entry for the directory enumeration list in a parent node
448     //
449
450     AFSListEntry     ListEntry;
451
452     //
453     // Back pointer to the ObjectInfo block for this entry
454     //
455
456     AFSObjectInfoCB *ObjectInformation;
457
458     //
459     // Non paged pointer
460     //
461
462     AFSNonPagedDirectoryCB  *NonPaged;
463
464     //
465     // Type specific information
466     //
467
468     union
469     {
470
471         struct
472         {
473
474             AFSBTreeEntry    ShortNameTreeEntry;
475
476         } Data;
477
478         struct
479         {
480
481             ULONG           Reserved;
482
483         } MountPoint;
484
485         struct
486         {
487
488             ULONG           Reserved;
489
490         } SymLink;
491
492     } Type;
493
494 } AFSDirectoryCB;
495
496 // Read and writes can fan out and so they are syncrhonized via one of
497 // these structures
498 //
499
500 typedef struct _AFS_GATHER_READWRITE
501 {
502     KEVENT     Event;
503
504     LONG       Count;
505
506     NTSTATUS   Status;
507
508     PIRP       MasterIrp;
509
510     BOOLEAN    Synchronous;
511
512     BOOLEAN    CompleteMasterIrp;
513
514     AFSFcb    *Fcb;
515
516 } AFSGatherIo;
517
518 typedef struct _AFS_IO_RUNS {
519
520     LARGE_INTEGER CacheOffset;
521     PIRP          ChildIrp;
522     ULONG         ByteCount;
523 } AFSIoRun;
524
525 //
526 // Name array element and header
527 //
528
529 typedef struct _AFS_NAME_ARRAY_ELEMENT
530 {
531
532     UNICODE_STRING      Component;
533
534     AFSFileID           FileId;
535
536     AFSDirectoryCB     *DirectoryCB;
537
538     ULONG               Flags;
539
540 } AFSNameArrayCB;
541
542 typedef struct _AFS_NAME_ARRAY_HEADER
543 {
544
545     AFSNameArrayCB      *CurrentEntry;
546
547     LONG                 Count;
548
549     LONG                 LinkCount;
550
551     ULONG                Flags;
552
553     ULONG                MaxElementCount;
554
555     AFSNameArrayCB       ElementArray[ 1];
556
557 } AFSNameArrayHdr;
558
559 typedef struct _AFS_FILE_INFO_CB
560 {
561
562     ULONG           FileAttributes;
563
564     LARGE_INTEGER   AllocationSize;
565
566     LARGE_INTEGER   EndOfFile;
567
568     LARGE_INTEGER   CreationTime;
569
570     LARGE_INTEGER   LastAccessTime;
571
572     LARGE_INTEGER   LastWriteTime;
573
574     LARGE_INTEGER   ChangeTime;
575
576 } AFSFileInfoCB;
577
578 //
579 // Work item
580 //
581
582 typedef struct _AFS_WORK_ITEM
583 {
584
585     struct _AFS_WORK_ITEM *next;
586
587     ULONG    RequestType;
588
589     ULONG    RequestFlags;
590
591     NTSTATUS Status;
592
593     KEVENT   Event;
594
595     ULONG    Size;
596
597     ULONGLONG   ProcessID;
598
599     GUID     AuthGroup;
600
601     union
602     {
603         struct
604         {
605             PIRP Irp;
606
607         } ReleaseExtents;
608
609         struct
610         {
611             AFSFcb *Fcb;
612
613             AFSFcb **TargetFcb;
614
615             AFSFileInfoCB   FileInfo;
616
617             struct _AFS_NAME_ARRAY_HEADER *NameArray;
618
619         } Fcb;
620
621         struct
622         {
623             PIRP Irp;
624
625             PDEVICE_OBJECT Device;
626
627             HANDLE CallingProcess;
628
629         } AsynchIo;
630
631         struct
632         {
633
634             UCHAR FunctionCode;
635
636             ULONG RequestFlags;
637
638             struct _AFS_IO_RUNS    *IoRuns;
639
640             ULONG RunCount;
641
642             struct _AFS_GATHER_READWRITE *GatherIo;
643
644             FILE_OBJECT *CacheFileObject;
645
646         } CacheAccess;
647
648         struct
649         {
650
651             AFSObjectInfoCB *ObjectInfo;
652
653             ULONG            InvalidateReason;
654
655         } Invalidate;
656
657         struct
658         {
659             char     Context[ 1];
660
661         } Other;
662
663     } Specific;
664
665 } AFSWorkItem, *PAFSWorkItem;
666
667 //
668 // Directory snapshot structures
669 //
670
671 typedef struct _AFS_DIRECTORY_SS_ENTRY
672 {
673
674     ULONG       NameHash;
675
676 } AFSSnapshotEntry;
677
678 typedef struct _AFS_DIRECTORY_SS_HDR
679 {
680
681     ULONG       EntryCount;
682
683     AFSSnapshotEntry    *TopEntry;
684
685 } AFSSnapshotHdr;
686
687 typedef struct _AFS_BYTE_RANGE
688 {
689
690     LARGE_INTEGER       FileOffset;
691
692     LARGE_INTEGER       Length;
693
694 } AFSByteRange;
695
696 #endif /* _AFS_STRUCTS_H */