2 * Copyright 2000, International Business Machines Corporation and others.
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
10 #ifndef OPENAFS_WINNT_AFSD_CM_VNODEOPS_H
11 #define OPENAFS_WINNT_AFSD_CM_VNODEOPS_H 1
13 extern unsigned int cm_mountRootGen;
15 extern int cm_enableServerLocks;
17 extern int cm_followBackupPath;
19 /* parms for attribute setting call */
20 typedef struct cm_attr {
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 */
35 /* type of rock for lookup's searches */
36 typedef struct cm_lookupSearch {
38 fschar_t *searchNamep;
39 normchar_t *nsearchNamep;
41 int LCfound, UCfound, NCfound, ExactFound;
48 typedef int (*cm_DirFuncp_t)(struct cm_scache *, struct cm_dirEntry *, void *,
49 osi_hyper_t *entryOffsetp);
51 /* Special path syntax for direct references to volumes
53 The syntax: @vol:<cellname>{%,#}<volume> can be used to refer to a
54 specific volume in a specific cell, where:
56 <cellname> : name of the cell
57 <volume> : volume name or ID
59 #define CM_PREFIX_VOL "@vol:"
60 #define CM_PREFIX_VOL_CCH 5
64 extern fschar_t cm_foldUpper[];
68 extern int cm_NoneLower(normchar_t *s);
70 extern int cm_NoneUpper(normchar_t *s);
72 extern int cm_stricmp(const char *, const char *);
74 extern long cm_ReadMountPoint(cm_scache_t *scp, cm_user_t *userp,
77 extern long cm_EvaluateVolumeReference(clientchar_t * namep, long flags, cm_user_t * userp,
78 cm_req_t *reqp, cm_scache_t ** outpScpp);
81 extern long cm_NameIDbg(cm_scache_t *rootSCachep, clientchar_t *pathp, long flags,
82 cm_user_t *userp, clientchar_t *tidPathp, cm_req_t *reqp,
83 cm_scache_t **outScpp, char *, long);
85 extern long cm_LookupDbg(cm_scache_t *dscp, clientchar_t *namep, long flags,
86 cm_user_t *userp, cm_req_t *reqp, cm_scache_t **outpScpp,
89 #define cm_Lookup(a,b,c,d,e,f) cm_LookupDbg(a,b,c,d,e,f,__FILE__,__LINE__)
90 #define cm_NameI(a,b,c,d,e,f,g) cm_NameIDbg(a,b,c,d,e,f,g,__FILE__,__LINE__)
92 extern long cm_NameI(cm_scache_t *rootSCachep, clientchar_t *pathp, long flags,
93 cm_user_t *userp, clientchar_t *tidPathp, cm_req_t *reqp,
94 cm_scache_t **outScpp);
95 extern long cm_Lookup(cm_scache_t *dscp, clientchar_t *namep, long flags,
96 cm_user_t *userp, cm_req_t *reqp, cm_scache_t **outpScpp);
99 extern long cm_LookupInternal(cm_scache_t *dscp, clientchar_t *namep, long flags,
100 cm_user_t *userp, cm_req_t *reqp,
101 cm_scache_t **outpScpp);
103 extern afs_int32 cm_TryBulkStat(cm_scache_t *dscp, osi_hyper_t *offsetp,
104 cm_user_t *userp, cm_req_t *reqp);
106 extern long cm_SetAttr(cm_scache_t *scp, cm_attr_t *attrp, cm_user_t *userp,
109 extern long cm_Create(cm_scache_t *scp, clientchar_t *namep, long flags,
110 cm_attr_t *attrp, cm_scache_t **scpp,
111 cm_user_t *userp, cm_req_t *reqp);
113 extern long cm_FSync(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp, afs_uint32 locked);
115 extern void cm_StatusFromAttr(struct AFSStoreStatus *statusp,
116 struct cm_scache *scp, struct cm_attr *attrp);
118 extern long cm_Unlink(cm_scache_t *dscp, fschar_t *fnamep,
119 clientchar_t *cnamep,
120 cm_user_t *userp, cm_req_t *reqp);
122 extern long cm_ApplyDir(cm_scache_t *scp, cm_DirFuncp_t funcp, void *parmp,
123 osi_hyper_t *startOffsetp, cm_user_t *userp, cm_req_t *reqp,
124 cm_scache_t **retscp);
126 extern long cm_MakeDir(cm_scache_t *dscp, clientchar_t *lastNamep, long flags,
127 cm_attr_t *attrp, cm_user_t *userp, cm_req_t *reqp,
130 extern long cm_RemoveDir(cm_scache_t *dscp, fschar_t *lastNamep, clientchar_t *originalNamep,
131 cm_user_t *userp, cm_req_t *reqp);
133 extern long cm_Rename(cm_scache_t *oldDscp,
134 fschar_t *oldLastNamep, clientchar_t *normalizedOldNamep,
135 cm_scache_t *newDscp, clientchar_t *newLastNamep,
136 cm_user_t *userp, cm_req_t *reqp);
138 extern long cm_HandleLink(cm_scache_t *linkScp, struct cm_user *userp,
141 extern long cm_Link(cm_scache_t *dscp, clientchar_t *namep, cm_scache_t *sscp,
142 long flags, cm_user_t *userp, cm_req_t *reqp);
144 extern long cm_SymLink(cm_scache_t *dscp, clientchar_t *namep, fschar_t *contentsp,
145 long flags, cm_attr_t *attrp, cm_user_t *userp, cm_req_t *reqp,
148 extern long cm_AssembleLink(cm_scache_t *linkScp, fschar_t *pathSuffixp,
149 cm_scache_t **newRootScpp, cm_space_t **newSpaceBufferp,
150 cm_user_t *userp, cm_req_t *reqp);
152 extern int cm_ExpandSysName(cm_req_t *reqp, clientchar_t *inp, clientchar_t *outp, long outSizeCch,
153 unsigned int sysNameIndex);
155 extern long cm_Open(cm_scache_t *scp, int type, cm_user_t *userp);
157 extern long cm_CheckOpen(cm_scache_t *scp, int openMode, int trunc,
158 cm_user_t *userp, cm_req_t *reqp);
161 * Combinations of file opening access bits for AFS.
162 * We don't insist on write rights to open the file with FILE_WRITE_ATTRIBUTES,
163 * because we want to enable the owner to set/clear the READONLY flag.
164 * The RPC will fail if you can't modify the attributes, anyway.
166 #define AFS_ACCESS_READ (FILE_GENERIC_READ & ~SYNCHRONIZE)
167 #define AFS_ACCESS_WRITE ((FILE_GENERIC_WRITE & ~(READ_CONTROL | SYNCHRONIZE)) \
168 & ~FILE_WRITE_ATTRIBUTES)
169 #define AFS_ACCESS_EXECUTE (FILE_GENERIC_EXECUTE & ~SYNCHRONIZE)
171 typedef struct cm_lock_data {
173 unsigned int sLockType;
174 LARGE_INTEGER LOffset, LLength;
177 extern long cm_CheckNTOpen(cm_scache_t *scp,
178 unsigned int desiredAccess,
179 unsigned int shareAccess,
180 unsigned int createDisp,
181 afs_offs_t process_id,
182 afs_offs_t handle_id,
183 cm_user_t *userp, cm_req_t *reqp,
184 cm_lock_data_t ** ldpp);
186 extern long cm_CheckNTOpenDone(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp,
187 cm_lock_data_t ** ldpp);
189 extern long cm_CheckNTDelete(cm_scache_t *dscp, cm_scache_t *scp,
190 cm_user_t *userp, cm_req_t *reqp);
192 extern long cm_EvaluateSymLink(cm_scache_t *dscp, cm_scache_t *linkScp,
193 cm_scache_t **outScpp, cm_user_t *userp,
196 extern long cm_FollowMountPoint(cm_scache_t *scp, cm_scache_t *dscp, cm_user_t *userp,
197 cm_req_t *reqp, cm_scache_t **outScpp);
200 extern long cm_Lock(cm_scache_t *scp, unsigned char sLockType,
201 LARGE_INTEGER LOffset, LARGE_INTEGER LLength, cm_key_t key,
202 int allowWait, cm_user_t *userp, cm_req_t *reqp,
203 cm_file_lock_t **lockpp);
205 extern long cm_UnlockByKey(cm_scache_t * scp,
211 #define CM_UNLOCK_FLAG_BY_FID 0x0001
212 #define CM_UNLOCK_FLAG_MATCH_RANGE 0x0002
214 extern long cm_Unlock(cm_scache_t *scp, unsigned char sLockType,
215 LARGE_INTEGER LOffset, LARGE_INTEGER LLength, cm_key_t key,
216 afs_uint32 flags, cm_user_t *userp, cm_req_t *reqp);
218 extern long cm_LockCheckRead(cm_scache_t *scp,
219 LARGE_INTEGER LOffset,
220 LARGE_INTEGER LLength,
223 extern long cm_LockCheckWrite(cm_scache_t *scp,
224 LARGE_INTEGER LOffset,
225 LARGE_INTEGER LLength,
228 extern void cm_CheckLocks(void);
230 extern void cm_ReleaseAllLocks(void);
232 extern void cm_LockMarkSCacheLost(cm_scache_t * scp);
234 extern long cm_RetryLock(cm_file_lock_t *oldFileLock, int client_is_dead);
236 #define CM_SESSION_SMB 0xffff
237 #define CM_SESSION_IFS 0xfffe
238 #define CM_SESSION_CMINT 0xfffd
239 #define CM_SESSION_RESERVED 0xfff0
241 extern cm_key_t cm_GenerateKey(afs_uint16 session_id, afs_offs_t process_id, afs_uint64 file_id);
243 extern int cm_KeyEquals(cm_key_t * k1, cm_key_t * k2, int flags);
245 extern int cm_IsSpaceAvailable(cm_fid_t * fidp, osi_hyper_t *sizep, cm_user_t *userp, cm_req_t *reqp);
247 #define MAX_SYMLINK_COUNT 64
249 /* make this big enough so that one buffer of dir pages won't overflow. We'll
250 * check anyway, but we want to minimize the chance that we have to leave stuff
253 #define CM_BULKMAX (3 * AFSCBMAX)
255 /* rock for bulk stat calls */
256 typedef struct cm_bulkStat {
257 osi_hyper_t bufOffset; /* only do it for things in this buffer page */
259 /* info for the actual call */
260 int counter; /* next free slot */
261 AFSFid fids[CM_BULKMAX];
262 AFSFetchStatus stats[CM_BULKMAX];
263 AFSCallBack callbacks[CM_BULKMAX];
266 extern afs_int32 cm_TryBulkStatRPC(cm_scache_t *dscp, cm_bulkStat_t *bbp,
267 cm_user_t *userp, cm_req_t *reqp);
269 #endif /* OPENAFS_WINNT_AFSD_CM_VNODEOPS_H */