windows-invalidate-file-locks-vnovnode-20080217
[openafs.git] / src / WINNT / afsd / cm_vnodeops.h
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #ifndef __CM_VNODEOPS_H_ENV__
11 #define __CM_VNODEOPS_H_ENV__ 1
12
13 extern unsigned int cm_mountRootGen;
14
15 extern int cm_enableServerLocks;
16
17 extern int cm_followBackupPath;
18
19 /* parms for attribute setting call */
20 typedef struct cm_attr {
21         int mask;
22         time_t clientModTime;
23         osi_hyper_t length;
24         int unixModeBits;
25         long owner;
26         long group;
27 } cm_attr_t;
28
29 #define CM_ATTRMASK_CLIENTMODTIME       1       /* set if field is valid */
30 #define CM_ATTRMASK_LENGTH              2       /* field is valid */
31 #define CM_ATTRMASK_UNIXMODEBITS        4       /* field is valid */
32 #define CM_ATTRMASK_OWNER               8       /* field is valid */
33 #define CM_ATTRMASK_GROUP               0x10    /* field is valid */
34
35 /* type of rock for lookup's searches */
36 typedef struct cm_lookupSearch {
37         cm_fid_t fid;
38         char *searchNamep;
39         int found;
40         int LCfound, UCfound, NCfound, ExactFound;
41         int caseFold;
42         int hasTilde;
43 } cm_lookupSearch_t;
44
45 #include "cm_dir.h"
46
47 typedef int (*cm_DirFuncp_t)(struct cm_scache *, struct cm_dirEntry *, void *,
48         osi_hyper_t *entryOffsetp);
49
50 /* Special path syntax for direct references to volumes
51
52    The syntax: @vol:<cellname>{%,#}<volume> can be used to refer to a
53    specific volume in a specific cell, where:
54
55    <cellname> : name of the cell
56    <volume>   : volume name or ID
57  */
58 #define CM_PREFIX_VOL "@vol:"
59 #define CM_PREFIX_VOL_CCH 5
60
61 /* arrays */
62
63 extern unsigned char cm_foldUpper[];
64
65 /* functions */
66
67 extern int cm_NoneLower(char *s);
68
69 extern int cm_NoneUpper(char *s);
70
71 extern int cm_Is8Dot3(char *namep);
72
73 extern int cm_stricmp(const char *, const char *);
74
75 extern void cm_Gen8Dot3Name(struct cm_dirEntry *dep, char *shortName,
76         char **shortNameEndp);
77
78 #define cm_Gen8Dot3Name(dep,shortName,shortNameEndp) \
79 cm_Gen8Dot3NameInt((dep)->name, &(dep)->fid, shortName, shortNameEndp)
80
81 extern void cm_Gen8Dot3NameInt(const char * longname, cm_dirFid_t * pfid,
82                                char *shortName, char **shortNameEndp);
83
84 extern long cm_ReadMountPoint(cm_scache_t *scp, cm_user_t *userp,
85                               cm_req_t *reqp);
86
87 extern long cm_EvaluateVolumeReference(char * namep, long flags, cm_user_t * userp,
88                                        cm_req_t *reqp, cm_scache_t ** outpScpp);
89
90 #ifdef DEBUG_REFCOUNT
91 extern long cm_NameIDbg(cm_scache_t *rootSCachep, char *pathp, long flags,
92         cm_user_t *userp, char *tidPathp, cm_req_t *reqp,
93         cm_scache_t **outScpp, char *, long);
94
95 extern long cm_LookupDbg(cm_scache_t *dscp, char *namep, long flags,
96         cm_user_t *userp, cm_req_t *reqp, cm_scache_t **outpScpp, char *, long);
97
98 #define cm_Lookup(a,b,c,d,e,f)  cm_LookupDbg(a,b,c,d,e,f,__FILE__,__LINE__)
99 #define cm_NameI(a,b,c,d,e,f,g) cm_NameIDbg(a,b,c,d,e,f,g,__FILE__,__LINE__)
100 #else
101 extern long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags,
102         cm_user_t *userp, char *tidPathp, cm_req_t *reqp,
103         cm_scache_t **outScpp);
104 extern long cm_Lookup(cm_scache_t *dscp, char *namep, long flags,
105         cm_user_t *userp, cm_req_t *reqp, cm_scache_t **outpScpp);
106 #endif
107
108 extern long cm_LookupInternal(cm_scache_t *dscp, char *namep, long flags,
109                               cm_user_t *userp, cm_req_t *reqp, 
110                               cm_scache_t **outpScpp);
111
112 extern afs_int32 cm_TryBulkStat(cm_scache_t *dscp, osi_hyper_t *offsetp,
113         cm_user_t *userp, cm_req_t *reqp);
114
115 extern long cm_SetAttr(cm_scache_t *scp, cm_attr_t *attrp, cm_user_t *userp,
116         cm_req_t *reqp);
117
118 extern long cm_Create(cm_scache_t *scp, char *namep, long flags,
119         cm_attr_t *attrp, cm_scache_t **scpp, cm_user_t *userp, cm_req_t *reqp);
120
121 extern long cm_FSync(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp);
122
123 extern void cm_StatusFromAttr(struct AFSStoreStatus *statusp,
124         struct cm_scache *scp, struct cm_attr *attrp);
125
126 extern long cm_Unlink(cm_scache_t *dscp, char *namep, cm_user_t *userp,
127         cm_req_t *reqp);
128
129 extern long cm_ApplyDir(cm_scache_t *scp, cm_DirFuncp_t funcp, void *parmp,
130         osi_hyper_t *startOffsetp, cm_user_t *userp, cm_req_t *reqp, 
131         cm_scache_t **retscp);
132
133 extern long cm_MakeDir(cm_scache_t *dscp, char *lastNamep, long flags,
134         cm_attr_t *attrp, cm_user_t *userp, cm_req_t *reqp);
135
136 extern long cm_RemoveDir(cm_scache_t *dscp, char *lastNamep, cm_user_t *userp,
137         cm_req_t *reqp);
138
139 extern long cm_Rename(cm_scache_t *oldDscp, char *oldLastNamep,
140         cm_scache_t *newDscp, char *newLastNamep, cm_user_t *userp,
141         cm_req_t *reqp);
142
143 extern long cm_HandleLink(cm_scache_t *linkScp, struct cm_user *userp,
144         cm_req_t *reqp);
145
146 extern long cm_Link(cm_scache_t *dscp, char *namep, cm_scache_t *sscp,
147     long flags, cm_user_t *userp, cm_req_t *reqp);
148
149 extern long cm_SymLink(cm_scache_t *dscp, char *namep, char *contentsp,
150         long flags, cm_attr_t *attrp, cm_user_t *userp, cm_req_t *reqp);
151
152 extern long cm_AssembleLink(cm_scache_t *linkScp, char *pathSuffixp,
153                             cm_scache_t **newRootScpp, cm_space_t **newSpaceBufferp,
154                             cm_user_t *userp, cm_req_t *reqp);
155
156 extern int cm_ExpandSysName(char *inp, char *outp, long outSize,
157                             unsigned int sysNameIndex);
158
159 extern long cm_Open(cm_scache_t *scp, int type, cm_user_t *userp);
160
161 extern long cm_CheckOpen(cm_scache_t *scp, int openMode, int trunc,
162         cm_user_t *userp, cm_req_t *reqp);
163
164 /*
165  * Combinations of file opening access bits for AFS.
166  * We don't insist on write rights to open the file with FILE_WRITE_ATTRIBUTES,
167  * because we want to enable the owner to set/clear the READONLY flag.
168  * The RPC will fail if you can't modify the attributes, anyway.
169  */
170 #define AFS_ACCESS_READ (FILE_GENERIC_READ & ~SYNCHRONIZE)
171 #define AFS_ACCESS_WRITE ((FILE_GENERIC_WRITE & ~(READ_CONTROL | SYNCHRONIZE)) \
172                                 & ~FILE_WRITE_ATTRIBUTES)
173
174 typedef struct cm_lock_data {
175     cm_key_t key;
176     unsigned int sLockType;
177     LARGE_INTEGER LOffset, LLength;
178 } cm_lock_data_t;
179
180 extern long cm_CheckNTOpen(cm_scache_t *scp, unsigned int desiredAccess,
181         unsigned int createDisp, cm_user_t *userp, cm_req_t *reqp, cm_lock_data_t ** ldpp);
182
183 extern long cm_CheckNTOpenDone(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp, 
184                                cm_lock_data_t ** ldpp);
185
186 extern long cm_CheckNTDelete(cm_scache_t *dscp, cm_scache_t *scp,
187         cm_user_t *userp, cm_req_t *reqp);
188
189 extern long cm_EvaluateSymLink(cm_scache_t *dscp, cm_scache_t *linkScp,
190         cm_scache_t **outScpp, cm_user_t *userp, cm_req_t *reqp);
191
192 extern long cm_FollowMountPoint(cm_scache_t *scp, cm_scache_t *dscp, cm_user_t *userp,
193                                 cm_req_t *reqp, cm_scache_t **outScpp);
194
195
196 extern long cm_Lock(cm_scache_t *scp, unsigned char sLockType,
197         LARGE_INTEGER LOffset, LARGE_INTEGER LLength, cm_key_t key,
198         int allowWait, cm_user_t *userp, cm_req_t *reqp,
199         cm_file_lock_t **lockpp);
200
201 #define CM_UNLOCK_BY_FID        0x0001
202
203 extern long cm_UnlockByKey(cm_scache_t * scp,
204         cm_key_t key,
205         int flags,
206         cm_user_t * userp,
207         cm_req_t * reqp);
208
209 extern long cm_Unlock(cm_scache_t *scp, unsigned char sLockType,
210         LARGE_INTEGER LOffset, LARGE_INTEGER LLength, cm_key_t key,
211         cm_user_t *userp, cm_req_t *reqp);
212
213 extern long cm_LockCheckRead(cm_scache_t *scp, 
214         LARGE_INTEGER LOffset, 
215         LARGE_INTEGER LLength, 
216         cm_key_t key);
217
218 extern long cm_LockCheckWrite(cm_scache_t *scp,
219         LARGE_INTEGER LOffset,
220         LARGE_INTEGER LLength,
221         cm_key_t key);
222
223 extern void cm_CheckLocks(void);
224
225 extern void cm_ReleaseAllLocks(void);
226
227 extern void cm_LockMarkSCacheLost(cm_scache_t * scp);
228
229 extern long cm_RetryLock(cm_file_lock_t *oldFileLock, int client_is_dead);
230
231 #define CM_SESSION_SMB      0xffff
232 #define CM_SESSION_IFS      0xfffe
233 #define CM_SESSION_CMINT    0xfffd
234 #define CM_SESSION_RESERVED 0xfff0
235
236 extern cm_key_t cm_GenerateKey(unsigned int session, unsigned long process_id, unsigned int file_id);
237
238 #define MAX_SYMLINK_COUNT 16
239 #endif /*  __CM_VNODEOPS_H_ENV__ */