1 | /* $NetBSD: cnode.h,v 1.20 2014/12/13 15:59:30 hannken Exp $ */ |
2 | |
3 | /* |
4 | * |
5 | * Coda: an Experimental Distributed File System |
6 | * Release 3.1 |
7 | * |
8 | * Copyright (c) 1987-1998 Carnegie Mellon University |
9 | * All Rights Reserved |
10 | * |
11 | * Permission to use, copy, modify and distribute this software and its |
12 | * documentation is hereby granted, provided that both the copyright |
13 | * notice and this permission notice appear in all copies of the |
14 | * software, derivative works or modified versions, and any portions |
15 | * thereof, and that both notices appear in supporting documentation, and |
16 | * that credit is given to Carnegie Mellon University in all documents |
17 | * and publicity pertaining to direct or indirect use of this code or its |
18 | * derivatives. |
19 | * |
20 | * CODA IS AN EXPERIMENTAL SOFTWARE SYSTEM AND IS KNOWN TO HAVE BUGS, |
21 | * SOME OF WHICH MAY HAVE SERIOUS CONSEQUENCES. CARNEGIE MELLON ALLOWS |
22 | * FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION. CARNEGIE MELLON |
23 | * DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER |
24 | * RESULTING DIRECTLY OR INDIRECTLY FROM THE USE OF THIS SOFTWARE OR OF |
25 | * ANY DERIVATIVE WORK. |
26 | * |
27 | * Carnegie Mellon encourages users of this software to return any |
28 | * improvements or extensions that they make, and to grant Carnegie |
29 | * Mellon the rights to redistribute these changes without encumbrance. |
30 | * |
31 | * @(#) coda/cnode.h,v 1.1.1.1 1998/08/29 21:26:46 rvb Exp $ |
32 | */ |
33 | |
34 | /* |
35 | * Mach Operating System |
36 | * Copyright (c) 1990 Carnegie-Mellon University |
37 | * Copyright (c) 1989 Carnegie-Mellon University |
38 | * All rights reserved. The CMU software License Agreement specifies |
39 | * the terms and conditions for use and redistribution. |
40 | */ |
41 | |
42 | /* |
43 | * This code was written for the Coda file system at Carnegie Mellon University. |
44 | * Contributers include David Steere, James Kistler, and M. Satyanarayanan. |
45 | */ |
46 | |
47 | #ifndef _CNODE_H_ |
48 | #define _CNODE_H_ |
49 | |
50 | #include <sys/vnode.h> |
51 | #ifdef _KERNEL |
52 | #include <sys/mallocvar.h> |
53 | |
54 | MALLOC_DECLARE(M_CODA); |
55 | #endif |
56 | |
57 | /* |
58 | * Cnode lookup stuff. |
59 | * NOTE: CODA_CACHESIZE must be a power of 2 for cfshash to work! |
60 | */ |
61 | #define CODA_CACHESIZE 512 |
62 | |
63 | #define CODA_ALLOC(ptr, cast, size) \ |
64 | do { \ |
65 | ptr = (cast)malloc((unsigned long) size, M_CODA, M_WAITOK); \ |
66 | if (ptr == 0) { \ |
67 | panic("kernel malloc returns 0 at %s:%d\n", __FILE__, __LINE__); \ |
68 | } \ |
69 | } while (/*CONSTCOND*/ 0) |
70 | |
71 | #define CODA_FREE(ptr, size) free((ptr), M_CODA) |
72 | |
73 | /* |
74 | * global cache state control |
75 | */ |
76 | extern int coda_nc_use; |
77 | |
78 | /* |
79 | * Used to select debugging statements throughout the cfs code. |
80 | */ |
81 | extern int codadebug; |
82 | extern int coda_nc_debug; |
83 | extern int coda_printf_delay; |
84 | extern int coda_vnop_print_entry; |
85 | extern int coda_psdev_print_entry; |
86 | extern int coda_vfsop_print_entry; |
87 | |
88 | #define CODADBGMSK(N) (1 << N) |
89 | #define CODADEBUG(N, STMT) { if (codadebug & CODADBGMSK(N)) { STMT } } |
90 | #define myprintf(args) \ |
91 | do { \ |
92 | if (coda_printf_delay) \ |
93 | DELAY(coda_printf_delay);\ |
94 | printf args ; \ |
95 | } while (/*CONSTCOND*/ 0) |
96 | |
97 | struct cnode { |
98 | struct vnode *c_vnode; |
99 | u_short c_flags; /* flags (see below) */ |
100 | CodaFid c_fid; /* file handle */ |
101 | struct vnode *c_ovp; /* open vnode pointer */ |
102 | u_short c_ocount; /* count of openers */ |
103 | u_short c_owrite; /* count of open for write */ |
104 | struct vattr c_vattr; /* attributes */ |
105 | char *c_symlink; /* pointer to symbolic link */ |
106 | u_short c_symlen; /* length of symbolic link */ |
107 | dev_t c_device; /* associated vnode device */ |
108 | ino_t c_inode; /* associated vnode inode */ |
109 | kmutex_t c_lock; |
110 | }; |
111 | #define VTOC(vp) ((struct cnode *)(vp)->v_data) |
112 | #define SET_VTOC(vp) ((vp)->v_data) |
113 | #define CTOV(cp) ((struct vnode *)((cp)->c_vnode)) |
114 | |
115 | /* flags */ |
116 | #define C_VATTR 0x01 /* Validity of vattr in the cnode */ |
117 | #define C_SYMLINK 0x02 /* Validity of symlink pointer in the Code */ |
118 | #define C_UNMOUNTING 0X20 /* Set if unmounting */ |
119 | #define C_PURGING 0x40 /* Set if purging a fid */ |
120 | |
121 | #define VALID_VATTR(cp) ((cp->c_flags) & C_VATTR) |
122 | #define VALID_SYMLINK(cp) ((cp->c_flags) & C_SYMLINK) |
123 | #define IS_UNMOUNTING(cp) ((cp)->c_flags & C_UNMOUNTING) |
124 | |
125 | struct vmsg; |
126 | |
127 | struct vcomm { |
128 | u_long vc_seq; |
129 | int vc_open; |
130 | struct selinfo vc_selproc; |
131 | TAILQ_HEAD(,vmsg) vc_requests; |
132 | TAILQ_HEAD(,vmsg) vc_replies; |
133 | }; |
134 | |
135 | #define VC_OPEN(vcp) ((vcp)->vc_open == 1) |
136 | #define MARK_VC_CLOSED(vcp) ((vcp)->vc_open = 0) |
137 | #define MARK_VC_OPEN(vcp) ((vcp)->vc_open = 1) |
138 | |
139 | struct coda_clstat { |
140 | int ncalls; /* client requests */ |
141 | int nbadcalls; /* upcall failures */ |
142 | int reqs[CODA_NCALLS]; /* count of each request */ |
143 | }; |
144 | extern struct coda_clstat coda_clstat; |
145 | |
146 | /* |
147 | * CODA structure to hold mount/file system information |
148 | */ |
149 | struct coda_mntinfo { |
150 | struct vnode *mi_rootvp; |
151 | struct mount *mi_vfsp; |
152 | struct vcomm mi_vcomm; |
153 | int mi_started; |
154 | }; |
155 | extern struct coda_mntinfo coda_mnttbl[]; /* indexed by minor device number */ |
156 | |
157 | /* |
158 | * vfs pointer to mount info |
159 | */ |
160 | #define vftomi(vfsp) ((struct coda_mntinfo *)(vfsp->mnt_data)) |
161 | #define CODA_MOUNTED(vfsp) ((vftomi(vfsp) != (struct coda_mntinfo *)0) \ |
162 | && (vftomi(vfsp)->mi_started)) |
163 | |
164 | /* |
165 | * vnode pointer to mount info |
166 | */ |
167 | #define vtomi(vp) ((struct coda_mntinfo *)(vp->v_mount->mnt_data)) |
168 | |
169 | /* |
170 | * Used for identifying usage of "Control" object |
171 | */ |
172 | extern struct vnode *coda_ctlvp; |
173 | #define IS_CTL_VP(vp) ((vp) == coda_ctlvp) |
174 | #define IS_CTL_NAME(vp, name, l)((l == CODA_CONTROLLEN) \ |
175 | && ((vp) == vtomi((vp))->mi_rootvp) \ |
176 | && strncmp(name, CODA_CONTROL, l) == 0) |
177 | |
178 | /* |
179 | * An enum to tell us whether something that will remove a reference |
180 | * to a cnode was a downcall or not |
181 | */ |
182 | enum dc_status { |
183 | IS_DOWNCALL = 6, |
184 | NOT_DOWNCALL = 7 |
185 | }; |
186 | |
187 | /* cfs_psdev.h */ |
188 | extern int coda_call(struct coda_mntinfo *, int, int *, void *); |
189 | extern int coda_kernel_version; |
190 | |
191 | /* cfs_subr.h */ |
192 | extern int handleDownCall(int, union outputArgs *); |
193 | extern void coda_unmounting(struct mount *); |
194 | extern int coda_vmflush(struct cnode *); |
195 | |
196 | /* cfs_vnodeops.h */ |
197 | extern struct cnode *make_coda_node(CodaFid *, struct mount *, short); |
198 | extern int coda_vnodeopstats_init(void); |
199 | |
200 | /* coda_vfsops.h */ |
201 | extern struct mount *devtomp(dev_t); |
202 | |
203 | /* sigh */ |
204 | #define CODA_RDWR ((u_long) 31) |
205 | |
206 | #endif /* _CNODE_H_ */ |
207 | |
208 | |