xref: /freebsd/sys/fs/pseudofs/pseudofs_internal.h (revision e738085b94631f90e21a49852538ac95974baf44)
19733a808SDag-Erling Smørgrav /*-
2d63027b6SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
3d63027b6SPedro F. Giffuni  *
4*e738085bSDag-Erling Smørgrav  * Copyright (c) 2001 Dag-Erling Smørgrav
59733a808SDag-Erling Smørgrav  * All rights reserved.
69733a808SDag-Erling Smørgrav  *
79733a808SDag-Erling Smørgrav  * Redistribution and use in source and binary forms, with or without
89733a808SDag-Erling Smørgrav  * modification, are permitted provided that the following conditions
99733a808SDag-Erling Smørgrav  * are met:
109733a808SDag-Erling Smørgrav  * 1. Redistributions of source code must retain the above copyright
119733a808SDag-Erling Smørgrav  *    notice, this list of conditions and the following disclaimer
129733a808SDag-Erling Smørgrav  *    in this position and unchanged.
139733a808SDag-Erling Smørgrav  * 2. Redistributions in binary form must reproduce the above copyright
149733a808SDag-Erling Smørgrav  *    notice, this list of conditions and the following disclaimer in the
159733a808SDag-Erling Smørgrav  *    documentation and/or other materials provided with the distribution.
169733a808SDag-Erling Smørgrav  * 3. The name of the author may not be used to endorse or promote products
179733a808SDag-Erling Smørgrav  *    derived from this software without specific prior written permission.
189733a808SDag-Erling Smørgrav  *
199733a808SDag-Erling Smørgrav  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
209733a808SDag-Erling Smørgrav  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
219733a808SDag-Erling Smørgrav  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
229733a808SDag-Erling Smørgrav  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
239733a808SDag-Erling Smørgrav  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
249733a808SDag-Erling Smørgrav  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
259733a808SDag-Erling Smørgrav  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
269733a808SDag-Erling Smørgrav  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
279733a808SDag-Erling Smørgrav  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
289733a808SDag-Erling Smørgrav  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
299733a808SDag-Erling Smørgrav  */
309733a808SDag-Erling Smørgrav 
319733a808SDag-Erling Smørgrav #ifndef _PSEUDOFS_INTERNAL_H_INCLUDED
329733a808SDag-Erling Smørgrav #define _PSEUDOFS_INTERNAL_H_INCLUDED
339733a808SDag-Erling Smørgrav 
349733a808SDag-Erling Smørgrav /*
359733a808SDag-Erling Smørgrav  * Sysctl subtree
369733a808SDag-Erling Smørgrav  */
379733a808SDag-Erling Smørgrav SYSCTL_DECL(_vfs_pfs);
389733a808SDag-Erling Smørgrav 
399733a808SDag-Erling Smørgrav /*
40649ad985SDag-Erling Smørgrav  * Vnode data
41649ad985SDag-Erling Smørgrav  */
42649ad985SDag-Erling Smørgrav struct pfs_vdata {
43649ad985SDag-Erling Smørgrav 	struct pfs_node	*pvd_pn;
44649ad985SDag-Erling Smørgrav 	pid_t		 pvd_pid;
4524efa9d3SDag-Erling Smørgrav 	struct vnode	*pvd_vnode;
462e310f6fSMateusz Guzik 	SLIST_ENTRY(pfs_vdata) pvd_hash;
47649ad985SDag-Erling Smørgrav };
48649ad985SDag-Erling Smørgrav 
49649ad985SDag-Erling Smørgrav /*
509733a808SDag-Erling Smørgrav  * Vnode cache
519733a808SDag-Erling Smørgrav  */
529733a808SDag-Erling Smørgrav void	 pfs_vncache_load	(void);
539733a808SDag-Erling Smørgrav void	 pfs_vncache_unload	(void);
549733a808SDag-Erling Smørgrav int	 pfs_vncache_alloc	(struct mount *, struct vnode **,
55649ad985SDag-Erling Smørgrav 				 struct pfs_node *, pid_t pid);
569733a808SDag-Erling Smørgrav int	 pfs_vncache_free	(struct vnode *);
579733a808SDag-Erling Smørgrav 
589733a808SDag-Erling Smørgrav /*
599733a808SDag-Erling Smørgrav  * File number bitmap
609733a808SDag-Erling Smørgrav  */
619733a808SDag-Erling Smørgrav void	 pfs_fileno_init	(struct pfs_info *);
629733a808SDag-Erling Smørgrav void	 pfs_fileno_uninit	(struct pfs_info *);
63f61bc4eaSDag-Erling Smørgrav void	 pfs_fileno_alloc	(struct pfs_node *);
64f61bc4eaSDag-Erling Smørgrav void	 pfs_fileno_free	(struct pfs_node *);
659733a808SDag-Erling Smørgrav 
66388596dfSDag-Erling Smørgrav /*
67388596dfSDag-Erling Smørgrav  * Debugging
68388596dfSDag-Erling Smørgrav  */
69388596dfSDag-Erling Smørgrav #ifdef PSEUDOFS_TRACE
70388596dfSDag-Erling Smørgrav extern int pfs_trace;
71388596dfSDag-Erling Smørgrav 
72388596dfSDag-Erling Smørgrav #define PFS_TRACE(foo) \
73388596dfSDag-Erling Smørgrav 	do { \
74388596dfSDag-Erling Smørgrav 		if (pfs_trace) { \
75388596dfSDag-Erling Smørgrav 			printf("%s(): line %d: ", __func__, __LINE__); \
76388596dfSDag-Erling Smørgrav 			printf foo ; \
77388596dfSDag-Erling Smørgrav 			printf("\n"); \
78388596dfSDag-Erling Smørgrav 		} \
79388596dfSDag-Erling Smørgrav 	} while (0)
80388596dfSDag-Erling Smørgrav #define PFS_RETURN(err) \
81388596dfSDag-Erling Smørgrav 	do { \
82388596dfSDag-Erling Smørgrav 		if (pfs_trace) { \
83388596dfSDag-Erling Smørgrav 			printf("%s(): line %d: returning %d\n", \
84388596dfSDag-Erling Smørgrav 			    __func__, __LINE__, err); \
85388596dfSDag-Erling Smørgrav 		} \
86388596dfSDag-Erling Smørgrav 		return (err); \
87388596dfSDag-Erling Smørgrav 	} while (0)
88388596dfSDag-Erling Smørgrav #else
89388596dfSDag-Erling Smørgrav #define PFS_TRACE(foo) \
90388596dfSDag-Erling Smørgrav 	do { /* nothing */ } while (0)
91388596dfSDag-Erling Smørgrav #define PFS_RETURN(err) \
92388596dfSDag-Erling Smørgrav 	return (err)
93388596dfSDag-Erling Smørgrav #endif
94388596dfSDag-Erling Smørgrav 
95388596dfSDag-Erling Smørgrav /*
96388596dfSDag-Erling Smørgrav  * Inline helpers for locking
97388596dfSDag-Erling Smørgrav  */
98388596dfSDag-Erling Smørgrav static inline void
pfs_lock(struct pfs_node * pn)99388596dfSDag-Erling Smørgrav pfs_lock(struct pfs_node *pn)
100388596dfSDag-Erling Smørgrav {
101388596dfSDag-Erling Smørgrav 
102388596dfSDag-Erling Smørgrav 	mtx_lock(&pn->pn_mutex);
103388596dfSDag-Erling Smørgrav }
104388596dfSDag-Erling Smørgrav 
105388596dfSDag-Erling Smørgrav static inline void
pfs_unlock(struct pfs_node * pn)106388596dfSDag-Erling Smørgrav pfs_unlock(struct pfs_node *pn)
107388596dfSDag-Erling Smørgrav {
108388596dfSDag-Erling Smørgrav 
109388596dfSDag-Erling Smørgrav 	mtx_unlock(&pn->pn_mutex);
110388596dfSDag-Erling Smørgrav }
111388596dfSDag-Erling Smørgrav 
112388596dfSDag-Erling Smørgrav static inline void
pfs_assert_owned(struct pfs_node * pn)113388596dfSDag-Erling Smørgrav pfs_assert_owned(struct pfs_node *pn)
114388596dfSDag-Erling Smørgrav {
115388596dfSDag-Erling Smørgrav 
116388596dfSDag-Erling Smørgrav 	mtx_assert(&pn->pn_mutex, MA_OWNED);
117388596dfSDag-Erling Smørgrav }
118388596dfSDag-Erling Smørgrav 
119388596dfSDag-Erling Smørgrav static inline void
pfs_assert_not_owned(struct pfs_node * pn)120388596dfSDag-Erling Smørgrav pfs_assert_not_owned(struct pfs_node *pn)
121388596dfSDag-Erling Smørgrav {
122388596dfSDag-Erling Smørgrav 
123388596dfSDag-Erling Smørgrav 	mtx_assert(&pn->pn_mutex, MA_NOTOWNED);
124388596dfSDag-Erling Smørgrav }
125388596dfSDag-Erling Smørgrav 
126388596dfSDag-Erling Smørgrav static inline int
pn_fill(PFS_FILL_ARGS)127388596dfSDag-Erling Smørgrav pn_fill(PFS_FILL_ARGS)
128388596dfSDag-Erling Smørgrav {
129388596dfSDag-Erling Smørgrav 
130388596dfSDag-Erling Smørgrav 	PFS_TRACE(("%s", pn->pn_name));
131388596dfSDag-Erling Smørgrav 	KASSERT(pn->pn_fill != NULL, ("%s(): no callback", __func__));
132388596dfSDag-Erling Smørgrav 	if (p != NULL) {
133388596dfSDag-Erling Smørgrav 		PROC_LOCK_ASSERT(p, MA_NOTOWNED);
134388596dfSDag-Erling Smørgrav 		PROC_ASSERT_HELD(p);
135388596dfSDag-Erling Smørgrav 	}
136388596dfSDag-Erling Smørgrav 	pfs_assert_not_owned(pn);
137388596dfSDag-Erling Smørgrav 	return ((pn->pn_fill)(PFS_FILL_ARGNAMES));
138388596dfSDag-Erling Smørgrav }
139388596dfSDag-Erling Smørgrav 
140388596dfSDag-Erling Smørgrav static inline int
pn_attr(PFS_ATTR_ARGS)141388596dfSDag-Erling Smørgrav pn_attr(PFS_ATTR_ARGS)
142388596dfSDag-Erling Smørgrav {
143388596dfSDag-Erling Smørgrav 
144388596dfSDag-Erling Smørgrav 	PFS_TRACE(("%s", pn->pn_name));
145388596dfSDag-Erling Smørgrav 	KASSERT(pn->pn_attr != NULL, ("%s(): no callback", __func__));
146388596dfSDag-Erling Smørgrav 	if (p != NULL)
147388596dfSDag-Erling Smørgrav 		PROC_LOCK_ASSERT(p, MA_OWNED);
148388596dfSDag-Erling Smørgrav 	pfs_assert_not_owned(pn);
149388596dfSDag-Erling Smørgrav 	return ((pn->pn_attr)(PFS_ATTR_ARGNAMES));
150388596dfSDag-Erling Smørgrav }
151388596dfSDag-Erling Smørgrav 
152388596dfSDag-Erling Smørgrav static inline int
pn_vis(PFS_VIS_ARGS)153388596dfSDag-Erling Smørgrav pn_vis(PFS_VIS_ARGS)
154388596dfSDag-Erling Smørgrav {
155388596dfSDag-Erling Smørgrav 
156388596dfSDag-Erling Smørgrav 	PFS_TRACE(("%s", pn->pn_name));
157405c0c04SDmitry Chagin 	if (pn->pn_vis == NULL)
158405c0c04SDmitry Chagin 		return (1);
159405c0c04SDmitry Chagin 	if (p != NULL)
160388596dfSDag-Erling Smørgrav 		PROC_LOCK_ASSERT(p, MA_OWNED);
161388596dfSDag-Erling Smørgrav 	pfs_assert_not_owned(pn);
162388596dfSDag-Erling Smørgrav 	return ((pn->pn_vis)(PFS_VIS_ARGNAMES));
163388596dfSDag-Erling Smørgrav }
164388596dfSDag-Erling Smørgrav 
165388596dfSDag-Erling Smørgrav static inline int
pn_ioctl(PFS_IOCTL_ARGS)166388596dfSDag-Erling Smørgrav pn_ioctl(PFS_IOCTL_ARGS)
167388596dfSDag-Erling Smørgrav {
168388596dfSDag-Erling Smørgrav 
169388596dfSDag-Erling Smørgrav 	PFS_TRACE(("%s", pn->pn_name));
170388596dfSDag-Erling Smørgrav 	KASSERT(pn->pn_ioctl != NULL, ("%s(): no callback", __func__));
171388596dfSDag-Erling Smørgrav 	if (p != NULL)
172388596dfSDag-Erling Smørgrav 		PROC_LOCK_ASSERT(p, MA_OWNED);
173388596dfSDag-Erling Smørgrav 	pfs_assert_not_owned(pn);
174388596dfSDag-Erling Smørgrav 	return ((pn->pn_ioctl)(PFS_IOCTL_ARGNAMES));
175388596dfSDag-Erling Smørgrav }
176388596dfSDag-Erling Smørgrav 
177388596dfSDag-Erling Smørgrav static inline int
pn_getextattr(PFS_GETEXTATTR_ARGS)178388596dfSDag-Erling Smørgrav pn_getextattr(PFS_GETEXTATTR_ARGS)
179388596dfSDag-Erling Smørgrav {
180388596dfSDag-Erling Smørgrav 
181388596dfSDag-Erling Smørgrav 	PFS_TRACE(("%s", pn->pn_name));
182388596dfSDag-Erling Smørgrav 	KASSERT(pn->pn_getextattr != NULL, ("%s(): no callback", __func__));
183388596dfSDag-Erling Smørgrav 	if (p != NULL)
184388596dfSDag-Erling Smørgrav 		PROC_LOCK_ASSERT(p, MA_OWNED);
185388596dfSDag-Erling Smørgrav 	pfs_assert_not_owned(pn);
186388596dfSDag-Erling Smørgrav 	return ((pn->pn_getextattr)(PFS_GETEXTATTR_ARGNAMES));
187388596dfSDag-Erling Smørgrav }
188388596dfSDag-Erling Smørgrav 
189388596dfSDag-Erling Smørgrav static inline int
pn_close(PFS_CLOSE_ARGS)190388596dfSDag-Erling Smørgrav pn_close(PFS_CLOSE_ARGS)
191388596dfSDag-Erling Smørgrav {
192388596dfSDag-Erling Smørgrav 
193388596dfSDag-Erling Smørgrav 	PFS_TRACE(("%s", pn->pn_name));
194388596dfSDag-Erling Smørgrav 	KASSERT(pn->pn_close != NULL, ("%s(): no callback", __func__));
195388596dfSDag-Erling Smørgrav 	if (p != NULL)
196388596dfSDag-Erling Smørgrav 		PROC_LOCK_ASSERT(p, MA_OWNED);
197388596dfSDag-Erling Smørgrav 	pfs_assert_not_owned(pn);
198388596dfSDag-Erling Smørgrav 	return ((pn->pn_close)(PFS_CLOSE_ARGNAMES));
199388596dfSDag-Erling Smørgrav }
200388596dfSDag-Erling Smørgrav 
201388596dfSDag-Erling Smørgrav static inline int
pn_destroy(PFS_DESTROY_ARGS)202388596dfSDag-Erling Smørgrav pn_destroy(PFS_DESTROY_ARGS)
203388596dfSDag-Erling Smørgrav {
204388596dfSDag-Erling Smørgrav 
205388596dfSDag-Erling Smørgrav 	PFS_TRACE(("%s", pn->pn_name));
206388596dfSDag-Erling Smørgrav 	KASSERT(pn->pn_destroy != NULL, ("%s(): no callback", __func__));
207388596dfSDag-Erling Smørgrav 	pfs_assert_not_owned(pn);
208388596dfSDag-Erling Smørgrav 	return ((pn->pn_destroy)(PFS_DESTROY_ARGNAMES));
209388596dfSDag-Erling Smørgrav }
210388596dfSDag-Erling Smørgrav 
2119733a808SDag-Erling Smørgrav #endif
212