Annotation of src/sys/fs/puffs/puffs_sys.h, Revision 1.9.2.4
1.9.2.4 ! ad 1: /* $NetBSD: puffs_sys.h,v 1.9.2.3 2007/02/01 08:48:33 ad Exp $ */
1.9.2.2 ad 2:
3: /*
4: * Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved.
5: *
6: * Development of this software was supported by the
7: * Google Summer of Code program and the Ulla Tuominen Foundation.
8: * The Google SoC project was mentored by Bill Studenmund.
9: *
10: * Redistribution and use in source and binary forms, with or without
11: * modification, are permitted provided that the following conditions
12: * are met:
13: * 1. Redistributions of source code must retain the above copyright
14: * notice, this list of conditions and the following disclaimer.
15: * 2. Redistributions in binary form must reproduce the above copyright
16: * notice, this list of conditions and the following disclaimer in the
17: * documentation and/or other materials provided with the distribution.
18: * 3. The name of the company nor the name of the author may be used to
19: * endorse or promote products derived from this software without specific
20: * prior written permission.
21: *
22: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
23: * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25: * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32: * SUCH DAMAGE.
33: */
34:
35: #ifndef _PUFFS_SYS_H_
36: #define _PUFFS_SYS_H_
37:
38: #include <sys/param.h>
39: #include <sys/select.h>
40: #include <sys/kauth.h>
41: #include <sys/lock.h>
42: #include <sys/queue.h>
43: #include <sys/pool.h>
44:
45: #include <fs/puffs/puffs_msgif.h>
46:
47: #include <miscfs/genfs/genfs_node.h>
48:
49: extern int (**puffs_vnodeop_p)(void *);
50: extern int (**puffs_specop_p)(void *);
51: extern int (**puffs_fifoop_p)(void *);
52:
53: extern const struct vnodeopv_desc puffs_vnodeop_opv_desc;
54: extern const struct vnodeopv_desc puffs_specop_opv_desc;
55: extern const struct vnodeopv_desc puffs_fifoop_opv_desc;
1.9.2.3 ad 56: extern const struct vnodeopv_desc puffs_msgop_opv_desc;
1.9.2.2 ad 57:
58: extern struct pool puffs_pnpool;
59:
1.9.2.3 ad 60: #define PUFFS_NAMEPREFIX "puffs:"
61:
1.9.2.2 ad 62: /*
63: * While a request is going to userspace, park the caller within the
64: * kernel. This is the kernel counterpart of "struct puffs_req".
65: */
66: struct puffs_park {
1.9.2.3 ad 67: struct puffs_req *park_preq; /* req followed by buf */
68: size_t park_copylen; /* userspace copylength */
1.9.2.2 ad 69:
1.9.2.3 ad 70: size_t park_maxlen; /* max size, only for "adj" */
71: /* ^ XXX: overloaded */
1.9.2.2 ad 72:
73: TAILQ_ENTRY(puffs_park) park_entries;
74: };
75:
76: #define PUFFS_SIZEOPREQ_UIO_IN 1
77: #define PUFFS_SIZEOPREQ_UIO_OUT 2
78: #define PUFFS_SIZEOPREQ_BUF_IN 3
79: #define PUFFS_SIZEOPREQ_BUF_OUT 4
80:
81: #define PUFFS_SIZEOP_UIO(a) \
82: (((a)==PUFFS_SIZEOPREQ_UIO_IN)||(a)==PUFFS_SIZEOPREQ_UIO_OUT)
83: #define PUFFS_SIZEOP_BUF(a) \
84: (((a)==PUFFS_SIZEOPREQ_BUF_IN)||(a)==PUFFS_SIZEOPREQ_BUF_OUT)
85:
86: /* XXX: alignment-optimization */
87: struct puffs_sizepark {
88: uint64_t pkso_reqid;
89: uint8_t pkso_reqtype;
90:
91: struct uio *pkso_uio;
92: void *pkso_copybuf;
93: size_t pkso_bufsize;
94:
95: TAILQ_ENTRY(puffs_sizepark) pkso_entries;
96: };
97:
1.9.2.3 ad 98: #ifdef DEBUG
99: extern int puffsdebug; /* puffs_subr.c */
100: #define DPRINTF(x) if (puffsdebug > 0) printf x
101: #define DPRINTF_VERBOSE(x) if (puffsdebug > 1) printf x
102: #else
1.9.2.2 ad 103: #define DPRINTF(x)
1.9.2.3 ad 104: #define DPRINTF_VERBOSE(x)
105: #endif
1.9.2.2 ad 106:
107: #define MPTOPUFFSMP(mp) ((struct puffs_mount *)((mp)->mnt_data))
108: #define PMPTOMP(pmp) (pmp->pmp_mp)
109: #define VPTOPP(vp) ((struct puffs_node *)(vp)->v_data)
110: #define VPTOPNC(vp) (((struct puffs_node *)(vp)->v_data)->pn_cookie)
111: #define VPTOPUFFSMP(vp) ((struct puffs_mount*)((struct puffs_node*)vp->v_data))
112: #define FPTOPMP(fp) (((struct puffs_instance *)fp->f_data)->pi_pmp)
113: #define FPTOPI(fp) ((struct puffs_instance *)fp->f_data)
114:
1.9.2.3 ad 115: #define EXISTSOP(pmp, op) \
116: (((pmp)->pmp_flags&PUFFS_KFLAG_ALLOPS) || ((pmp)->pmp_vnopmask[PUFFS_VN_##op]))
117:
118: #define PUFFS_DOCACHE(pmp) (((pmp)->pmp_flags & PUFFS_KFLAG_NOCACHE) == 0)
119:
1.9.2.2 ad 120: TAILQ_HEAD(puffs_wq, puffs_park);
1.9.2.4 ! ad 121: LIST_HEAD(puffs_node_hashlist, puffs_node);
1.9.2.2 ad 122: struct puffs_mount {
123: struct simplelock pmp_lock;
124:
125: struct puffs_args pmp_args;
1.9.2.3 ad 126: #define pmp_flags pmp_args.pa_flags
127: #define pmp_vnopmask pmp_args.pa_vnopmask
1.9.2.2 ad 128:
129: struct puffs_wq pmp_req_touser;
130: size_t pmp_req_touser_waiters;
131: size_t pmp_req_maxsize;
132:
133: struct puffs_wq pmp_req_replywait;
134: TAILQ_HEAD(, puffs_sizepark) pmp_req_sizepark;
135:
1.9.2.4 ! ad 136: struct puffs_node_hashlist *pmp_pnodehash;
! 137: size_t pmp_npnodehash;
1.9.2.2 ad 138:
139: struct mount *pmp_mp;
140: struct vnode *pmp_root;
141: void *pmp_rootcookie;
142: struct selinfo *pmp_sel; /* in puffs_instance */
143:
1.9.2.4 ! ad 144: uint64_t pmp_nextreq;
1.9.2.2 ad 145: uint8_t pmp_status;
1.9.2.3 ad 146: uint8_t pmp_unmounting;
1.9.2.4 ! ad 147: uint8_t pmp_suspend;
1.9.2.2 ad 148: };
1.9.2.3 ad 149:
1.9.2.2 ad 150: #define PUFFSTAT_BEFOREINIT 0
151: #define PUFFSTAT_MOUNTING 1
152: #define PUFFSTAT_RUNNING 2
1.9.2.3 ad 153: #define PUFFSTAT_DYING 3 /* Do you want your possessions identified? */
1.9.2.2 ad 154:
1.9.2.4 ! ad 155: #define PNODE_NOREFS 0x01 /* vnode inactive, no backend reference */
! 156: #define PNODE_SUSPEND 0x02 /* issue all operations as FAF */
! 157: #if 0
! 158: #define PNODE_LOCKED 0x0
! 159: #define PNODE_WANTED 0x0
! 160: #endif
1.9.2.2 ad 161: struct puffs_node {
162: struct genfs_node pn_gnode; /* genfs glue */
163:
164: void *pn_cookie; /* userspace pnode cookie */
165: struct vnode *pn_vp; /* backpointer to vnode */
166: uint32_t pn_stat; /* node status */
167:
1.9.2.4 ! ad 168: LIST_ENTRY(puffs_node) pn_hashent;
1.9.2.2 ad 169: };
170:
171: int puffs_start2(struct puffs_mount *, struct puffs_startreq *);
172:
173: int puffs_vfstouser(struct puffs_mount *, int, void *, size_t);
1.9.2.4 ! ad 174: void puffs_suspendtouser(struct puffs_mount *, int);
1.9.2.2 ad 175: int puffs_vntouser(struct puffs_mount *, int, void *, size_t, void *,
176: struct vnode *, struct vnode *);
177: void puffs_vntouser_faf(struct puffs_mount *, int, void *, size_t, void *);
178: int puffs_vntouser_req(struct puffs_mount *, int, void *, size_t,
179: void *, uint64_t, struct vnode *, struct vnode *);
180: int puffs_vntouser_adjbuf(struct puffs_mount *, int, void **, size_t *,
181: size_t, void *, struct vnode *, struct vnode *);
182:
183: int puffs_getvnode(struct mount *, void *, enum vtype, voff_t, dev_t,
184: struct vnode **);
185: int puffs_newnode(struct mount *, struct vnode *, struct vnode **,
186: void *, struct componentname *, enum vtype, dev_t);
187: void puffs_putvnode(struct vnode *);
1.9.2.3 ad 188: struct vnode *puffs_pnode2vnode(struct puffs_mount *, void *, int);
189: void puffs_makecn(struct puffs_kcn *, const struct componentname *);
1.9.2.2 ad 190: void puffs_credcvt(struct puffs_cred *, kauth_cred_t);
191: pid_t puffs_lwp2pid(struct lwp *);
192:
193: void puffs_updatenode(struct vnode *, int);
194: #define PUFFS_UPDATEATIME 0x01
195: #define PUFFS_UPDATECTIME 0x02
196: #define PUFFS_UPDATEMTIME 0x04
197: #define PUFFS_UPDATESIZE 0x08
1.9.2.3 ad 198: void puffs_updatevpsize(struct vnode *);
1.9.2.2 ad 199:
200: int puffs_setpmp(pid_t, int, struct puffs_mount *);
201: void puffs_nukebypmp(struct puffs_mount *);
202:
203: uint64_t puffs_getreqid(struct puffs_mount *);
204: void puffs_userdead(struct puffs_mount *);
205:
1.9.2.3 ad 206: /* get/put called by ioctl handler */
207: int puffs_getop(struct puffs_mount *, struct puffs_reqh_get *, int);
208: int puffs_putop(struct puffs_mount *, struct puffs_reqh_put *);
209:
1.9.2.2 ad 210: extern int (**puffs_vnodeop_p)(void *);
211:
212: MALLOC_DECLARE(M_PUFFS);
213:
214: #endif /* _PUFFS_SYS_H_ */
CVSweb <webmaster@jp.NetBSD.org>