]>
Commit | Line | Data |
---|---|---|
1c79356b | 1 | /* |
9bccf70c | 2 | * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved. |
1c79356b A |
3 | * |
4 | * @APPLE_LICENSE_HEADER_START@ | |
5 | * | |
e5568f75 A |
6 | * The contents of this file constitute Original Code as defined in and |
7 | * are subject to the Apple Public Source License Version 1.1 (the | |
8 | * "License"). You may not use this file except in compliance with the | |
9 | * License. Please obtain a copy of the License at | |
10 | * http://www.apple.com/publicsource and read it before using this file. | |
1c79356b | 11 | * |
e5568f75 A |
12 | * This Original Code and all software distributed under the License are |
13 | * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER | |
1c79356b A |
14 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
15 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
e5568f75 A |
16 | * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the |
17 | * License for the specific language governing rights and limitations | |
18 | * under the License. | |
1c79356b A |
19 | * |
20 | * @APPLE_LICENSE_HEADER_END@ | |
21 | */ | |
22 | /* Copyright (c) 1998, Apple Computer, Inc. All rights reserved. */ | |
23 | /* | |
24 | * Header file for volfs | |
25 | */ | |
9bccf70c A |
26 | #ifndef __VOLFS_VOLFS_H__ |
27 | #define __VOLFS_VOLFS_H__ | |
1c79356b | 28 | |
9bccf70c A |
29 | #include <sys/appleapiopts.h> |
30 | ||
31 | #ifdef __APPLE_API_PRIVATE | |
1c79356b A |
32 | struct volfs_mntdata |
33 | { | |
34 | struct vnode *volfs_rootvp; | |
35 | LIST_HEAD(volfs_fsvnodelist, vnode) volfs_fsvnodes; | |
36 | }; | |
37 | ||
38 | /* | |
39 | * Volfs vnodes exist only for the root, which allows for the enumeration | |
40 | * of all volfs accessible filesystems, and for the filesystems which | |
41 | * volfs handles. | |
42 | */ | |
43 | #define VOLFS_ROOT 1 /* This volfs vnode represents root of volfs */ | |
44 | #define VOLFS_FSNODE 2 /* This volfs vnode represents a file system */ | |
45 | ||
46 | struct volfs_vndata | |
47 | { | |
48 | int vnode_type; | |
49 | struct lock__bsd__ lock; | |
50 | unsigned int nodeID; /* the dev entry of a file system */ | |
51 | struct mount * fs_mount; | |
52 | }; | |
53 | ||
54 | #define MAXVLFSNAMLEN 24 /* max length is really 10, pad to 24 since | |
55 | * some of the math depends on VLFSDIRENTLEN | |
56 | * being a power of 2 */ | |
57 | #define VLFSDIRENTLEN (MAXVLFSNAMLEN + sizeof(u_int32_t) + sizeof(u_int16_t) + sizeof(u_int8_t) + sizeof(u_int8_t)) | |
58 | ||
59 | #define ROOT_DIRID 2 | |
60 | ||
55e303ae A |
61 | #define MAXPLCENTRIES 250 |
62 | #define PLCHASHSIZE 128 | |
63 | ||
1c79356b A |
64 | extern int (**volfs_vnodeop_p)(void *); |
65 | __BEGIN_DECLS | |
66 | ||
67 | int volfs_mount __P((struct mount *, char *, caddr_t, struct nameidata *, | |
68 | struct proc *)); | |
69 | int volfs_start __P((struct mount *, int, struct proc *)); | |
70 | int volfs_unmount __P((struct mount *, int, struct proc *)); | |
71 | int volfs_root __P((struct mount *, struct vnode **)); | |
72 | int volfs_quotactl __P((struct mount *, int, uid_t, caddr_t, | |
73 | struct proc *)); | |
74 | int volfs_statfs __P((struct mount *, struct statfs *, struct proc *)); | |
75 | int volfs_sync __P((struct mount *, int, struct ucred *, struct proc *)); | |
76 | int volfs_vget __P((struct mount *, void *ino_t, struct vnode **)); | |
77 | int volfs_fhtovp __P((struct mount *, struct fid *, struct mbuf *, | |
78 | struct vnode **, int *, struct ucred **)); | |
79 | int volfs_vptofh __P((struct vnode *, struct fid *)); | |
80 | int volfs_init __P((struct vfsconf *)); | |
81 | int volfs_sysctl __P((int *, u_int, void *, size_t *, void *, size_t, | |
82 | struct proc *)); | |
83 | ||
84 | int volfs_reclaim __P((struct vop_reclaim_args*)); | |
85 | int volfs_access __P((struct vop_access_args *)); | |
86 | int volfs_getattr __P((struct vop_getattr_args *)); | |
87 | int volfs_select __P((struct vop_select_args *)); | |
88 | int volfs_rmdir __P((struct vop_rmdir_args *)); | |
89 | int volfs_readdir __P((struct vop_readdir_args *)); | |
90 | int volfs_lock __P((struct vop_lock_args *)); | |
91 | int volfs_unlock __P((struct vop_unlock_args *)); | |
92 | int volfs_islocked __P((struct vop_islocked_args *)); | |
93 | int volfs_pathconf __P((struct vop_pathconf_args *)); | |
94 | int volfs_lookup __P((struct vop_lookup_args *)); | |
95 | __END_DECLS | |
96 | ||
97 | #define VTOVL(VP) ((struct volfs_vndata *)((VP)->v_data)) | |
98 | ||
99 | #define PRINTIT kprintf | |
100 | ||
101 | #if VOLFS_DEBUG | |
102 | #define DBG_VOP_TEST_LOCKS 1 | |
103 | #define DBG_FUNC_NAME(FSTR) static char *funcname = FSTR | |
104 | #define DBG_PRINT_FUNC_NAME() PRINTIT("%s\n", funcname); | |
105 | #define DBG_VOP_PRINT_FUNCNAME() PRINTIT("%s: ", funcname); | |
106 | #define DBG_VOP_PRINT_CPN_INFO(CN) PRINTIT("name: %s",(CN)->cn_nameptr); | |
107 | #define DBG_VOP(STR) PRINTIT STR; | |
108 | #define DBG_VOP_PRINT_VNODE_INFO(VP) { if ((VP)) \ | |
109 | { if ((VP)->v_tag == VT_NON) \ | |
110 | PRINTIT("\tfs:%s id: %d v: 0x%x ", VTOVL(VP)->fs_mount->mnt_stat.f_fstypename, VTOVL(VP)->nodeID, (u_int)(VP)); \ | |
111 | else PRINTIT("\t%s v: 0x%x ", (VP)->v_mount->mnt_stat.f_fstypename, (u_int)(VP)); \ | |
112 | } else { PRINTIT("*** NULL NODE ***"); } } | |
113 | ||
114 | #else /* VOLFS_DEBUG */ | |
115 | #define DBG_VOP_TEST_LOCKS 0 | |
116 | #define DBG_FUNC_NAME(FSTR) | |
117 | #define DBG_PRINT_FUNC_NAME() | |
118 | #define DBG_VOP_PRINT_FUNCNAME() | |
119 | #define DBG_VOP_PRINT_CPN_INFO(CN) | |
120 | #define DBG_VOP(A) | |
121 | #define DBG_VOP_PRINT_VNODE_INFO(VP) | |
122 | #endif /* VOLFS_DEBUG */ | |
123 | ||
124 | ||
125 | #if DBG_VOP_TEST_LOCKS | |
126 | ||
127 | #define VOPDBG_IGNORE 0 | |
128 | #define VOPDBG_LOCKED 1 | |
129 | #define VOPDBG_UNLOCKED -1 | |
130 | #define VOPDBG_LOCKNOTNIL 2 | |
131 | #define VOPDBG_SAME 3 | |
132 | ||
133 | #define VOPDBG_ZERO 0 | |
134 | #define VOPDBG_POS 1 | |
135 | ||
136 | ||
137 | #define MAXDBGLOCKS 15 | |
138 | ||
139 | typedef struct VopDbgStoreRec { | |
140 | short id; | |
141 | struct vnode *vp; | |
142 | short inState; | |
143 | short outState; | |
144 | short errState; | |
145 | int inValue; | |
146 | int outValue; | |
147 | } VopDbgStoreRec; | |
148 | ||
149 | ||
150 | /* This sets up the test for the lock state of vnodes. The entry paramaters are: | |
151 | * I = index of paramater | |
152 | * VP = pointer to a vnode | |
153 | * ENTRYSTATE = the inState of the lock | |
154 | * EXITSTATE = the outState of the lock | |
155 | * ERRORSTATE = the error state of the lock | |
156 | * It initializes the structure, does some preliminary validity checks, but does nothing | |
157 | * if the instate is set to be ignored. | |
158 | */ | |
159 | ||
160 | #define DBG_VOP_LOCKS_DECL(I) VopDbgStoreRec VopDbgStore[I];short numOfLockSlots=I | |
161 | #define DBG_VOP_LOCKS_INIT(I,VP,ENTRYSTATE,EXITSTATE,ERRORSTATE,CHECKFLAG) \ | |
162 | if (I >= numOfLockSlots) { \ | |
163 | PRINTIT("%s: DBG_VOP_LOCKS_INIT: Entry #%d greater than allocated slots!\n", funcname, I); \ | |
164 | }; \ | |
165 | VopDbgStore[I].id = I; \ | |
166 | VopDbgStore[I].vp = (VP); \ | |
167 | VopDbgStore[I].inState = ENTRYSTATE; \ | |
168 | VopDbgStore[I].outState = EXITSTATE; \ | |
169 | VopDbgStore[I].errState = ERRORSTATE; \ | |
170 | VopDbgStore[I].inValue = 0; \ | |
171 | VopDbgStore[I].outValue = 0; \ | |
172 | if ((VopDbgStore[I].inState != VOPDBG_IGNORE)) { \ | |
173 | if ((VP) == NULL) \ | |
174 | PRINTIT ("%s: DBG_VOP_LOCK on start: Null vnode ptr\n", funcname); \ | |
175 | else \ | |
176 | VopDbgStore[I].inValue = lockstatus (&((struct volfs_vndata *)((VP)->v_data))->lock); \ | |
177 | } \ | |
178 | if ((VP) != NULL) \ | |
179 | { \ | |
180 | if (CHECKFLAG==VOPDBG_POS && (VP)->v_usecount <= 0) \ | |
181 | PRINTIT("%s: BAD USECOUNT OF %d !!!!\n", funcname, (VP)->v_usecount); \ | |
182 | else if ((VP)->v_usecount < 0) \ | |
183 | PRINTIT("%s: BAD USECOUNT OF %d !!!!\n", funcname, (VP)->v_usecount); \ | |
184 | } | |
185 | #define DBG_VOP_UPDATE_VP(I, VP) \ | |
186 | VopDbgStore[I].vp = (VP); | |
187 | ||
188 | ||
189 | #define DBG_VOP_LOCKS_TEST(status) DbgVopTest (numOfLockSlots, status, VopDbgStore, funcname); | |
190 | ||
191 | #else /*DBG_VOP_TEST_LOCKS */ | |
192 | #define DBG_VOP_LOCKS_DECL(A) | |
193 | #define DBG_VOP_LOCKS_INIT(A,B,C,D,E,F) | |
194 | #define DBG_VOP_LOCKS_TEST(a) | |
195 | #define DBG_VOP_UPDATE_VP(I, VP) | |
196 | ||
197 | #endif /* DBG_VOP_TEST_LOCKS */ | |
9bccf70c A |
198 | |
199 | #endif /* __APPLE_API_PRIVATE */ | |
200 | #endif /* __VOLFS_VOLFS_H__ */ |