Home | History | Annotate | Download | only in sys
      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 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     30 
     31 #include <sys/contract.h>
     32 #include <sys/gfs.h>
     33 
     34 #ifdef	__cplusplus
     35 extern "C" {
     36 #endif
     37 
     38 /*
     39  * Inode numbers
     40  */
     41 
     42 /*
     43  * Root inode:
     44  * ---------------------------------------------------
     45  * |                       0                         |
     46  * ---------------------------------------------------
     47  * 63						     0
     48  */
     49 
     50 #define	CTFS_INO_ROOT 0
     51 
     52 /*
     53  * Contract-specific file:
     54  * ---------------------------------------------------
     55  * |1|    file (62:32)     |   contract id (31:0)    |
     56  * ---------------------------------------------------
     57  * 63						     0
     58  *	file = 0 : directory
     59  *	file = 1 : "all" directory symlink
     60  *	file > 1 : special files ("ctl", "status", etc.)
     61  */
     62 
     63 #define	CTFS_INO_CT_SHIFT	32
     64 #define	CTFS_INO_CT(ctid, file)	\
     65 	((1ULL << 63) | \
     66 	((unsigned long long)(file) << CTFS_INO_CT_SHIFT) | \
     67 	(ctid))
     68 #define	CTFS_INO_CT_DIR(ctid)		CTFS_INO_CT((ctid), 0)
     69 #define	CTFS_INO_CT_LINK(ctid)		CTFS_INO_CT((ctid), 1)
     70 #define	CTFS_INO_CT_FILE(ctid, file)	CTFS_INO_CT((ctid), (file) + 2)
     71 
     72 /*
     73  * Type-specific file:
     74  * ---------------------------------------------------
     75  * |          0         | type (31:16) | file (15:0) |
     76  * ---------------------------------------------------
     77  * 63						     0
     78  *	type = 0 : invalid
     79  *	type > 0 : contract type index + 1 ("all" is #types + 1)
     80  *	file = 0 : directory
     81  *	file > 0 : special files ("template", "latest", etc.)
     82  */
     83 
     84 #define	CTFS_INO_TYPE_SHIFT	16
     85 #define	CTFS_INO_TYPE(type, file)	\
     86 	(((type) + 1) << CTFS_INO_TYPE_SHIFT | (file))
     87 #define	CTFS_INO_TYPE_DIR(type)		CTFS_INO_TYPE((type), 0)
     88 #define	CTFS_INO_TYPE_FILE(type, file)	CTFS_INO_TYPE((type), (file) + 1)
     89 
     90 /*
     91  * Other constants
     92  */
     93 #define	CTFS_NAME_MAX		32
     94 
     95 /*
     96  * Possible values for ctfs_endpt_flags, below.
     97  */
     98 #define	CTFS_ENDPT_SETUP	0x1
     99 #define	CTFS_ENDPT_NBLOCK	0x2
    100 
    101 /*
    102  * Common endpoint object.
    103  */
    104 typedef struct ctfs_endpoint {
    105 	kmutex_t	ctfs_endpt_lock;
    106 	ct_listener_t	ctfs_endpt_listener;
    107 	uint_t		ctfs_endpt_flags;
    108 } ctfs_endpoint_t;
    109 
    110 /*
    111  * root directory data
    112  */
    113 typedef gfs_dir_t	ctfs_rootnode_t;
    114 
    115 /*
    116  * /all directory data
    117  */
    118 typedef gfs_dir_t	ctfs_adirnode_t;
    119 
    120 /*
    121  * /all symlink data
    122  */
    123 typedef struct ctfs_symnode {
    124 	gfs_file_t	ctfs_sn_file;		/* gfs file */
    125 	contract_t	*ctfs_sn_contract;	/* target contract */
    126 	char		*ctfs_sn_string;	/* target path */
    127 	size_t		ctfs_sn_size;		/* length of target path */
    128 } ctfs_symnode_t;
    129 
    130 /*
    131  * contract type directory data
    132  */
    133 typedef	gfs_dir_t	ctfs_tdirnode_t;
    134 
    135 /*
    136  * contract directory data
    137  */
    138 typedef struct ctfs_cdirnode {
    139 	gfs_dir_t	ctfs_cn_dir;		/* directory contents */
    140 	contract_t	*ctfs_cn_contract;	/* contract pointer */
    141 	contract_vnode_t ctfs_cn_linkage;	/* contract vnode list node */
    142 } ctfs_cdirnode_t;
    143 
    144 /*
    145  * template file data
    146  */
    147 typedef struct ctfs_tmplnode {
    148 	gfs_file_t	ctfs_tmn_file;		/* gfs file */
    149 	ct_template_t	*ctfs_tmn_tmpl;		/* template pointer */
    150 } ctfs_tmplnode_t;
    151 
    152 /*
    153  * ctl and status file data
    154  */
    155 typedef struct ctfs_ctlnode {
    156 	gfs_file_t	ctfs_ctl_file;		/* gfs file */
    157 	contract_t	*ctfs_ctl_contract;	/* contract pointer */
    158 } ctfs_ctlnode_t;
    159 
    160 /*
    161  * latest file data
    162  */
    163 typedef gfs_dir_t	ctfs_latenode_t;
    164 
    165 /*
    166  * events file data
    167  */
    168 typedef struct ctfs_evnode {
    169 	gfs_file_t	ctfs_ev_file;		/* gfs file */
    170 	contract_t	*ctfs_ev_contract;	/* contract we're watching */
    171 	ctfs_endpoint_t	ctfs_ev_listener;	/* common endpoint data */
    172 } ctfs_evnode_t;
    173 
    174 /*
    175  * bundle and pbundle file data
    176  */
    177 typedef struct ctfs_bunode {
    178 	gfs_file_t	ctfs_bu_file;		/* gfs file */
    179 	ct_equeue_t	*ctfs_bu_queue;		/* queue we're watching */
    180 	ctfs_endpoint_t	ctfs_bu_listener;	/* common endpoint data */
    181 } ctfs_bunode_t;
    182 
    183 /*
    184  * VFS data object
    185  */
    186 typedef struct ctfs_vfs {
    187 	vnode_t	*ctvfs_root;		/* root vnode pointer */
    188 } ctfs_vfs_t;
    189 
    190 /*
    191  * vnode creation routines
    192  */
    193 extern vnode_t *ctfs_create_tdirnode(vnode_t *);
    194 extern vnode_t *ctfs_create_tmplnode(vnode_t *);
    195 extern vnode_t *ctfs_create_latenode(vnode_t *);
    196 extern vnode_t *ctfs_create_pbundle(vnode_t *);
    197 extern vnode_t *ctfs_create_bundle(vnode_t *);
    198 extern vnode_t *ctfs_create_ctlnode(vnode_t *);
    199 extern vnode_t *ctfs_create_statnode(vnode_t *);
    200 extern vnode_t *ctfs_create_evnode(vnode_t *);
    201 extern vnode_t *ctfs_create_adirnode(vnode_t *);
    202 extern vnode_t *ctfs_create_cdirnode(vnode_t *, contract_t *);
    203 extern vnode_t *ctfs_create_symnode(vnode_t *, contract_t *);
    204 
    205 /*
    206  * common ctfs routines
    207  */
    208 extern void ctfs_common_getattr(vnode_t *, vattr_t *);
    209 extern int ctfs_close(vnode_t *, int, int, offset_t, cred_t *,
    210 		caller_context_t *);
    211 extern int ctfs_access_dir(vnode_t *, int, int, cred_t *,
    212 		caller_context_t *);
    213 extern int ctfs_access_readonly(vnode_t *, int, int, cred_t *,
    214 		caller_context_t *);
    215 extern int ctfs_access_readwrite(vnode_t *, int, int, cred_t *,
    216 		caller_context_t *);
    217 extern int ctfs_open(vnode_t **, int, cred_t *,
    218 		caller_context_t *);
    219 
    220 /*
    221  * vnode ops vector templates
    222  */
    223 extern vnodeops_t *ctfs_ops_root;
    224 extern vnodeops_t *ctfs_ops_adir;
    225 extern vnodeops_t *ctfs_ops_sym;
    226 extern vnodeops_t *ctfs_ops_tdir;
    227 extern vnodeops_t *ctfs_ops_tmpl;
    228 extern vnodeops_t *ctfs_ops_cdir;
    229 extern vnodeops_t *ctfs_ops_ctl;
    230 extern vnodeops_t *ctfs_ops_stat;
    231 extern vnodeops_t *ctfs_ops_event;
    232 extern vnodeops_t *ctfs_ops_bundle;
    233 extern vnodeops_t *ctfs_ops_latest;
    234 
    235 #ifdef	__cplusplus
    236 }
    237 #endif
    238 
    239 #endif	/* _SYS_CTFS_IMPL_H */
    240