xref: /titanic_52/usr/src/uts/common/sys/gfs.h (revision ea8dc4b6d2251b437950c0056bc626b311c73c27)
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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _SYS_GFS_H
28 #define	_SYS_GFS_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #include <sys/types.h>
33 #include <sys/vnode.h>
34 #include <sys/mutex.h>
35 #include <sys/dirent.h>
36 #include <sys/uio.h>
37 #include <sys/list.h>
38 #include <sys/pathname.h>
39 
40 #ifdef	__cplusplus
41 extern "C" {
42 #endif
43 
44 typedef struct gfs_opsvec {
45 	const char		*gfsv_name;	/* vnode description */
46 	const fs_operation_def_t *gfsv_template; /* ops template */
47 	vnodeops_t		**gfsv_ops;	/* ptr to result */
48 } gfs_opsvec_t;
49 
50 int gfs_make_opsvec(gfs_opsvec_t *);
51 
52 #define	GFS_CACHE_VNODE		0x1
53 
54 typedef struct gfs_dirent {
55 	char			*gfse_name;	/* entry name */
56 	vnode_t *(*gfse_ctor)(vnode_t *);	/* constructor */
57 	int			gfse_flags;	/* flags */
58 	list_node_t		gfse_link;	/* dynamic list */
59 	vnode_t			*gfse_vnode;	/* cached vnode */
60 } gfs_dirent_t;
61 
62 typedef enum gfs_type {
63 	GFS_DIR,
64 	GFS_FILE
65 } gfs_type_t;
66 
67 typedef struct gfs_file {
68 	vnode_t		*gfs_vnode;	/* current vnode */
69 	vnode_t		*gfs_parent;	/* parent vnode */
70 	size_t		gfs_size;	/* size of private data structure */
71 	gfs_type_t	gfs_type;	/* type of vnode */
72 	int		gfs_index;	/* index in parent dir */
73 	ino64_t		gfs_ino;	/* inode for this vnode */
74 } gfs_file_t;
75 
76 typedef int (*gfs_readdir_cb)(vnode_t *, struct dirent64 *, int *, offset_t *,
77     offset_t *, void *);
78 typedef int (*gfs_lookup_cb)(vnode_t *, const char *, vnode_t **, ino64_t *);
79 typedef ino64_t (*gfs_inode_cb)(vnode_t *, int);
80 
81 typedef struct gfs_dir {
82 	gfs_file_t	gfsd_file;	/* generic file attributes */
83 	gfs_dirent_t	*gfsd_static;	/* statically defined entries */
84 	int		gfsd_nstatic;	/* # static entries */
85 	kmutex_t	gfsd_lock;	/* protects entries */
86 	int		gfsd_maxlen;	/* maximum name length */
87 	gfs_readdir_cb	gfsd_readdir;	/* readdir() callback */
88 	gfs_lookup_cb	gfsd_lookup;	/* lookup() callback */
89 	gfs_inode_cb	gfsd_inode;	/* get an inode number */
90 } gfs_dir_t;
91 
92 struct vfs;
93 
94 extern vnode_t *gfs_file_create(size_t, vnode_t *, vnodeops_t *);
95 extern vnode_t *gfs_dir_create(size_t, vnode_t *, vnodeops_t *,
96     gfs_dirent_t *, gfs_inode_cb, int, gfs_readdir_cb, gfs_lookup_cb);
97 extern vnode_t *gfs_root_create(size_t, struct vfs *, vnodeops_t *, ino64_t,
98     gfs_dirent_t *, gfs_inode_cb, int, gfs_readdir_cb, gfs_lookup_cb);
99 
100 extern void *gfs_file_inactive(vnode_t *);
101 extern void *gfs_dir_inactive(vnode_t *);
102 
103 extern int gfs_dir_lookup(vnode_t *, const char *, vnode_t **);
104 extern int gfs_dir_readdir(vnode_t *, uio_t *, int *, void *);
105 
106 #define	gfs_dir_lock(gd)	mutex_enter(&(gd)->gfsd_lock)
107 #define	gfs_dir_unlock(gd)	mutex_exit(&(gd)->gfsd_lock)
108 
109 #define	gfs_file_parent(vp)	(((gfs_file_t *)(vp)->v_data)->gfs_parent)
110 
111 #define	gfs_file_index(vp)	(((gfs_file_t *)(vp)->v_data)->gfs_index)
112 #define	gfs_file_set_index(vp, idx)	\
113 	(((gfs_file_t *)(vp)->v_data)->gfs_index = (idx))
114 
115 #define	gfs_file_inode(vp)	(((gfs_file_t *)(vp)->v_data)->gfs_ino)
116 #define	gfs_file_set_inode(vp, ino)	\
117 	(((gfs_file_t *)(vp)->v_data)->gfs_ino = (ino))
118 
119 typedef struct gfs_readdir_state {
120 	struct dirent64 *grd_dirent;	/* directory entry buffer */
121 	size_t		grd_namlen;	/* max file name length */
122 	size_t		grd_ureclen;	/* exported record size */
123 	ssize_t		grd_oresid;	/* original uio_resid */
124 	ino64_t		grd_parent;	/* inode of parent */
125 	ino64_t		grd_self;	/* inode of self */
126 } gfs_readdir_state_t;
127 
128 extern int gfs_readdir_init(gfs_readdir_state_t *, int, int, uio_t *, ino64_t,
129     ino64_t);
130 extern int gfs_readdir_emit(gfs_readdir_state_t *, uio_t *, offset_t, ino64_t,
131     const char *);
132 extern int gfs_readdir_emitn(gfs_readdir_state_t *, uio_t *, offset_t, ino64_t,
133     unsigned long);
134 extern int gfs_readdir_pred(gfs_readdir_state_t *, uio_t *, offset_t *);
135 extern int gfs_readdir_fini(gfs_readdir_state_t *, int, int *, int);
136 
137 extern int gfs_lookup_dot(vnode_t **, vnode_t *, vnode_t *, const char *);
138 
139 extern int gfs_vop_lookup(vnode_t *, char *, vnode_t **, pathname_t *,
140     int, vnode_t *, cred_t *);
141 extern int gfs_vop_readdir(vnode_t *, uio_t *, cred_t *, int *);
142 extern int gfs_vop_map(vnode_t *, offset_t, struct as *, caddr_t *,
143     size_t, uchar_t, uchar_t, uint_t, cred_t *);
144 extern void gfs_vop_inactive(vnode_t *, cred_t *);
145 
146 
147 #ifdef	__cplusplus
148 }
149 #endif
150 
151 #endif	/* _SYS_GFS_H */
152