Windows: Adjust Last Write time handling for -1
[openafs.git] / src / WINNT / afsrdr / kernel / lib / Include / AFSDefines.h
1 /*
2  * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3  * Copyright (c) 2009, 2010, 2011, 2014 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_DEFINES_H
36 #define _AFS_DEFINES_H
37 //
38 // File: AFSDefines.h
39 //
40
41 //
42 // Conditional compiled code
43 //
44
45 //#define AFS_FLUSH_PAGES_SYNCHRONOUSLY       1       // Flush pages as we mark them dirty
46
47 //
48 // Debug information
49 //
50
51 #if DBG
52
53 //#define AFS_VALIDATE_EXTENTS            0
54
55 #define GEN_MD5 0
56
57 #else
58
59 #endif
60
61 //
62 // For 2K support
63 //
64
65 #ifndef FsRtlSetupAdvancedHeader
66
67 #define FSRTL_FLAG_ADVANCED_HEADER              (0x40)
68 #define FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS    (0x02)
69
70 #define FsRtlSetupAdvancedHeader( _advhdr, _fmutx )                         \
71 {                                                                           \
72     SetFlag( (_advhdr)->Flags, FSRTL_FLAG_ADVANCED_HEADER );                \
73     SetFlag( (_advhdr)->Flags2, FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS );     \
74     InitializeListHead( &(_advhdr)->FilterContexts );                       \
75     if ((_fmutx) != NULL) {                                                 \
76         (_advhdr)->FastMutex = (_fmutx);                                    \
77     }                                                                       \
78 }
79
80 #endif
81
82 typedef
83 NTSTATUS
84 (*PAFSRtlSetSaclSecurityDescriptor)( PSECURITY_DESCRIPTOR SecurityDescriptor,
85                                      BOOLEAN SaclPresent,
86                                      PACL Sacl,
87                                      BOOLEAN SaclDefaulted);
88
89 typedef
90 NTSTATUS
91 (*PAFSRtlSetGroupSecurityDescriptor)( IN PSECURITY_DESCRIPTOR  SecurityDescriptor,
92                                       IN PSID  Group  OPTIONAL,
93                                       IN BOOLEAN  GroupDefaulted);
94
95 //
96 // Worker thread count
97 //
98
99 #define AFS_WORKER_COUNT        16
100 #define AFS_IO_WORKER_COUNT     8
101
102 //
103 // Worker thread states
104 //
105
106 #define AFS_WORKER_INITIALIZED                  0x0001
107 #define AFS_WORKER_PROCESS_REQUESTS             0x0002
108
109 //
110 // Worker Thread codes
111 //
112
113 #define AFS_WORK_UNUSED_1                       0x0001
114 #define AFS_WORK_FLUSH_FCB                      0x0002
115 #define AFS_WORK_UNUSED_3                       0x0003
116 #define AFS_WORK_UNUSED_4                       0x0004
117 #define AFS_WORK_UNUSED_5                       0x0005
118 #define AFS_WORK_ENUMERATE_GLOBAL_ROOT          0x0006
119 #define AFS_WORK_INVALIDATE_OBJECT              0x0007
120 #define AFS_WORK_START_IOS                      0x0008
121 #define AFS_WORK_DEFERRED_WRITE                 0x0009
122
123 //
124 // Worker request flags
125 //
126
127 #define AFS_SYNCHRONOUS_REQUEST                 0x00000001
128
129 //
130 // Fcb flags
131 //
132
133 #define AFS_FCB_FLAG_FILE_MODIFIED                           0x00000001
134 #define AFS_FCB_FILE_CLOSED                                  0x00000002
135 #define AFS_FCB_FLAG_UPDATE_CHANGE_TIME                      0x00000008
136 #define AFS_FCB_FLAG_UPDATE_ACCESS_TIME                      0x00000010
137 #define AFS_FCB_FLAG_UPDATE_CREATE_TIME                      0x00000020
138 #define AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME                  0x00000040
139 #define AFS_FCB_FLAG_PURGE_ON_CLOSE                          0x00000080
140
141 //
142 // Object information flags
143 //
144
145 #define AFS_OBJECT_FLAGS_OBJECT_INVALID                 0x00000001
146 #define AFS_OBJECT_FLAGS_VERIFY                         0x00000002
147 #define AFS_OBJECT_FLAGS_NOT_EVALUATED                  0x00000004
148 #define AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED           0x00000008
149 #define AFS_OBJECT_FLAGS_DELETED                        0x00000010
150 #define AFS_OBJECT_INSERTED_HASH_TREE                   0x00000020
151 #define AFS_OBJECT_INSERTED_VOLUME_LIST                 0x00000040
152 #define AFS_OBJECT_HELD_IN_SERVICE                      0x00000080
153 #define AFS_OBJECT_ROOT_VOLUME                          0x00000100
154 #define AFS_OBJECT_FLAGS_VERIFY_DATA                    0x00000200
155 #define AFS_OBJECT_FLAGS_PARENT_FID                     0x00000400
156
157 //
158 // Object information reference count reasons
159 //
160
161 #define AFS_OBJECT_REFERENCE_DIRENTRY                   0
162 #define AFS_OBJECT_REFERENCE_CHILD                      1
163 #define AFS_OBJECT_REFERENCE_INVALIDATION               2
164 #define AFS_OBJECT_REFERENCE_GLOBAL                     3
165 #define AFS_OBJECT_REFERENCE_EXTENTS                    4
166 #define AFS_OBJECT_REFERENCE_WORKER                     5
167 #define AFS_OBJECT_REFERENCE_STATUS                     6
168 #define AFS_OBJECT_REFERENCE_FIND                       7
169 #define AFS_OBJECT_REFERENCE_FS_REQ                     8
170 #define AFS_OBJECT_REFERENCE_PIOCTL                     9
171 #define AFS_OBJECT_REFERENCE_MAX                       10
172
173 //
174 // Volume reference count reasons
175 //
176
177 #define AFS_VOLUME_REFERENCE_INVALID                    0
178 #define AFS_VOLUME_REFERENCE_EXTENTS                    1
179 #define AFS_VOLUME_REFERENCE_GLOBAL_ROOT                2
180 #define AFS_VOLUME_REFERENCE_INVALIDATE                 3
181 #define AFS_VOLUME_REFERENCE_FILE_ATTRS                 4
182 #define AFS_VOLUME_REFERENCE_EVAL_ROOT                  5
183 #define AFS_VOLUME_REFERENCE_GET_OBJECT                 6
184 #define AFS_VOLUME_REFERENCE_MOUNTPT                    7
185 #define AFS_VOLUME_REFERENCE_BUILD_ROOT                 8
186 #define AFS_VOLUME_REFERENCE_LOCATE_NAME                9
187 #define AFS_VOLUME_REFERENCE_PARSE_NAME                10
188 #define AFS_VOLUME_REFERENCE_MAX                       12
189
190 //
191 // Define one second in terms of 100 nS units
192 //
193
194 #define AFS_ONE_SECOND          10000000
195 #define AFS_ONE_MILLISECOND     10000
196 #define AFS_ONE_MICROSECOND     10
197
198 //
199 // Fcb lifetime in seconds
200 //
201
202 #define AFS_OBJECT_LIFETIME             20 * AFS_ONE_SECOND
203
204 #define AFS_EXTENT_REQUEST_TIME         10 * AFS_ONE_SECOND
205
206 //
207 // How big to make the runs
208 //
209 #define AFS_MAX_STACK_IO_RUNS              5
210
211 #ifndef FlagOn
212 #define FlagOn(_F,_SF)        ((_F) & (_SF))
213 #endif
214
215 #ifndef BooleanFlagOn
216 #define BooleanFlagOn(F,SF)   ((BOOLEAN)(((F) & (SF)) != 0))
217 #endif
218
219 #ifndef SetFlag
220 #define SetFlag(_F,_SF)       InterlockedOr(&(_F), (_SF))
221 #endif
222
223 #ifndef ClearFlag
224 #define ClearFlag(_F,_SF)     InterlockedAnd(&(_F), ~(_SF))
225 #endif
226
227 #define QuadAlign(Ptr) (                \
228     ((((ULONG)(Ptr)) + 7) & 0xfffffff8) \
229     )
230
231 #define CRC32_POLYNOMIAL     0xEDB88320L
232
233 #define AFS_SERVER_FLUSH_DELAY  (5LL * AFS_ONE_SECOND)
234 #define AFS_SERVER_PURGE_DELAY  (300LL * AFS_ONE_SECOND)
235 //
236 // PURGE_SLEEP is the number of PURGE_DELAYS we wait before we will unilaterally
237 // give back extents.
238 //
239 // If the Service asks us, we will start at PURGE_SLEEP of delays and then work back
240 //
241 #define AFS_SERVER_PURGE_SLEEP  6
242
243 #define AFS_DIR_ENUM_BUFFER_LEN   (16 * 1024)
244
245 //
246 // IS_BYTE_OFFSET_WRITE_TO_EOF
247 // liOffset - should be from Irp.StackLocation.Parameters.Write.ByteOffset
248 // this macro checks to see if the Offset Large_Integer points to the
249 // special constant value which denotes to start the write at EndOfFile
250 //
251 #define IS_BYTE_OFFSET_WRITE_TO_EOF(liOffset) \
252     (((liOffset).LowPart == FILE_WRITE_TO_END_OF_FILE) \
253       && ((liOffset).HighPart == 0xFFFFFFFF))
254
255 //
256 // Ccb Directory enum flags
257 //
258
259 #define CCB_FLAG_DIR_OF_DIRS_ONLY           0x00000001
260 #define CCB_FLAG_FULL_DIRECTORY_QUERY       0x00000002
261 #define CCB_FLAG_MASK_CONTAINS_WILD_CARDS   0x00000004
262 #define CCB_FLAG_FREE_FULL_PATHNAME         0x00000008
263 #define CCB_FLAG_RETURN_RELATIVE_ENTRIES    0x00000010
264 #define CCB_FLAG_DIRECTORY_QUERY_MAPPED     0x00000020
265 #define CCB_FLAG_MASK_PIOCTL_QUERY          0x00000040
266 #define CCB_FLAG_MASK_OPENED_REPARSE_POINT  0x00000080
267 #define CCB_FLAG_INSERTED_CCB_LIST          0x00000100
268 #define CCB_FLAG_DIRECTORY_QUERY_DIRECT_QUERY 0x00000200
269 #define CCB_FLAG_LAST_WRITE_TIME_SET        0x00000800
270
271 //
272 // DirEntry flags
273 //
274
275 #define AFS_DIR_RELEASE_NAME_BUFFER             0x00000001
276
277 #define AFS_DIR_ENTRY_CASE_INSENSTIVE_LIST_HEAD 0x00000004
278 #define AFS_DIR_ENTRY_NOT_IN_PARENT_TREE        0x00000008
279 #define AFS_DIR_ENTRY_INSERTED_ENUM_LIST        0x00000010
280 #define AFS_DIR_ENTRY_FAKE                      0x00000020
281 #define AFS_DIR_RELEASE_TARGET_NAME_BUFFER      0x00000040
282 #define AFS_DIR_ENTRY_VALID                     0x00000080
283 #define AFS_DIR_ENTRY_PENDING_DELETE            0x00000100
284 #define AFS_DIR_ENTRY_DELETED                   0x00000200
285 #define AFS_DIR_ENTRY_PIPE_SERVICE              0x00000400
286 #define AFS_DIR_ENTRY_IPC                       0x00000800
287 #define AFS_DIR_ENTRY_INSERTED_SHORT_NAME       0x00001000
288
289 //
290 // Network provider errors
291 //
292
293 #define WN_SUCCESS                              0L
294 #define WN_ALREADY_CONNECTED                    85L
295 #define WN_OUT_OF_MEMORY                        8L
296 #define WN_NOT_CONNECTED                        2250L
297 #define WN_BAD_NETNAME                          67L
298
299 #define RESOURCE_CONNECTED      0x00000001
300 #define RESOURCE_GLOBALNET      0x00000002
301 #define RESOURCE_REMEMBERED     0x00000003
302 #define RESOURCE_RECENT         0x00000004
303 #define RESOURCE_CONTEXT        0x00000005
304
305 #define RESOURCETYPE_ANY        0x00000000
306 #define RESOURCETYPE_DISK       0x00000001
307 #define RESOURCETYPE_PRINT      0x00000002
308 #define RESOURCETYPE_RESERVED   0x00000008
309 #define RESOURCETYPE_UNKNOWN    0xFFFFFFFF
310
311 #define RESOURCEUSAGE_CONNECTABLE   0x00000001
312 #define RESOURCEUSAGE_CONTAINER     0x00000002
313 #define RESOURCEUSAGE_NOLOCALDEVICE 0x00000004
314 #define RESOURCEUSAGE_SIBLING       0x00000008
315 #define RESOURCEUSAGE_ATTACHED      0x00000010
316 #define RESOURCEUSAGE_ALL           (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED)
317 #define RESOURCEUSAGE_RESERVED      0x80000000
318
319 #define RESOURCEDISPLAYTYPE_GENERIC        0x00000000
320 #define RESOURCEDISPLAYTYPE_DOMAIN         0x00000001
321 #define RESOURCEDISPLAYTYPE_SERVER         0x00000002
322 #define RESOURCEDISPLAYTYPE_SHARE          0x00000003
323 #define RESOURCEDISPLAYTYPE_FILE           0x00000004
324 #define RESOURCEDISPLAYTYPE_GROUP          0x00000005
325 #define RESOURCEDISPLAYTYPE_NETWORK        0x00000006
326 #define RESOURCEDISPLAYTYPE_ROOT           0x00000007
327 #define RESOURCEDISPLAYTYPE_SHAREADMIN     0x00000008
328 #define RESOURCEDISPLAYTYPE_DIRECTORY      0x00000009
329 #define RESOURCEDISPLAYTYPE_TREE           0x0000000A
330 #define RESOURCEDISPLAYTYPE_NDSCONTAINER   0x0000000B
331
332 //
333 // Method for determining the different control device open requests
334 //
335
336 #define AFS_CONTROL_INSTANCE            0x00000001
337 #define AFS_REDIRECTOR_INSTANCE         0x00000002
338
339 //
340 // Extent flags
341 //
342
343 #define AFS_EXTENT_DIRTY                0x00000001
344
345 //
346 // Extent skip list sizes
347 //
348 #define AFS_NUM_EXTENT_LISTS    3
349
350 //
351 // Extents skip lists
352 //
353 // We use constant sizes.
354 //
355 #define AFS_EXTENT_SIZE         (4*1024)
356 #define AFS_EXTENTS_LIST        0
357 //
358 // A max of 64 extents in ther first skip list
359 #define AFS_EXTENT_SKIP1_BITS   6
360
361 //
362 // Then 128 bits in the second skip list
363 #define AFS_EXTENT_SKIP2_BITS   7
364
365 //
366 // This means that the top list skips in steps of 2^25 (=12+6+7) which
367 // is 32 Mb.  It is to be expected that files which are massively
368 // larger that this will not be fully mapped.
369 //
370 #define AFS_EXTENT_SKIP1_SIZE (AFS_EXTENT_SIZE << AFS_EXTENT_SKIP1_BITS)
371 #define AFS_EXTENT_SKIP2_SIZE (AFS_EXTENT_SKIP1_SIZE << AFS_EXTENT_SKIP2_BITS)
372
373 #define AFS_EXTENTS_MASKS { (AFS_EXTENT_SIZE-1),       \
374                             (AFS_EXTENT_SKIP1_SIZE-1), \
375                             (AFS_EXTENT_SKIP2_SIZE-1) }
376
377 //
378 // Maximum count to release at a time
379 //
380
381 #define AFS_MAXIMUM_EXTENT_RELEASE_COUNT        100
382
383 #define AFS_DIRTY_CHUNK_THRESHOLD               64
384
385 // {41966169-3FD7-4392-AFE4-E6A9D0A92C72}  - generated using guidgen.exe
386 DEFINE_GUID (GUID_SD_AFS_REDIRECTOR_CONTROL_OBJECT,
387         0x41966169, 0x3fd7, 0x4392, 0xaf, 0xe4, 0xe6, 0xa9, 0xd0, 0xa9, 0x2c, 0x72);
388
389 //
390 // Debug log length
391 //
392
393 #define AFS_DBG_LOG_LENGTH              256
394
395 //
396 // Debug log flags
397 //
398
399 #define AFS_DBG_LOG_WRAPPED             0x00000001
400
401 //
402 // Connection flags
403 //
404
405 #define AFS_CONNECTION_FLAG_GLOBAL_SHARE        0x00000001
406
407 //
408 // Process CB flags
409 //
410
411 #define AFS_PROCESS_FLAG_IS_64BIT           0x00000001
412
413 //
414 // Maximum number of special share names
415 //
416
417 #define AFS_SPECIAL_SHARE_NAME_COUNT_MAX    10
418
419 //
420 // Name Array flags
421 //
422
423 #define AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT        0x00000001
424 #define AFS_NAME_ARRAY_FLAG_REDIRECTION_ELEMENT 0x00000002
425
426 //
427 // Maximum recursion depth
428 //
429
430 #define AFS_MAX_RECURSION_COUNT                 20
431
432 //
433 // LocateNameEntry flags
434 //
435
436 #define AFS_LOCATE_FLAGS_SUBSTITUTE_NAME        0x00000001
437 #define AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL      0x00000002
438 #define AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL      0x00000004
439 #define AFS_LOCATE_FLAGS_NO_DFS_LINK_EVAL       0x00000008
440
441 //
442 // Parse flags
443 //
444
445 #define AFS_PARSE_FLAG_FREE_FILE_BUFFER         0x00000001
446 #define AFS_PARSE_FLAG_ROOT_ACCESS              0x00000002
447
448 //
449 // Reparse tag information
450 //
451
452 //
453 //  Tag allocated to OpenAFS for DFS by Microsoft
454 //  GUID: EF21A155-5C92-4470-AB3B-370403D96369
455 //
456
457 #ifndef IO_REPARSE_TAG_OPENAFS_DFS
458 #define IO_REPARSE_TAG_OPENAFS_DFS              0x00000037L
459 #endif
460
461 #ifndef IO_REPARSE_TAG_SURROGATE
462 #define IO_REPARSE_TAG_SURROGATE                0x20000000L
463 #endif
464
465 //  {EF21A155-5C92-4470-AB3B-370403D96369}
466 DEFINE_GUID (GUID_AFS_REPARSE_GUID,
467         0xEF21A155, 0x5C92, 0x4470, 0xAB, 0x3B, 0x37, 0x04, 0x03, 0xD9, 0x63, 0x69);
468
469 //
470 // Enumeration constants
471 //
472
473 #define AFS_DIR_ENTRY_INITIAL_DIR_INDEX   (ULONG)-3
474 #define AFS_DIR_ENTRY_INITIAL_ROOT_INDEX  (ULONG)-1
475
476 #define AFS_DIR_ENTRY_PIOCTL_INDEX        (ULONG)-3
477 #define AFS_DIR_ENTRY_DOT_INDEX           (ULONG)-2
478 #define AFS_DIR_ENTRY_DOT_DOT_INDEX       (ULONG)-1
479
480 //
481 // Library state flags
482 //
483
484 #define AFS_REDIR_LIB_FLAGS_NONPERSISTENT_CACHE     0x00000001
485
486 #endif /* _AFS_DEFINES_H */