macos-rollup-20051013
[openafs.git] / src / afs / DARWIN / osi_machdep.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  *
11  * MACOS OSI header file. Extends afs_osi.h.
12  *
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
15  * afs_osi.h.
16  */
17
18 #ifndef _OSI_MACHDEP_H_
19 #define _OSI_MACHDEP_H_
20
21 #ifdef XAFS_DARWIN_ENV
22 #ifndef _MACH_ETAP_H_
23 #define _MACH_ETAP_H_
24 typedef unsigned short etap_event_t;
25 #endif
26 #endif
27
28 #ifdef AFS_DARWIN80_ENV
29 #include <kern/locks.h>
30 #include <sys/mount.h>
31 #include <h/vnode.h>
32 #else
33 #include <sys/lock.h>
34 #include <sys/user.h>
35 #include <sys/vnode.h>
36 #endif
37 #include <kern/thread.h>
38
39 #ifdef AFS_DARWIN80_ENV
40 #define vop_proc vfs_context_proc(ap->a_context)
41 #define vop_cred vfs_context_ucred(ap->a_context)
42 #define cn_proc(cnp) vfs_context_proc(ap->a_context)
43 #define cn_cred(cnp) vfs_context_ucred(ap->a_context)
44 #define vop_cn_proc vfs_context_proc(ap->a_context)
45 #define vop_cn_cred vfs_context_ucred(ap->a_context)
46 #define getpid()                proc_selfpid()
47 #define getppid()               proc_selfppid()
48 #else
49 #define vop_proc ap->a_p
50 #define vop_cred ap->a_cred
51 #define cn_proc(cnp) (cnp)->cn_proc
52 #define cn_cred(cnp) (cnp)->cn_cred
53 #define vop_cn_proc cn_proc(ap->a_cnp)
54 #define vop_cn_cred cn_cred(ap->a_cnp)
55 #define getpid()                current_proc()->p_pid
56 #define getppid()               current_proc()->p_pptr->p_pid
57 #endif
58 #undef gop_lookupname
59 #define gop_lookupname osi_lookupname
60
61 #define FTRUNC 0
62
63 /* vcexcl - used only by afs_create */
64 enum vcexcl { EXCL, NONEXCL };
65
66 #ifndef AFS_DARWIN80_ENV
67 #define vnode_clearfsnode(x) ((x)->v_data = 0)
68 #define vnode_fsnode(x) (x)->v_data
69 #define vnode_lock(x) vn_lock(x, LK_EXCLUSIVE | LK_RETRY, current_proc());
70 #define vnode_isvroot(x) (((x)->v_flag & VROOT)?1:0)
71 #define vnode_vtype(x) (x)->v_type
72 #define vnode_isdir(x) ((x)->v_type == VDIR)
73
74 #define vfs_flags(x) (x)->v_flags
75 #define vfs_setflags(x, y) (x)->mnt_flag |= (y)
76 #define vfs_clearflags(x, y) (x)->mnt_flag &= (~(y))
77 #define vfs_isupdate(x) ((x)->mnt_flag & MNT_UPDATE)
78 #define vfs_fsprivate(x) (x)->mnt_data
79 #define vfs_setfsprivate(x,y) (x)->mnt_data = (y)
80 #define vfs_typenum(x) (x)->mnt_vfc->vfc_typenum
81 #endif
82
83 #ifdef AFS_DARWIN80_ENV
84 #define vrele vnode_rele
85 #define vput vnode_rele
86 #define vref vnode_ref
87 #define vattr vnode_attr
88 #if 0
89 #define vn_lock(v, unused1, unused2) vnode_get((v))
90 #define VOP_LOCK(v, unused1, unused2) vnode_get((v))
91 #define VOP_UNLOCK(v, unused1, unused2) vnode_put((v))
92 #endif
93
94 #define va_size va_data_size
95 #define va_atime va_access_time
96 #define va_mtime va_modify_time
97 #define va_ctime va_change_time
98 #define va_bytes va_total_alloc 
99 #define va_blocksize va_iosize
100 #define va_nodeid va_fileid
101
102 #define crref kauth_cred_get_with_ref
103 #define crhold kauth_cred_ref
104 #define crfree kauth_cred_rele
105 #define crdup kauth_cred_dup
106
107 extern vfs_context_t afs_osi_ctxtp;
108 extern int afs_osi_ctxtp_initialized;
109 #endif
110
111 /* 
112  * Time related macros
113  */
114 #ifndef AFS_DARWIN60_ENV
115 extern struct timeval time;
116 #endif
117 #ifdef AFS_DARWIN80_ENV
118 static inline time_t osi_Time(void) {
119     struct timeval _now;
120     microtime(&_now);
121     return _now.tv_sec;
122 }
123 #else
124 #define osi_Time() (time.tv_sec)
125 #endif
126 #define afs_hz      hz
127 #ifdef AFS_DARWIN80_ENV
128 extern int hz;
129 #endif
130
131 #define PAGESIZE 8192
132
133 #define AFS_UCRED       ucred
134
135 #define AFS_PROC        struct proc
136
137 #define osi_vnhold(avc,r)       VN_HOLD(AFSTOV(avc))
138 #define VN_HOLD(vp) darwin_vn_hold(vp)
139 #define VN_RELE(vp) vrele(vp);
140
141 void darwin_vn_hold(struct vnode *vp);
142 #ifdef AFS_DARWIN80_ENV
143 void darwin_vn_rele(struct vnode *vp);
144 #endif
145
146 #define gop_rdwr(rw,gp,base,len,offset,segflg,unit,cred,aresid) \
147   vn_rdwr((rw),(gp),(base),(len),(offset),(segflg),(unit),(cred),(aresid),current_proc())
148
149 #undef afs_suser
150
151 #ifdef KERNEL
152 extern thread_t afs_global_owner;
153 /* simple locks cannot be used since sleep can happen at any time */
154 #ifdef AFS_DARWIN80_ENV
155 /* mach locks still don't have an exported try, but we are forced to use them */
156 extern lck_mtx_t  *afs_global_lock;
157 #define AFS_GLOCK() \
158     do { \
159         osi_Assert(afs_global_owner != current_thread()); \
160         lck_mtx_lock(afs_global_lock); \
161         osi_Assert(afs_global_owner == 0); \
162         afs_global_owner = current_thread(); \
163     } while (0)
164 #define AFS_GUNLOCK() \
165     do { \
166         osi_Assert(afs_global_owner == current_thread()); \
167         afs_global_owner = 0; \
168         lck_mtx_unlock(afs_global_lock); \
169     } while(0)
170 #else
171 /* Should probably use mach locks rather than bsd locks, since we use the
172    mach thread control api's elsewhere (mach locks not used for consistency
173    with rx, since rx needs lock_write_try() in order to use mach locks
174  */
175 extern struct lock__bsd__ afs_global_lock;
176 #define AFS_GLOCK() \
177     do { \
178         lockmgr(&afs_global_lock, LK_EXCLUSIVE, 0, current_proc()); \
179         osi_Assert(afs_global_owner == 0); \
180         afs_global_owner = current_thread(); \
181     } while (0)
182 #define AFS_GUNLOCK() \
183     do { \
184         osi_Assert(afs_global_owner == current_thread()); \
185         afs_global_owner = 0; \
186         lockmgr(&afs_global_lock, LK_RELEASE, 0, current_proc()); \
187     } while(0)
188 #endif
189 #define ISAFS_GLOCK() (afs_global_owner == current_thread())
190
191 #define SPLVAR
192 #define NETPRI
193 #define USERPRI
194 #if 0
195 #undef SPLVAR
196 #define SPLVAR int x;
197 #undef NETPRI
198 #define NETPRI x=splnet();
199 #undef USERPRI
200 #define USERPRI splx(x);
201 #endif
202
203 #define AFS_APPL_UFS_CACHE 1
204 #define AFS_APPL_HFS_CACHE 2
205
206 extern ino_t VnodeToIno(struct vnode * vp);
207 extern dev_t VnodeToDev(struct vnode * vp);
208 extern int igetinode(mount_t vfsp, dev_t dev , ino_t inode, vnode_t *vpp,
209               struct vattr *va, int *perror);
210
211 #define osi_curproc() current_proc()
212
213 /* FIXME */
214 #define osi_curcred() &afs_osi_cred 
215
216 #ifdef AFS_DARWIN80_ENV
217 uio_t afsio_darwin_partialcopy(uio_t auio, int size);
218
219 #define uprintf printf
220 #endif
221
222 #endif /* KERNEL */
223
224 #endif /* _OSI_MACHDEP_H_ */