|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
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.
11: *
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
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
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.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /* Copyright (c) 1998, Apple Computer, Inc. All rights reserved. */
23: /*
24: * Header file for volfs
25: */
26:
27: struct volfs_mntdata
28: {
29: struct vnode *volfs_rootvp;
30: LIST_HEAD(volfs_fsvnodelist, vnode) volfs_fsvnodes;
31: };
32:
33: /*
34: * Volfs vnodes exist only for the root, which allows for the enumeration
35: * of all volfs accessible filesystems, and for the filesystems which
36: * volfs handles.
37: */
38: #define VOLFS_ROOT 1 /* This volfs vnode represents root of volfs */
39: #define VOLFS_FSNODE 2 /* This volfs vnode represents a file system */
40:
41: struct volfs_vndata
42: {
43: int vnode_type;
44: struct lock__bsd__ lock;
45: unsigned int nodeID; /* the dev entry of a file system */
46: struct mount * fs_mount;
47: };
48:
49: /* Flag set for HFS volumes to indicate roman-only encoding: */
50: #define VOLFS_ROMANONLY 0x40000000
51:
52: /* Summary of all flags in volume id's exported to outside view: */
53: #define VOLFS_VOLIDFLAGS (VOLFS_ROMANONLY)
54:
55: #define MAXVLFSNAMLEN 24 /* max length is really 10, pad to 24 since
56: * some of the math depends on VLFSDIRENTLEN
57: * being a power of 2 */
58: #define VLFSDIRENTLEN (MAXVLFSNAMLEN + sizeof(u_int32_t) + sizeof(u_int16_t) + sizeof(u_int8_t) + sizeof(u_int8_t))
59:
60: #define ROOT_DIRID 2
61:
62: extern int (**volfs_vnodeop_p)();
63: __BEGIN_DECLS
64:
65: int volfs_mount __P((struct mount *, char *, caddr_t, struct nameidata *,
66: struct proc *));
67: int volfs_start __P((struct mount *, int, struct proc *));
68: int volfs_unmount __P((struct mount *, int, struct proc *));
69: int volfs_root __P((struct mount *, struct vnode **));
70: int volfs_quotactl __P((struct mount *, int, uid_t, caddr_t,
71: struct proc *));
72: int volfs_statfs __P((struct mount *, struct statfs *, struct proc *));
73: int volfs_sync __P((struct mount *, int, struct ucred *, struct proc *));
74: int volfs_vget __P((struct mount *, void *ino_t, struct vnode **));
75: int volfs_fhtovp __P((struct mount *, struct fid *, struct mbuf *,
76: struct vnode **, int *, struct ucred **));
77: int volfs_vptofh __P((struct vnode *, struct fid *));
78: int volfs_init __P((struct vfsconf *));
79: int volfs_sysctl __P((int *, u_int, void *, size_t *, void *, size_t,
80: struct proc *));
81:
82: int volfs_reclaim __P((struct vop_reclaim_args*));
83: int volfs_access __P((struct vop_access_args *));
84: int volfs_getattr __P((struct vop_getattr_args *));
85: int volfs_select __P((struct vop_select_args *));
86: int volfs_rmdir __P((struct vop_rmdir_args *));
87: int volfs_readdir __P((struct vop_readdir_args *));
88: int volfs_lock __P((struct vop_lock_args *));
89: int volfs_unlock __P((struct vop_unlock_args *));
90: int volfs_islocked __P((struct vop_islocked_args *));
91: int volfs_pathconf __P((struct vop_pathconf_args *));
92: int volfs_lookup __P((struct vop_lookup_args *));
93: __END_DECLS
94:
95: #define VTOVL(VP) ((struct volfs_vndata *)((VP)->v_data))
96:
97: #define PRINTIT kprintf
98:
99: #if VOLFS_DEBUG
100: #define DBG_VOP_TEST_LOCKS 1
101: #define DBG_FUNC_NAME(FSTR) static char *funcname = FSTR
102: #define DBG_PRINT_FUNC_NAME() PRINTIT("%s\n", funcname);
103: #define DBG_VOP_PRINT_FUNCNAME() PRINTIT("%s: ", funcname);
104: #define DBG_VOP_PRINT_CPN_INFO(CN) PRINTIT("name: %s",(CN)->cn_nameptr);
105: #define DBG_VOP(STR) PRINTIT STR;
106: #define DBG_VOP_PRINT_VNODE_INFO(VP) { if ((VP)) \
107: { if ((VP)->v_tag == VT_NON) \
108: PRINTIT("\tfs:%s id: %d v: 0x%x ", VTOVL(VP)->fs_mount->mnt_stat.f_fstypename, VTOVL(VP)->nodeID, (u_int)(VP)); \
109: else PRINTIT("\t%s v: 0x%x ", (VP)->v_mount->mnt_stat.f_fstypename, (u_int)(VP)); \
110: } else { PRINTIT("*** NULL NODE ***"); } }
111:
112: #else /* VOLFS_DEBUG */
113: #define DBG_VOP_TEST_LOCKS 0
114: #define DBG_FUNC_NAME(FSTR)
115: #define DBG_PRINT_FUNC_NAME()
116: #define DBG_VOP_PRINT_FUNCNAME()
117: #define DBG_VOP_PRINT_CPN_INFO(CN)
118: #define DBG_VOP(A)
119: #define DBG_VOP_PRINT_VNODE_INFO(VP)
120: #endif /* VOLFS_DEBUG */
121:
122:
123: #if DBG_VOP_TEST_LOCKS
124:
125: #define VOPDBG_IGNORE 0
126: #define VOPDBG_LOCKED 1
127: #define VOPDBG_UNLOCKED -1
128: #define VOPDBG_LOCKNOTNIL 2
129: #define VOPDBG_SAME 3
130:
131: #define VOPDBG_ZERO 0
132: #define VOPDBG_POS 1
133:
134:
135: #define MAXDBGLOCKS 15
136:
137: typedef struct VopDbgStoreRec {
138: short id;
139: struct vnode *vp;
140: short inState;
141: short outState;
142: short errState;
143: int inValue;
144: int outValue;
145: } VopDbgStoreRec;
146:
147:
148: /* This sets up the test for the lock state of vnodes. The entry paramaters are:
149: * I = index of paramater
150: * VP = pointer to a vnode
151: * ENTRYSTATE = the inState of the lock
152: * EXITSTATE = the outState of the lock
153: * ERRORSTATE = the error state of the lock
154: * It initializes the structure, does some preliminary validity checks, but does nothing
155: * if the instate is set to be ignored.
156: */
157:
158: #define DBG_VOP_LOCKS_DECL(I) VopDbgStoreRec VopDbgStore[I];short numOfLockSlots=I
159: #define DBG_VOP_LOCKS_INIT(I,VP,ENTRYSTATE,EXITSTATE,ERRORSTATE,CHECKFLAG) \
160: if (I >= numOfLockSlots) { \
161: PRINTIT("%s: DBG_VOP_LOCKS_INIT: Entry #%d greater than allocated slots!\n", funcname, I); \
162: }; \
163: VopDbgStore[I].id = I; \
164: VopDbgStore[I].vp = (VP); \
165: VopDbgStore[I].inState = ENTRYSTATE; \
166: VopDbgStore[I].outState = EXITSTATE; \
167: VopDbgStore[I].errState = ERRORSTATE; \
168: VopDbgStore[I].inValue = 0; \
169: VopDbgStore[I].outValue = 0; \
170: if ((VopDbgStore[I].inState != VOPDBG_IGNORE)) { \
171: if ((VP) == NULL) \
172: PRINTIT ("%s: DBG_VOP_LOCK on start: Null vnode ptr\n", funcname); \
173: else \
174: VopDbgStore[I].inValue = lockstatus (&((struct volfs_vndata *)((VP)->v_data))->lock); \
175: } \
176: if ((VP) != NULL) \
177: { \
178: if (CHECKFLAG==VOPDBG_POS && (VP)->v_usecount <= 0) \
179: PRINTIT("%s: BAD USECOUNT OF %d !!!!\n", funcname, (VP)->v_usecount); \
180: else if ((VP)->v_usecount < 0) \
181: PRINTIT("%s: BAD USECOUNT OF %d !!!!\n", funcname, (VP)->v_usecount); \
182: }
183: #define DBG_VOP_UPDATE_VP(I, VP) \
184: VopDbgStore[I].vp = (VP);
185:
186:
187: #define DBG_VOP_LOCKS_TEST(status) DbgVopTest (numOfLockSlots, status, VopDbgStore, funcname);
188:
189: #else /*DBG_VOP_TEST_LOCKS */
190: #define DBG_VOP_LOCKS_DECL(A)
191: #define DBG_VOP_LOCKS_INIT(A,B,C,D,E,F)
192: #define DBG_VOP_LOCKS_TEST(a)
193: #define DBG_VOP_UPDATE_VP(I, VP)
194:
195: #endif /* DBG_VOP_TEST_LOCKS */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.