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
11 * MACOS OSI header file. Extends afs_osi.h.
13 * afs_osi.h includes this file, which is the only way this file should
14 * be included in a source file. This file can redefine macros declared in
18 #ifndef _OSI_MACHDEP_H_
19 #define _OSI_MACHDEP_H_
21 #ifdef XAFS_DARWIN_ENV
24 typedef unsigned short etap_event_t;
28 #ifdef AFS_DARWIN80_ENV
29 #include <kern/locks.h>
30 #include <sys/mount.h>
35 #include <sys/vnode.h>
37 #include <sys/kauth.h>
38 #include <kern/thread.h>
40 #ifdef AFS_DARWIN80_ENV
41 #define vop_proc vfs_context_proc(ap->a_context)
42 #define vop_cred vfs_context_ucred(ap->a_context)
43 #define cn_proc(cnp) vfs_context_proc(ap->a_context)
44 #define cn_cred(cnp) vfs_context_ucred(ap->a_context)
45 #define vop_cn_proc vfs_context_proc(ap->a_context)
46 #define vop_cn_cred vfs_context_ucred(ap->a_context)
47 #define getpid() proc_selfpid()
48 #define getppid() proc_selfppid()
50 #define vop_proc ap->a_p
51 #define vop_cred ap->a_cred
52 #define cn_proc(cnp) (cnp)->cn_proc
53 #define cn_cred(cnp) (cnp)->cn_cred
54 #define vop_cn_proc cn_proc(ap->a_cnp)
55 #define vop_cn_cred cn_cred(ap->a_cnp)
56 #define getpid() current_proc()->p_pid
57 #define getppid() current_proc()->p_pptr->p_pid
60 #define gop_lookupname osi_lookupname
61 #undef gop_lookupname_user
62 #define gop_lookupname_user osi_lookupname_user
66 /* vcexcl - used only by afs_create */
67 enum vcexcl { EXCL, NONEXCL };
69 #ifndef AFS_DARWIN80_ENV
70 #define vnode_clearfsnode(x) ((x)->v_data = 0)
71 #define vnode_fsnode(x) (x)->v_data
72 #define vnode_lock(x) vn_lock(x, LK_EXCLUSIVE | LK_RETRY, current_proc())
73 #define vnode_isvroot(x) (((x)->v_flag & VROOT)?1:0)
74 #define vnode_vtype(x) (x)->v_type
75 #define vnode_isdir(x) ((x)->v_type == VDIR)
77 #define vfs_flags(x) (x)->v_flags
78 #define vfs_setflags(x, y) (x)->mnt_flag |= (y)
79 #define vfs_clearflags(x, y) (x)->mnt_flag &= (~(y))
80 #define vfs_isupdate(x) ((x)->mnt_flag & MNT_UPDATE)
81 #define vfs_fsprivate(x) (x)->mnt_data
82 #define vfs_setfsprivate(x,y) (x)->mnt_data = (y)
83 #define vfs_typenum(x) (x)->mnt_vfc->vfc_typenum
86 #ifdef AFS_DARWIN80_ENV
87 #define vrele vnode_rele
88 #define vput vnode_rele
89 #define vref vnode_ref
90 #define vattr vnode_attr
92 #define vn_lock(v, unused1, unused2) vnode_get((v))
93 #define VOP_LOCK(v, unused1, unused2) vnode_get((v))
94 #define VOP_UNLOCK(v, unused1, unused2) vnode_put((v))
97 #define va_size va_data_size
98 #define va_atime va_access_time
99 #define va_mtime va_modify_time
100 #define va_ctime va_change_time
101 #define va_bytes va_total_alloc
102 #define va_blocksize va_iosize
103 #define va_nodeid va_fileid
105 #define crref kauth_cred_get_with_ref
106 #define crhold kauth_cred_ref
107 #ifdef AFS_DARWIN100_ENV
108 #define crfree(X) kauth_cred_unref(&X)
110 #define crfree kauth_cred_rele
112 #define crdup kauth_cred_dup
113 #ifdef AFS_DARWIN100_ENV
114 #define ubc_msync_range(X,Y,Z,A) ubc_msync(X,Y,Z,NULL,A)
116 #define ubc_msync_range(X,Y,Z,A) ubc_sync_range(X,Y,Z,A)
118 extern vfs_context_t afs_osi_ctxtp;
119 extern int afs_osi_ctxtp_initialized;
121 extern u_int32_t afs_darwin_realmodes;
122 extern u_int32_t afs_darwin_fsevents;
125 * Time related macros
127 #ifdef AFS_DARWIN80_ENV
128 static inline time_t osi_Time(void) {
134 #define osi_Time() (time.tv_sec)
137 #ifdef AFS_DARWIN80_ENV
141 typedef struct ucred afs_ucred_t;
142 typedef struct proc afs_proc_t;
144 #define osi_vnhold(avc,r) VN_HOLD(AFSTOV(avc))
145 #define VN_HOLD(vp) darwin_vn_hold(vp)
146 #define VN_RELE(vp) vrele(vp)
148 void darwin_vn_hold(struct vnode *vp);
150 #define gop_rdwr(rw,gp,base,len,offset,segflg,unit,cred,aresid) \
151 vn_rdwr((rw),(gp),(base),(len),(offset),(segflg),(unit),(cred),(aresid),current_proc())
155 extern thread_t afs_global_owner;
156 /* simple locks cannot be used since sleep can happen at any time */
157 #ifdef AFS_DARWIN80_ENV
158 /* mach locks still don't have an exported try, but we are forced to use them */
159 extern lck_mtx_t *afs_global_lock;
160 #define AFS_GLOCK() \
162 osi_Assert(afs_global_owner != current_thread()); \
163 lck_mtx_lock(afs_global_lock); \
164 osi_Assert(afs_global_owner == 0); \
165 afs_global_owner = current_thread(); \
167 #define AFS_GUNLOCK() \
169 osi_Assert(afs_global_owner == current_thread()); \
170 afs_global_owner = 0; \
171 lck_mtx_unlock(afs_global_lock); \
173 #define osi_InitGlock() \
175 afs_global_owner = 0; \
178 /* Should probably use mach locks rather than bsd locks, since we use the
179 mach thread control api's elsewhere (mach locks not used for consistency
180 with rx, since rx needs lock_write_try() in order to use mach locks
182 extern struct lock__bsd__ afs_global_lock;
183 #define AFS_GLOCK() \
185 lockmgr(&afs_global_lock, LK_EXCLUSIVE, 0, current_proc()); \
186 osi_Assert(afs_global_owner == 0); \
187 afs_global_owner = current_thread(); \
189 #define AFS_GUNLOCK() \
191 osi_Assert(afs_global_owner == current_thread()); \
192 afs_global_owner = 0; \
193 lockmgr(&afs_global_lock, LK_RELEASE, 0, current_proc()); \
195 #define osi_InitGlock() \
197 lockinit(&afs_global_lock, PLOCK, "afs global lock", 0, 0); \
198 afs_global_owner = 0; \
201 #define ISAFS_GLOCK() (afs_global_owner == current_thread())
210 #define NETPRI x=splnet()
212 #define USERPRI splx(x)
215 #define AFS_APPL_UFS_CACHE 1
216 #define AFS_APPL_HFS_CACHE 2
218 extern ino_t VnodeToIno(vnode_t avp);
219 extern dev_t VnodeToDev(vnode_t vp);
220 extern int igetinode(mount_t vfsp, dev_t dev , ino_t inode, vnode_t *vpp,
221 struct vattr *va, int *perror);
223 #define osi_curproc() current_proc()
226 #define osi_curcred() &afs_osi_cred
228 #ifdef AFS_DARWIN80_ENV
229 # define afsio_free(X) uio_free(X)
230 # define afsio_setoffset(X, Y) uio_setoffset(X, Y)
231 # define uprintf printf
234 /* Vnode related macros */
236 #if defined(AFS_DARWIN80_ENV)
237 extern int afs_vfs_typenum;
238 # define vType(vc) vnode_vtype(AFSTOV(vc))
239 # define vSetVfsp(vc, vfsp)
240 # define vSetType(vc, type) (vc)->f.m.Type = (type)
241 # define SetAfsVnode(vn) /* nothing; done in getnewvnode() */
242 # define IsAfsVnode(v) (vfs_typenum(vnode_mount((v))) == afs_vfs_typenum)
244 extern int (**afs_vnodeop_p) ();
245 # define vType(vc) AFSTOV(vc)->v_type
246 # define vSetVfsp(vc, vfsp) AFSTOV(vc)->v_mount = (vfsp)
247 # define vSetType(vc, type) AFSTOV(vc)->v_type = (type)
248 # define IsAfsVnode(v) ((v)->v_op == afs_vnodeop_p)
249 # define SetAfsVnode(v) /* nothing; done in getnewvnode() */
252 #ifdef AFS_DARWIN80_ENV
253 #define osi_procname(procname, size) proc_selfname(procname, size)
255 #define osi_procname(procname, size) strncpy(procname, curproc->p_comm, size)
258 #endif /* _OSI_MACHDEP_H_ */