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