venus: Remove dedebug
[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 OPENAFS_WINNT_AFSD_CM_VNODEOPS_H
11 #define OPENAFS_WINNT_AFSD_CM_VNODEOPS_H 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     fschar_t     *searchNamep;
39     normchar_t   *nsearchNamep;
40     int           found;
41     int           LCfound, UCfound, NCfound, ExactFound;
42     int           caseFold;
43     int           hasTilde;
44 } cm_lookupSearch_t;
45
46 #include "cm_dir.h"
47
48 typedef int (*cm_DirFuncp_t)(struct cm_scache *, struct cm_dirEntry *, void *,
49                              osi_hyper_t *entryOffsetp);
50
51 /* Special path syntax for direct references to volumes
52
53    The syntax: @vol:<cellname>{%,#}<volume> can be used to refer to a
54    specific volume in a specific cell, where:
55
56    <cellname> : name of the cell
57    <volume>   : volume name or ID
58  */
59 #define CM_PREFIX_VOL "@vol:"
60 #define CM_PREFIX_VOL_CCH 5
61
62 /* Maximum number of expanded components in a path */
63 #define MAX_FID_COUNT 512
64
65 /* arrays */
66
67 extern fschar_t cm_foldUpper[];
68
69 /* functions */
70
71 extern int cm_NoneLower(normchar_t *s);
72
73 extern int cm_NoneUpper(normchar_t *s);
74
75 extern int cm_stricmp(const char *, const char *);
76
77 extern long cm_ReadMountPoint(cm_scache_t *scp, cm_user_t *userp,
78                               cm_req_t *reqp);
79
80 extern long cm_EvaluateVolumeReference(clientchar_t * namep, long flags, cm_user_t * userp,
81                                        cm_req_t *reqp, cm_scache_t ** outpScpp);
82
83 #ifdef DEBUG_REFCOUNT
84 extern long cm_NameIDbg(cm_scache_t *rootSCachep, clientchar_t *pathp, long flags,
85                         cm_user_t *userp, clientchar_t *tidPathp, cm_req_t *reqp,
86                         cm_scache_t **outScpp, char *, long);
87
88 extern long cm_LookupDbg(cm_scache_t *dscp, clientchar_t *namep, long flags,
89                          cm_user_t *userp, cm_req_t *reqp, cm_scache_t **outpScpp,
90                          char *, long);
91
92 #define cm_Lookup(a,b,c,d,e,f)  cm_LookupDbg(a,b,c,d,e,f,__FILE__,__LINE__)
93 #define cm_NameI(a,b,c,d,e,f,g) cm_NameIDbg(a,b,c,d,e,f,g,__FILE__,__LINE__)
94 #else
95 extern long cm_NameI(cm_scache_t *rootSCachep, clientchar_t *pathp, long flags,
96                      cm_user_t *userp, clientchar_t *tidPathp, cm_req_t *reqp,
97                      cm_scache_t **outScpp);
98 extern long cm_Lookup(cm_scache_t *dscp, clientchar_t *namep, long flags,
99                       cm_user_t *userp, cm_req_t *reqp, cm_scache_t **outpScpp);
100 #endif
101
102 extern long cm_LookupInternal(cm_scache_t *dscp, clientchar_t *namep, long flags,
103                               cm_user_t *userp, cm_req_t *reqp,
104                               cm_scache_t **outpScpp);
105
106 extern afs_int32 cm_TryBulkStat(cm_scache_t *dscp, osi_hyper_t *offsetp,
107                                 cm_user_t *userp, cm_req_t *reqp);
108
109 extern long cm_SetAttr(cm_scache_t *scp, cm_attr_t *attrp, cm_user_t *userp,
110                        cm_req_t *reqp);
111
112 extern long cm_Create(cm_scache_t *scp, clientchar_t *namep, long flags,
113                       cm_attr_t *attrp, cm_scache_t **scpp,
114                       cm_user_t *userp, cm_req_t *reqp);
115
116 extern long cm_FSync(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp, afs_uint32 locked);
117
118 extern void cm_StatusFromAttr(struct AFSStoreStatus *statusp,
119                               struct cm_scache *scp, struct cm_attr *attrp);
120
121 extern long cm_Unlink(cm_scache_t *dscp, fschar_t *fnamep,
122                       clientchar_t *cnamep,
123                       cm_user_t *userp, cm_req_t *reqp);
124
125 extern long cm_ApplyDir(cm_scache_t *scp, cm_DirFuncp_t funcp, void *parmp,
126                         osi_hyper_t *startOffsetp, cm_user_t *userp, cm_req_t *reqp,
127                         cm_scache_t **retscp);
128
129 extern long cm_MakeDir(cm_scache_t *dscp, clientchar_t *lastNamep, long flags,
130                        cm_attr_t *attrp, cm_user_t *userp, cm_req_t *reqp,
131                        cm_scache_t **scpp);
132
133 extern long cm_RemoveDir(cm_scache_t *dscp, fschar_t *lastNamep, clientchar_t *originalNamep,
134                          cm_user_t *userp, cm_req_t *reqp);
135
136 extern long cm_Rename(cm_scache_t *oldDscp,
137                       fschar_t *oldLastNamep, clientchar_t *normalizedOldNamep,
138                       cm_scache_t *newDscp, clientchar_t *newLastNamep,
139                       cm_user_t *userp, cm_req_t *reqp);
140
141 extern long cm_HandleLink(cm_scache_t *linkScp, struct cm_user *userp,
142                           cm_req_t *reqp);
143
144 extern long cm_Link(cm_scache_t *dscp, clientchar_t *namep, cm_scache_t *sscp,
145                     long flags, cm_user_t *userp, cm_req_t *reqp);
146
147 extern long cm_SymLink(cm_scache_t *dscp, clientchar_t *namep, fschar_t *contentsp,
148                        long flags, cm_attr_t *attrp, cm_user_t *userp, cm_req_t *reqp,
149                        cm_scache_t **scpp);
150
151 extern long cm_AssembleLink(cm_scache_t *linkScp, fschar_t *pathSuffixp,
152                             cm_scache_t **newRootScpp, cm_space_t **newSpaceBufferp,
153                             cm_user_t *userp, cm_req_t *reqp);
154
155 extern int cm_ExpandSysName(cm_req_t *reqp, clientchar_t *inp, clientchar_t *outp, long outSizeCch,
156                             unsigned int sysNameIndex);
157
158 extern long cm_Open(cm_scache_t *scp, int type, cm_user_t *userp);
159
160 extern long cm_CheckOpen(cm_scache_t *scp, int openMode, int trunc,
161                          cm_user_t *userp, cm_req_t *reqp);
162
163 /*
164  * Combinations of file opening access bits for AFS.
165  * We don't insist on write rights to open the file with FILE_WRITE_ATTRIBUTES,
166  * because we want to enable the owner to set/clear the READONLY flag.
167  * The RPC will fail if you can't modify the attributes, anyway.
168  */
169 #define AFS_ACCESS_READ (FILE_GENERIC_READ & ~SYNCHRONIZE)
170 #define AFS_ACCESS_WRITE ((FILE_GENERIC_WRITE & ~(READ_CONTROL | SYNCHRONIZE)) \
171                                 & ~FILE_WRITE_ATTRIBUTES)
172 #define AFS_ACCESS_EXECUTE (FILE_GENERIC_EXECUTE & ~SYNCHRONIZE)
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,
181                            unsigned int desiredAccess,
182                            unsigned int shareAccess,
183                            unsigned int createDisp,
184                            afs_offs_t process_id,
185                            afs_offs_t handle_id,
186                            cm_user_t *userp, cm_req_t *reqp,
187                            cm_lock_data_t ** ldpp);
188
189 extern long cm_CheckNTOpenDone(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp,
190                                cm_lock_data_t ** ldpp);
191
192 extern long cm_CheckNTDelete(cm_scache_t *dscp, cm_scache_t *scp,
193                              cm_user_t *userp, cm_req_t *reqp);
194
195 extern long cm_EvaluateSymLink(cm_scache_t *dscp, cm_scache_t *linkScp,
196                                cm_scache_t **outScpp, cm_user_t *userp,
197                                cm_req_t *reqp);
198
199 extern long cm_FollowMountPoint(cm_scache_t *scp, cm_scache_t *dscp, cm_user_t *userp,
200                                 cm_req_t *reqp, cm_scache_t **outScpp);
201
202
203 extern long cm_Lock(cm_scache_t *scp, unsigned char sLockType,
204                     LARGE_INTEGER LOffset, LARGE_INTEGER LLength, cm_key_t key,
205                     int allowWait, cm_user_t *userp, cm_req_t *reqp,
206                     cm_file_lock_t **lockpp);
207
208 extern long cm_UnlockByKey(cm_scache_t * scp,
209                            cm_key_t key,
210                            afs_uint32 flags,
211                            cm_user_t * userp,
212                            cm_req_t * reqp);
213
214 #define CM_UNLOCK_FLAG_BY_FID           0x0001
215 #define CM_UNLOCK_FLAG_MATCH_RANGE      0x0002
216
217 extern long cm_Unlock(cm_scache_t *scp, unsigned char sLockType,
218                       LARGE_INTEGER LOffset, LARGE_INTEGER LLength, cm_key_t key,
219                       afs_uint32 flags, cm_user_t *userp, cm_req_t *reqp);
220
221 extern long cm_LockCheckRead(cm_scache_t *scp,
222                              LARGE_INTEGER LOffset,
223                              LARGE_INTEGER LLength,
224                              cm_key_t key);
225
226 extern long cm_LockCheckWrite(cm_scache_t *scp,
227                               LARGE_INTEGER LOffset,
228                               LARGE_INTEGER LLength,
229                               cm_key_t key);
230
231 extern void cm_CheckLocks(void);
232
233 extern void cm_ReleaseAllLocks(void);
234
235 extern void cm_LockMarkSCacheLost(cm_scache_t * scp);
236
237 extern long cm_RetryLock(cm_file_lock_t *oldFileLock, int client_is_dead);
238
239 #define CM_SESSION_SMB      0xffff
240 #define CM_SESSION_IFS      0xfffe
241 #define CM_SESSION_CMINT    0xfffd
242 #define CM_SESSION_RESERVED 0xfff0
243
244 extern cm_key_t cm_GenerateKey(afs_uint16 session_id, afs_offs_t process_id, afs_uint64 file_id);
245
246 extern int cm_KeyEquals(cm_key_t * k1, cm_key_t * k2, int flags);
247
248 extern int cm_IsSpaceAvailable(cm_fid_t * fidp, osi_hyper_t *sizep, cm_user_t *userp, cm_req_t *reqp);
249
250 #define MAX_SYMLINK_COUNT 64
251
252 /* make this big enough so that one buffer of dir pages won't overflow.  We'll
253  * check anyway, but we want to minimize the chance that we have to leave stuff
254  * unstat'd.
255  */
256 #define CM_BULKMAX              (3 * AFSCBMAX)
257
258 /* rock for bulk stat calls */
259 typedef struct cm_bulkStat {
260     cm_user_t *userp;
261     osi_hyper_t bufOffset;      /* only do it for things in this buffer page */
262
263     /* info for the actual call */
264     int counter;                        /* next free slot */
265     AFSFid fids[CM_BULKMAX];
266     AFSFetchStatus stats[CM_BULKMAX];
267     AFSCallBack callbacks[CM_BULKMAX];
268 } cm_bulkStat_t;
269
270 extern afs_int32 cm_TryBulkStatRPC(cm_scache_t *dscp, cm_bulkStat_t *bbp,
271                                    cm_user_t *userp, cm_req_t *reqp);
272
273 #endif /*  OPENAFS_WINNT_AFSD_CM_VNODEOPS_H */