1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2005 Poul-Henning Kamp.  All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Neither the name of the University nor the names of its contributors
12 *    may be used to endorse or promote products derived from this software
13 *    without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 * $FreeBSD$
28 */
29
30/*
31 * This file documents a private interface and it SHALL only be used
32 * by kern/kern_conf.c and fs/devfs/...
33 */
34
35#ifndef _FS_DEVFS_DEVFS_INT_H_
36#define	_FS_DEVFS_DEVFS_INT_H_
37
38#include <sys/queue.h>
39
40#ifdef _KERNEL
41
42struct devfs_dirent;
43struct devfs_mount;
44
45struct cdev_privdata {
46	struct file		*cdpd_fp;
47	void			*cdpd_data;
48	void			(*cdpd_dtr)(void *);
49	LIST_ENTRY(cdev_privdata) cdpd_list;
50};
51
52struct cdev_priv {
53	struct cdev		cdp_c;
54	TAILQ_ENTRY(cdev_priv)	cdp_list;
55
56	u_int			cdp_inode;
57
58	u_int			cdp_flags;
59#define CDP_ACTIVE		(1 << 0)
60#define CDP_SCHED_DTR		(1 << 1)
61#define	CDP_UNREF_DTR		(1 << 2)
62
63	u_int			cdp_inuse;
64	u_int			cdp_maxdirent;
65	struct devfs_dirent	**cdp_dirents;
66	struct devfs_dirent	*cdp_dirent0;
67
68	TAILQ_ENTRY(cdev_priv)	cdp_dtr_list;
69	void			(*cdp_dtr_cb)(void *);
70	void			*cdp_dtr_cb_arg;
71
72	LIST_HEAD(, cdev_privdata) cdp_fdpriv;
73
74	struct mtx		cdp_threadlock;
75};
76
77#define	cdev2priv(c)	__containerof(c, struct cdev_priv, cdp_c)
78
79struct cdev	*devfs_alloc(int);
80int	devfs_dev_exists(const char *);
81void	devfs_free(struct cdev *);
82void	devfs_create(struct cdev *);
83void	devfs_destroy(struct cdev *);
84void	devfs_destroy_cdevpriv(struct cdev_privdata *);
85
86int	devfs_dir_find(const char *);
87void	devfs_dir_ref_de(struct devfs_mount *, struct devfs_dirent *);
88void	devfs_dir_unref_de(struct devfs_mount *, struct devfs_dirent *);
89int	devfs_pathpath(const char *, const char *);
90
91extern struct unrhdr *devfs_inos;
92extern struct mtx devmtx;
93extern struct mtx devfs_de_interlock;
94extern struct sx clone_drain_lock;
95extern struct mtx cdevpriv_mtx;
96extern TAILQ_HEAD(cdev_priv_list, cdev_priv) cdevp_list;
97
98#define	dev_lock_assert_locked()	mtx_assert(&devmtx, MA_OWNED)
99#define	dev_lock_assert_unlocked()	mtx_assert(&devmtx, MA_NOTOWNED)
100
101#endif /* _KERNEL */
102
103#endif /* !_FS_DEVFS_DEVFS_INT_H_ */
104