xref: /illumos-gate/usr/src/uts/common/sys/ctfs_impl.h (revision dd72704bd9e794056c558153663c739e2012d721)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_SYS_CTFS_IMPL_H
27 #define	_SYS_CTFS_IMPL_H
28 
29 #include <sys/contract.h>
30 #include <sys/gfs.h>
31 
32 #ifdef	__cplusplus
33 extern "C" {
34 #endif
35 
36 /*
37  * Inode numbers
38  */
39 
40 /*
41  * Root inode:
42  * ---------------------------------------------------
43  * |                       0                         |
44  * ---------------------------------------------------
45  * 63						     0
46  */
47 
48 #define	CTFS_INO_ROOT 0
49 
50 /*
51  * Contract-specific file:
52  * ---------------------------------------------------
53  * |1|    file (62:32)     |   contract id (31:0)    |
54  * ---------------------------------------------------
55  * 63						     0
56  *	file = 0 : directory
57  *	file = 1 : "all" directory symlink
58  *	file > 1 : special files ("ctl", "status", etc.)
59  */
60 
61 #define	CTFS_INO_CT_SHIFT	32
62 #define	CTFS_INO_CT(ctid, file)	\
63 	((1ULL << 63) | \
64 	((unsigned long long)(file) << CTFS_INO_CT_SHIFT) | \
65 	(ctid))
66 #define	CTFS_INO_CT_DIR(ctid)		CTFS_INO_CT((ctid), 0)
67 #define	CTFS_INO_CT_LINK(ctid)		CTFS_INO_CT((ctid), 1)
68 #define	CTFS_INO_CT_FILE(ctid, file)	CTFS_INO_CT((ctid), (file) + 2)
69 
70 /*
71  * Type-specific file:
72  * ---------------------------------------------------
73  * |          0         | type (31:16) | file (15:0) |
74  * ---------------------------------------------------
75  * 63						     0
76  *	type = 0 : invalid
77  *	type > 0 : contract type index + 1 ("all" is #types + 1)
78  *	file = 0 : directory
79  *	file > 0 : special files ("template", "latest", etc.)
80  */
81 
82 #define	CTFS_INO_TYPE_SHIFT	16
83 #define	CTFS_INO_TYPE(type, file)	\
84 	(((type) + 1) << CTFS_INO_TYPE_SHIFT | (file))
85 #define	CTFS_INO_TYPE_DIR(type)		CTFS_INO_TYPE((type), 0)
86 #define	CTFS_INO_TYPE_FILE(type, file)	CTFS_INO_TYPE((type), (file) + 1)
87 
88 /*
89  * Other constants
90  */
91 #define	CTFS_NAME_MAX		32
92 
93 /*
94  * Possible values for ctfs_endpt_flags, below.
95  */
96 #define	CTFS_ENDPT_SETUP	0x1
97 #define	CTFS_ENDPT_NBLOCK	0x2
98 
99 /*
100  * Common endpoint object.
101  */
102 typedef struct ctfs_endpoint {
103 	kmutex_t	ctfs_endpt_lock;
104 	ct_listener_t	ctfs_endpt_listener;
105 	uint_t		ctfs_endpt_flags;
106 } ctfs_endpoint_t;
107 
108 /*
109  * root directory data
110  */
111 typedef gfs_dir_t	ctfs_rootnode_t;
112 
113 /*
114  * /all directory data
115  */
116 typedef gfs_dir_t	ctfs_adirnode_t;
117 
118 /*
119  * /all symlink data
120  */
121 typedef struct ctfs_symnode {
122 	gfs_file_t	ctfs_sn_file;		/* gfs file */
123 	contract_t	*ctfs_sn_contract;	/* target contract */
124 	char		*ctfs_sn_string;	/* target path */
125 	size_t		ctfs_sn_size;		/* length of target path */
126 } ctfs_symnode_t;
127 
128 /*
129  * contract type directory data
130  */
131 typedef	gfs_dir_t	ctfs_tdirnode_t;
132 
133 /*
134  * contract directory data
135  */
136 typedef struct ctfs_cdirnode {
137 	gfs_dir_t	ctfs_cn_dir;		/* directory contents */
138 	contract_t	*ctfs_cn_contract;	/* contract pointer */
139 	contract_vnode_t ctfs_cn_linkage;	/* contract vnode list node */
140 } ctfs_cdirnode_t;
141 
142 /*
143  * template file data
144  */
145 typedef struct ctfs_tmplnode {
146 	gfs_file_t	ctfs_tmn_file;		/* gfs file */
147 	ct_template_t	*ctfs_tmn_tmpl;		/* template pointer */
148 } ctfs_tmplnode_t;
149 
150 /*
151  * ctl and status file data
152  */
153 typedef struct ctfs_ctlnode {
154 	gfs_file_t	ctfs_ctl_file;		/* gfs file */
155 	contract_t	*ctfs_ctl_contract;	/* contract pointer */
156 } ctfs_ctlnode_t;
157 
158 /*
159  * latest file data
160  */
161 typedef gfs_dir_t	ctfs_latenode_t;
162 
163 /*
164  * events file data
165  */
166 typedef struct ctfs_evnode {
167 	gfs_file_t	ctfs_ev_file;		/* gfs file */
168 	contract_t	*ctfs_ev_contract;	/* contract we're watching */
169 	ctfs_endpoint_t	ctfs_ev_listener;	/* common endpoint data */
170 } ctfs_evnode_t;
171 
172 /*
173  * bundle and pbundle file data
174  */
175 typedef struct ctfs_bunode {
176 	gfs_file_t	ctfs_bu_file;		/* gfs file */
177 	ct_equeue_t	*ctfs_bu_queue;		/* queue we're watching */
178 	ctfs_endpoint_t	ctfs_bu_listener;	/* common endpoint data */
179 } ctfs_bunode_t;
180 
181 /*
182  * VFS data object
183  */
184 typedef struct ctfs_vfs {
185 	vnode_t	*ctvfs_root;		/* root vnode pointer */
186 } ctfs_vfs_t;
187 
188 /*
189  * vnode creation routines
190  */
191 extern vnode_t *ctfs_create_tdirnode(vnode_t *);
192 extern vnode_t *ctfs_create_tmplnode(vnode_t *);
193 extern vnode_t *ctfs_create_latenode(vnode_t *);
194 extern vnode_t *ctfs_create_pbundle(vnode_t *);
195 extern vnode_t *ctfs_create_bundle(vnode_t *);
196 extern vnode_t *ctfs_create_ctlnode(vnode_t *);
197 extern vnode_t *ctfs_create_statnode(vnode_t *);
198 extern vnode_t *ctfs_create_evnode(vnode_t *);
199 extern vnode_t *ctfs_create_adirnode(vnode_t *);
200 extern vnode_t *ctfs_create_cdirnode(vnode_t *, contract_t *);
201 extern vnode_t *ctfs_create_symnode(vnode_t *, contract_t *);
202 
203 /*
204  * common ctfs routines
205  */
206 extern void ctfs_common_getattr(vnode_t *, vattr_t *);
207 extern int ctfs_close(vnode_t *, int, int, offset_t, cred_t *,
208 		caller_context_t *);
209 extern int ctfs_access_dir(vnode_t *, int, int, cred_t *,
210 		caller_context_t *);
211 extern int ctfs_access_readonly(vnode_t *, int, int, cred_t *,
212 		caller_context_t *);
213 extern int ctfs_access_readwrite(vnode_t *, int, int, cred_t *,
214 		caller_context_t *);
215 extern int ctfs_open(vnode_t **, int, cred_t *,
216 		caller_context_t *);
217 
218 /*
219  * vnode ops vector templates
220  */
221 extern vnodeops_t *ctfs_ops_root;
222 extern vnodeops_t *ctfs_ops_adir;
223 extern vnodeops_t *ctfs_ops_sym;
224 extern vnodeops_t *ctfs_ops_tdir;
225 extern vnodeops_t *ctfs_ops_tmpl;
226 extern vnodeops_t *ctfs_ops_cdir;
227 extern vnodeops_t *ctfs_ops_ctl;
228 extern vnodeops_t *ctfs_ops_stat;
229 extern vnodeops_t *ctfs_ops_event;
230 extern vnodeops_t *ctfs_ops_bundle;
231 extern vnodeops_t *ctfs_ops_latest;
232 
233 #ifdef	__cplusplus
234 }
235 #endif
236 
237 #endif	/* _SYS_CTFS_IMPL_H */
238