xref: /netbsd-src/sys/fs/puffs/puffs_sys.h (revision d91f98a8715141154279122ae81737cb65179572)
1*d91f98a8Spgoyette /*	$NetBSD: puffs_sys.h,v 1.91 2019/01/27 02:08:43 pgoyette Exp $	*/
28640fbb5Spooka 
38640fbb5Spooka /*
48640fbb5Spooka  * Copyright (c) 2005, 2006  Antti Kantee.  All Rights Reserved.
58640fbb5Spooka  *
68640fbb5Spooka  * Development of this software was supported by the
78640fbb5Spooka  * Google Summer of Code program and the Ulla Tuominen Foundation.
88640fbb5Spooka  * The Google SoC project was mentored by Bill Studenmund.
98640fbb5Spooka  *
108640fbb5Spooka  * Redistribution and use in source and binary forms, with or without
118640fbb5Spooka  * modification, are permitted provided that the following conditions
128640fbb5Spooka  * are met:
138640fbb5Spooka  * 1. Redistributions of source code must retain the above copyright
148640fbb5Spooka  *    notice, this list of conditions and the following disclaimer.
158640fbb5Spooka  * 2. Redistributions in binary form must reproduce the above copyright
168640fbb5Spooka  *    notice, this list of conditions and the following disclaimer in the
178640fbb5Spooka  *    documentation and/or other materials provided with the distribution.
188640fbb5Spooka  *
198640fbb5Spooka  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
208640fbb5Spooka  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
218640fbb5Spooka  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
228640fbb5Spooka  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
238640fbb5Spooka  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
248640fbb5Spooka  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
258640fbb5Spooka  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
268640fbb5Spooka  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
278640fbb5Spooka  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
288640fbb5Spooka  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
298640fbb5Spooka  * SUCH DAMAGE.
308640fbb5Spooka  */
318640fbb5Spooka 
328640fbb5Spooka #ifndef _PUFFS_SYS_H_
338640fbb5Spooka #define _PUFFS_SYS_H_
348640fbb5Spooka 
358640fbb5Spooka #include <sys/param.h>
368640fbb5Spooka #include <sys/select.h>
378640fbb5Spooka #include <sys/kauth.h>
3878693816Spooka #include <sys/mutex.h>
398640fbb5Spooka #include <sys/queue.h>
40f2121461Spooka #include <sys/pool.h>
418640fbb5Spooka 
428640fbb5Spooka #include <fs/puffs/puffs_msgif.h>
438640fbb5Spooka 
44b3bdf665Spooka #include <miscfs/genfs/genfs_node.h>
45b3bdf665Spooka 
460f94cb76Spooka extern int (**puffs_vnodeop_p)(void *);
470f94cb76Spooka extern int (**puffs_specop_p)(void *);
4830a851c1Spooka extern int (**puffs_fifoop_p)(void *);
490f94cb76Spooka 
500f94cb76Spooka extern const struct vnodeopv_desc puffs_vnodeop_opv_desc;
510f94cb76Spooka extern const struct vnodeopv_desc puffs_specop_opv_desc;
5230a851c1Spooka extern const struct vnodeopv_desc puffs_fifoop_opv_desc;
5374baaf5cSpooka extern const struct vnodeopv_desc puffs_msgop_opv_desc;
540f94cb76Spooka 
55f2121461Spooka extern struct pool puffs_pnpool;
566e9ef395Smanu extern struct pool puffs_vapool;
57f2121461Spooka 
580435bceeSpooka #ifdef DEBUG
59c1b906f4Spooka #ifndef PUFFSDEBUG
60c1b906f4Spooka #define PUFFSDEBUG
61c1b906f4Spooka #endif
62c1b906f4Spooka #endif
63c1b906f4Spooka 
64c1b906f4Spooka #ifdef PUFFSDEBUG
650435bceeSpooka extern int puffsdebug; /* puffs_subr.c */
66f1dbec9aSapb #define DPRINTF(x) do { \
67f1dbec9aSapb 		if (puffsdebug > 0) printf x; \
6815239241Sapb 	} while (/*CONSTCOND*/0)
69f1dbec9aSapb #define DPRINTF_VERBOSE(x) do { \
70f1dbec9aSapb 		if (puffsdebug > 1) printf x; \
7115239241Sapb 	} while (/*CONSTCOND*/0)
720435bceeSpooka #else
73f1dbec9aSapb #define DPRINTF(x) ((void)0)
74f1dbec9aSapb #define DPRINTF_VERBOSE(x) ((void)0)
750435bceeSpooka #endif
768640fbb5Spooka 
778640fbb5Spooka #define MPTOPUFFSMP(mp) ((struct puffs_mount *)((mp)->mnt_data))
788640fbb5Spooka #define PMPTOMP(pmp) (pmp->pmp_mp)
798640fbb5Spooka #define VPTOPP(vp) ((struct puffs_node *)(vp)->v_data)
808640fbb5Spooka #define VPTOPNC(vp) (((struct puffs_node *)(vp)->v_data)->pn_cookie)
818640fbb5Spooka #define VPTOPUFFSMP(vp) ((struct puffs_mount*)((struct puffs_node*)vp->v_data))
828640fbb5Spooka 
834ccbce81Spooka /* we don't pass the kernel overlay to userspace */
844ccbce81Spooka #define PUFFS_TOFHSIZE(s) ((s)==0 ? (s) : (s)+4)
854ccbce81Spooka #define PUFFS_FROMFHSIZE(s) ((s)==0 ? (s) : (s)-4)
864ccbce81Spooka 
87151ee075Spooka #define ALLOPS(pmp) (pmp->pmp_flags & PUFFS_KFLAG_ALLOPS)
8874baaf5cSpooka #define EXISTSOP(pmp, op) \
89151ee075Spooka  (ALLOPS(pmp) || ((pmp)->pmp_vnopmask[PUFFS_VN_##op]))
9074baaf5cSpooka 
91df01a64bSpooka #define PUFFS_USE_NAMECACHE(pmp)	\
92df01a64bSpooka     (((pmp)->pmp_flags & PUFFS_KFLAG_NOCACHE_NAME) == 0)
93df01a64bSpooka #define PUFFS_USE_PAGECACHE(pmp)	\
94df01a64bSpooka     (((pmp)->pmp_flags & PUFFS_KFLAG_NOCACHE_PAGE) == 0)
95d4106649Spooka #define PUFFS_USE_FULLPNBUF(pmp)	\
96d4106649Spooka     ((pmp)->pmp_flags & PUFFS_KFLAG_LOOKUP_FULLPNBUF)
976e9ef395Smanu #define PUFFS_USE_FS_TTL(pmp)	\
986e9ef395Smanu     ((pmp)->pmp_flags & PUFFS_KFLAG_CACHE_FS_TTL)
99ff88f232Smanu #define PUFFS_USE_DOTDOTCACHE(pmp)	\
100ff88f232Smanu     ((pmp)->pmp_flags & PUFFS_KFLAG_CACHE_DOTDOT)
1018abab6b7Smanu #define PUFFS_USE_METAFLUSH(pmp)	\
1028abab6b7Smanu     (((pmp)->pmp_flags & PUFFS_KFLAG_NOFLUSH_META) == 0)
1037983048eSpooka 
10460697447Schristos #define PUFFS_WCACHEINFO(pmp)	(__USE(pmp), 0)
1058d9c0218Spooka 
10601895f64Spooka struct puffs_newcookie {
107feea4545Spooka 	puffs_cookie_t	pnc_cookie;
10801895f64Spooka 
10901895f64Spooka 	LIST_ENTRY(puffs_newcookie) pnc_entries;
11001895f64Spooka };
11101895f64Spooka 
1128502ba8eSmanu #define PUFFS_SOPREQ_EXPIRE_TIMEOUT 1000
1138502ba8eSmanu extern int puffs_sopreq_expire_timeout;
1148502ba8eSmanu 
1154d6a407bSpooka enum puffs_sopreqtype {
116283c2ca9Spooka 	PUFFS_SOPREQSYS_EXIT,
1174d6a407bSpooka 	PUFFS_SOPREQ_FLUSH,
118d728f538Spooka 	PUFFS_SOPREQ_UNMOUNT,
1198502ba8eSmanu 	PUFFS_SOPREQ_EXPIRE,
1204d6a407bSpooka };
1214d6a407bSpooka 
1224d6a407bSpooka struct puffs_sopreq {
1234d6a407bSpooka 	union {
1244d6a407bSpooka 		struct puffs_req preq;
1254d6a407bSpooka 		struct puffs_flush pf;
1268502ba8eSmanu 		puffs_cookie_t ck;
1274d6a407bSpooka 	} psopr_u;
1284d6a407bSpooka 
1294d6a407bSpooka 	enum puffs_sopreqtype psopr_sopreq;
1304d6a407bSpooka 	TAILQ_ENTRY(puffs_sopreq) psopr_entries;
1318502ba8eSmanu 	int psopr_at;
1324d6a407bSpooka };
1334d6a407bSpooka #define psopr_preq psopr_u.preq
1344d6a407bSpooka #define psopr_pf psopr_u.pf
1358502ba8eSmanu #define psopr_ck psopr_u.ck
1364d6a407bSpooka 
13733c91738Spooka TAILQ_HEAD(puffs_wq, puffs_msgpark);
13884906bc2Spooka LIST_HEAD(puffs_node_hashlist, puffs_node);
1398640fbb5Spooka struct puffs_mount {
14078693816Spooka 	kmutex_t	 		pmp_lock;
1418640fbb5Spooka 
1424e4ce72bSpooka 	struct puffs_kargs		pmp_args;
14374baaf5cSpooka #define pmp_flags pmp_args.pa_flags
14474baaf5cSpooka #define pmp_vnopmask pmp_args.pa_vnopmask
1458640fbb5Spooka 
14633c91738Spooka 	struct puffs_wq			pmp_msg_touser;
14733c91738Spooka 	int				pmp_msg_touser_count;
14833c91738Spooka 	kcondvar_t			pmp_msg_waiter_cv;
14933c91738Spooka 	size_t				pmp_msg_maxsize;
1508640fbb5Spooka 
15133c91738Spooka 	struct puffs_wq			pmp_msg_replywait;
1528640fbb5Spooka 
1538640fbb5Spooka 	struct mount			*pmp_mp;
15433965295Spooka 
1558640fbb5Spooka 	struct vnode			*pmp_root;
156feea4545Spooka 	puffs_cookie_t			pmp_root_cookie;
15733965295Spooka 	enum vtype			pmp_root_vtype;
15833965295Spooka 	vsize_t				pmp_root_vsize;
15933965295Spooka 	dev_t				pmp_root_rdev;
16033965295Spooka 
161f2031ea2Spooka 	struct putter_instance		*pmp_pi;
1628640fbb5Spooka 
1636ffefad6Spooka 	unsigned int			pmp_refcount;
1646ffefad6Spooka 	kcondvar_t			pmp_refcount_cv;
16578693816Spooka 
16678693816Spooka 	kcondvar_t			pmp_unmounting_cv;
1676ffefad6Spooka 	uint8_t				pmp_unmounting;
1686ffefad6Spooka 
1696ffefad6Spooka 	uint8_t				pmp_status;
1706ffefad6Spooka 	uint8_t				pmp_suspend;
17178693816Spooka 
17233c91738Spooka 	uint8_t				*pmp_curput;
17333c91738Spooka 	size_t				pmp_curres;
17433c91738Spooka 	void				*pmp_curopaq;
17533c91738Spooka 
17633c91738Spooka 	uint64_t			pmp_nextmsgid;
1774d6a407bSpooka 
1784d6a407bSpooka 	kmutex_t			pmp_sopmtx;
1794d6a407bSpooka 	kcondvar_t			pmp_sopcv;
1804d6a407bSpooka 	int				pmp_sopthrcount;
1818502ba8eSmanu 	TAILQ_HEAD(, puffs_sopreq)	pmp_sopfastreqs;
182b8b95eabSmanu 	TAILQ_HEAD(, puffs_sopreq)	pmp_sopnodereqs;
183b90c150cSpooka 	bool				pmp_docompat;
1848640fbb5Spooka };
185e5e4a4f6Spooka 
1868640fbb5Spooka #define PUFFSTAT_BEFOREINIT	0
1878640fbb5Spooka #define PUFFSTAT_MOUNTING	1
1888640fbb5Spooka #define PUFFSTAT_RUNNING	2
18984295069Spooka #define PUFFSTAT_DYING		3 /* Do you want your possessions identified? */
1908640fbb5Spooka 
1918d9c0218Spooka 
1928502ba8eSmanu #define PNODE_NOREFS	0x001	/* no backend reference			*/
1938502ba8eSmanu #define PNODE_DYING	0x002	/* NOREFS + inactive			*/
1948502ba8eSmanu #define PNODE_FAF	0x004	/* issue all operations as FAF		*/
1958502ba8eSmanu #define PNODE_DOINACT 	0x008	/* if inactive-on-demand, call inactive */
1968502ba8eSmanu #define PNODE_SOPEXP	0x100	/* Node reclaim postponed in sop thread	*/
1977642144cSmanu #define PNODE_RDIRECT	0x200	/* bypass page cache on read		*/
1987642144cSmanu #define PNODE_WDIRECT	0x400	/* bypass page cache on write		*/
1998d9c0218Spooka 
2008d9c0218Spooka #define PNODE_METACACHE_ATIME	0x10	/* cache atime metadata */
2018d9c0218Spooka #define PNODE_METACACHE_CTIME	0x20	/* cache atime metadata */
2028d9c0218Spooka #define PNODE_METACACHE_MTIME	0x40	/* cache atime metadata */
2038d9c0218Spooka #define PNODE_METACACHE_SIZE	0x80	/* cache atime metadata */
2048d9c0218Spooka #define PNODE_METACACHE_MASK	0xf0
2058d9c0218Spooka 
2068640fbb5Spooka struct puffs_node {
207b3bdf665Spooka 	struct genfs_node pn_gnode;	/* genfs glue			*/
208b3bdf665Spooka 
2099d9f624fSpooka 	kmutex_t	pn_mtx;
2109d9f624fSpooka 	int		pn_refcount;
2118502ba8eSmanu 	int		pn_nlookup;
2129d9f624fSpooka 
213feea4545Spooka 	puffs_cookie_t	pn_cookie;	/* userspace pnode cookie	*/
2148640fbb5Spooka 	struct vnode	*pn_vp;		/* backpointer to vnode		*/
2158640fbb5Spooka 	uint32_t	pn_stat;	/* node status			*/
2168640fbb5Spooka 
2179d9f624fSpooka 	struct selinfo	pn_sel;		/* for selecting on the node	*/
2189d9f624fSpooka 	short		pn_revents;	/* available events		*/
2199d9f624fSpooka 
2208d9c0218Spooka 	/* metacache */
2218d9c0218Spooka 	struct timespec	pn_mc_atime;
2228d9c0218Spooka 	struct timespec	pn_mc_ctime;
2238d9c0218Spooka 	struct timespec	pn_mc_mtime;
2248d9c0218Spooka 	u_quad_t	pn_mc_size;
2258d9c0218Spooka 
2269a0aaa54Spooka 	voff_t		pn_serversize;
2279a0aaa54Spooka 
2282f07b812Skefren 	struct lockf *	pn_lockf;
2292f07b812Skefren 
23096c935e3Smanu 	kmutex_t	pn_sizemtx;	/* size modification mutex	*/
23196c935e3Smanu 
2326e9ef395Smanu 	int		pn_cn_timeout;	/* path cache */
2338502ba8eSmanu 	int		pn_cn_grace;	/* grace time before reclaim */
2346e9ef395Smanu 	int		pn_va_timeout;	/* attribute cache */
2356e9ef395Smanu 	struct vattr *	pn_va_cache;	/* attribute cache */
236ff88f232Smanu 	struct vnode *  pn_parent;	/* parent cache */
2378640fbb5Spooka };
2388640fbb5Spooka 
23947cf5226Spooka typedef void (*parkdone_fn)(struct puffs_mount *, struct puffs_req *, void *);
240115fa924Spooka 
24133c91738Spooka struct puffs_msgpark;
24278693816Spooka void	puffs_msgif_init(void);
24378693816Spooka void	puffs_msgif_destroy(void);
24433c91738Spooka int	puffs_msgmem_alloc(size_t, struct puffs_msgpark **, void **, int);
24533c91738Spooka void	puffs_msgmem_release(struct puffs_msgpark *);
24678693816Spooka 
2474d6a407bSpooka void	puffs_sop_thread(void *);
2484d6a407bSpooka 
249622412c6Spooka void	puffs_msg_setfaf(struct puffs_msgpark *);
250622412c6Spooka void	puffs_msg_setdelta(struct puffs_msgpark *, size_t);
251feea4545Spooka void	puffs_msg_setinfo(struct puffs_msgpark *, int, int, puffs_cookie_t);
252622412c6Spooka void	puffs_msg_setcall(struct puffs_msgpark *, parkdone_fn, void *);
253622412c6Spooka 
254622412c6Spooka void	puffs_msg_enqueue(struct puffs_mount *, struct puffs_msgpark *);
255622412c6Spooka int	puffs_msg_wait(struct puffs_mount *, struct puffs_msgpark *);
256622412c6Spooka int	puffs_msg_wait2(struct puffs_mount *, struct puffs_msgpark *,
257622412c6Spooka 			struct puffs_node *, struct puffs_node *);
2588640fbb5Spooka 
2597d5d7f4fSpooka void	puffs_msg_sendresp(struct puffs_mount *, struct puffs_req *, int);
2607d5d7f4fSpooka 
261feea4545Spooka int	puffs_getvnode(struct mount *, puffs_cookie_t, enum vtype,
262feea4545Spooka 		       voff_t, dev_t, struct vnode **);
2638640fbb5Spooka int	puffs_newnode(struct mount *, struct vnode *, struct vnode **,
264feea4545Spooka 		      puffs_cookie_t, struct componentname *,
265feea4545Spooka 		      enum vtype, dev_t);
2668640fbb5Spooka void	puffs_putvnode(struct vnode *);
2679d9f624fSpooka 
2689d9f624fSpooka void	puffs_releasenode(struct puffs_node *);
2699d9f624fSpooka void	puffs_referencenode(struct puffs_node *);
2709d9f624fSpooka 
2717f467f6fSpooka #define PUFFS_NOSUCHCOOKIE (-1)
272accb62aeShannken int	puffs_cookie2vnode(struct puffs_mount *, puffs_cookie_t,
27301895f64Spooka 			   struct vnode **);
274438f52d2Spooka void	puffs_makecn(struct puffs_kcn *, struct puffs_kcred *,
275319ddafdSpooka 		     const struct componentname *, int);
276438f52d2Spooka void	puffs_credcvt(struct puffs_kcred *, kauth_cred_t);
2778640fbb5Spooka 
27847cf5226Spooka void	puffs_parkdone_asyncbioread(struct puffs_mount *,
27947cf5226Spooka 				    struct puffs_req *, void *);
280ac5e2710Spooka void	puffs_parkdone_asyncbiowrite(struct puffs_mount *,
281ac5e2710Spooka 				     struct puffs_req *, void *);
28247cf5226Spooka void	puffs_parkdone_poll(struct puffs_mount *, struct puffs_req *, void *);
283115fa924Spooka 
2846ffefad6Spooka void	puffs_mp_reference(struct puffs_mount *);
2856ffefad6Spooka void	puffs_mp_release(struct puffs_mount *);
2866ffefad6Spooka 
28728636f63Spooka void	puffs_gop_size(struct vnode *, off_t, off_t *, int);
28828636f63Spooka void	puffs_gop_markupdate(struct vnode *, int);
28928636f63Spooka 
290feea4545Spooka void	puffs_senderr(struct puffs_mount *, int, int, const char *,
291feea4545Spooka 		      puffs_cookie_t);
292622412c6Spooka 
293*d91f98a8Spgoyette int	puffs_compat_outgoing(struct puffs_req *, struct puffs_req**, ssize_t*);
294b90c150cSpooka void	puffs_compat_incoming(struct puffs_req *, struct puffs_req *);
295b90c150cSpooka 
29661b1e9a6Spooka void	puffs_updatenode(struct puffs_node *, int, voff_t);
297b3bdf665Spooka #define PUFFS_UPDATEATIME	0x01
298b3bdf665Spooka #define PUFFS_UPDATECTIME	0x02
299b3bdf665Spooka #define PUFFS_UPDATEMTIME	0x04
300b3bdf665Spooka #define PUFFS_UPDATESIZE	0x08
301b3bdf665Spooka 
3028640fbb5Spooka void	puffs_userdead(struct puffs_mount *);
3038640fbb5Spooka 
3048640fbb5Spooka extern int (**puffs_vnodeop_p)(void *);
3058640fbb5Spooka 
306622412c6Spooka /* for putter */
30733c91738Spooka int	puffs_msgif_getout(void *, size_t, int, uint8_t **, size_t *, void **);
30833c91738Spooka void	puffs_msgif_releaseout(void *, void *, int);
309ca28ea45Spooka int	puffs_msgif_dispatch(void *, struct putter_hdr *);
310f2031ea2Spooka size_t	puffs_msgif_waitcount(void *);
311f2031ea2Spooka int	puffs_msgif_close(void *);
31233c91738Spooka 
31347cf5226Spooka static __inline int
checkerr(struct puffs_mount * pmp,int error,const char * str)31447cf5226Spooka checkerr(struct puffs_mount *pmp, int error, const char *str)
31547cf5226Spooka {
31647cf5226Spooka 
31747cf5226Spooka 	if (error < 0 || error > ELAST) {
318622412c6Spooka 		puffs_senderr(pmp, PUFFS_ERR_ERROR, error, str, NULL);
31947cf5226Spooka 		error = EPROTO;
32047cf5226Spooka 	}
32147cf5226Spooka 
32247cf5226Spooka 	return error;
32347cf5226Spooka }
32447cf5226Spooka 
32533c91738Spooka #define PUFFS_MSG_VARS(type, a)						\
32633c91738Spooka 	struct puffs_##type##msg_##a *a##_msg;				\
32733c91738Spooka 	struct puffs_msgpark *park_##a = NULL
32833c91738Spooka 
32933c91738Spooka #define PUFFS_MSG_ALLOC(type, a)					\
33033c91738Spooka 	puffs_msgmem_alloc(sizeof(struct puffs_##type##msg_##a),	\
3314f32bae2Spooka 	    &park_##a, (void *)& a##_msg, 1)
33233c91738Spooka 
33333c91738Spooka #define PUFFS_MSG_RELEASE(a) 						\
33433c91738Spooka do {									\
33533c91738Spooka 	if (park_##a) puffs_msgmem_release(park_##a);			\
33633c91738Spooka } while (/*CONSTCOND*/0)
33733c91738Spooka 
33860697447Schristos #define PUFFS_MSG_ENQUEUEWAIT_NOERROR(pmp, park)			\
33960697447Schristos do {									\
34060697447Schristos 	puffs_msg_enqueue(pmp, park);					\
34160697447Schristos 	puffs_msg_wait(pmp, park);					\
34260697447Schristos } while (/*CONSTCOND*/0)
34360697447Schristos 
34460697447Schristos #define PUFFS_MSG_ENQUEUEWAIT2_NOERROR(pmp, park, vp1, vp2)		\
34560697447Schristos do {									\
34660697447Schristos 	puffs_msg_enqueue(pmp, park);					\
34760697447Schristos 	puffs_msg_wait2(pmp, park, vp1, vp2);				\
34860697447Schristos } while (/*CONSTCOND*/0)
34960697447Schristos 
350622412c6Spooka #define PUFFS_MSG_ENQUEUEWAIT(pmp, park, var)				\
351622412c6Spooka do {									\
352622412c6Spooka 	puffs_msg_enqueue(pmp, park);					\
353622412c6Spooka 	var = puffs_msg_wait(pmp, park);				\
354622412c6Spooka } while (/*CONSTCOND*/0)
355622412c6Spooka 
356622412c6Spooka #define PUFFS_MSG_ENQUEUEWAIT2(pmp, park, vp1, vp2, var)		\
357622412c6Spooka do {									\
358622412c6Spooka 	puffs_msg_enqueue(pmp, park);					\
359622412c6Spooka 	var = puffs_msg_wait2(pmp, park, vp1, vp2);			\
360622412c6Spooka } while (/*CONSTCOND*/0)
361622412c6Spooka 
362*d91f98a8Spgoyette /*
363*d91f98a8Spgoyette  * compat50 init/fini
364*d91f98a8Spgoyette  */
365*d91f98a8Spgoyette 
366*d91f98a8Spgoyette void puffs_50_init(void);
367*d91f98a8Spgoyette void puffs_50_fini(void);
368*d91f98a8Spgoyette 
3698640fbb5Spooka #endif /* _PUFFS_SYS_H_ */
370