14cc62415SBruce Evans /*- 23f54a085SPoul-Henning Kamp * Copyright (c) 1992, 1993 33f54a085SPoul-Henning Kamp * The Regents of the University of California. All rights reserved. 43f54a085SPoul-Henning Kamp * Copyright (c) 2000 53f54a085SPoul-Henning Kamp * Poul-Henning Kamp. All rights reserved. 6a1dc2096SDima Dorfman * Copyright (c) 2002 7a1dc2096SDima Dorfman * Dima Dorfman. All rights reserved. 83f54a085SPoul-Henning Kamp * 93f54a085SPoul-Henning Kamp * This code is derived from software donated to Berkeley by 103f54a085SPoul-Henning Kamp * Jan-Simon Pendry. 113f54a085SPoul-Henning Kamp * 123f54a085SPoul-Henning Kamp * Redistribution and use in source and binary forms, with or without 133f54a085SPoul-Henning Kamp * modification, are permitted provided that the following conditions 143f54a085SPoul-Henning Kamp * are met: 153f54a085SPoul-Henning Kamp * 1. Redistributions of source code must retain the above copyright 163f54a085SPoul-Henning Kamp * notice, this list of conditions and the following disclaimer. 173f54a085SPoul-Henning Kamp * 2. Neither the name of the University nor the names of its contributors 183f54a085SPoul-Henning Kamp * may be used to endorse or promote products derived from this software 193f54a085SPoul-Henning Kamp * without specific prior written permission. 203f54a085SPoul-Henning Kamp * 213f54a085SPoul-Henning Kamp * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 223f54a085SPoul-Henning Kamp * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 233f54a085SPoul-Henning Kamp * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 243f54a085SPoul-Henning Kamp * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 253f54a085SPoul-Henning Kamp * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 263f54a085SPoul-Henning Kamp * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 273f54a085SPoul-Henning Kamp * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 283f54a085SPoul-Henning Kamp * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 293f54a085SPoul-Henning Kamp * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 303f54a085SPoul-Henning Kamp * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 313f54a085SPoul-Henning Kamp * SUCH DAMAGE. 323f54a085SPoul-Henning Kamp * 333f54a085SPoul-Henning Kamp * @(#)kernfs.h 8.6 (Berkeley) 3/29/95 343f54a085SPoul-Henning Kamp * From: FreeBSD: src/sys/miscfs/kernfs/kernfs.h 1.14 353f54a085SPoul-Henning Kamp * 363f54a085SPoul-Henning Kamp * $FreeBSD$ 373f54a085SPoul-Henning Kamp */ 383f54a085SPoul-Henning Kamp 3993bcdfe2SPoul-Henning Kamp #ifndef _FS_DEVFS_DEVFS_H_ 4093bcdfe2SPoul-Henning Kamp #define _FS_DEVFS_DEVFS_H_ 413f54a085SPoul-Henning Kamp 42a1dc2096SDima Dorfman #define DEVFS_MAGIC 0xdb0a087a 43a1dc2096SDima Dorfman 44a1dc2096SDima Dorfman /* 45a1dc2096SDima Dorfman * Identifiers. The ruleset and rule numbers are 16-bit values. The 46a1dc2096SDima Dorfman * "rule ID" is a combination of the ruleset and rule number; it 47a1dc2096SDima Dorfman * should be able to univocally describe a rule in the system. In 48a1dc2096SDima Dorfman * this implementation, the upper 16 bits of the rule ID is the 49a1dc2096SDima Dorfman * ruleset number; the lower 16 bits, the rule number within the 50a1dc2096SDima Dorfman * aforementioned ruleset. 51a1dc2096SDima Dorfman */ 52a1dc2096SDima Dorfman typedef uint16_t devfs_rnum; 53a1dc2096SDima Dorfman typedef uint16_t devfs_rsnum; 54a1dc2096SDima Dorfman typedef uint32_t devfs_rid; 55a1dc2096SDima Dorfman 56a1dc2096SDima Dorfman /* 57a1dc2096SDima Dorfman * Identifier manipulators. 58a1dc2096SDima Dorfman */ 59a1dc2096SDima Dorfman #define rid2rsn(rid) ((rid) >> 16) 60a1dc2096SDima Dorfman #define rid2rn(rid) ((rid) & 0xffff) 61a1dc2096SDima Dorfman #define mkrid(rsn, rn) ((rn) | ((rsn) << 16)) 62a1dc2096SDima Dorfman 63a1dc2096SDima Dorfman /* 64a1dc2096SDima Dorfman * Plain DEVFS rule. This gets shared between kernel and userland 65a1dc2096SDima Dorfman * verbatim, so it shouldn't contain any pointers or other kernel- or 66a1dc2096SDima Dorfman * userland-specific values. 67a1dc2096SDima Dorfman */ 68a1dc2096SDima Dorfman struct devfs_rule { 69a1dc2096SDima Dorfman uint32_t dr_magic; /* Magic number. */ 70a1dc2096SDima Dorfman devfs_rid dr_id; /* Identifier. */ 71a1dc2096SDima Dorfman 72a1dc2096SDima Dorfman /* 73a1dc2096SDima Dorfman * Conditions under which this rule should be applied. These 74a1dc2096SDima Dorfman * are ANDed together since OR can be simulated by using 75a1dc2096SDima Dorfman * multiple rules. dr_icond determines which of the other 76a1dc2096SDima Dorfman * variables we should process. 77a1dc2096SDima Dorfman */ 78a1dc2096SDima Dorfman int dr_icond; 79a1dc2096SDima Dorfman #define DRC_DSWFLAGS 0x001 80a1dc2096SDima Dorfman #define DRC_PATHPTRN 0x002 81a1dc2096SDima Dorfman int dr_dswflags; /* cdevsw flags to match. */ 82a1dc2096SDima Dorfman #define DEVFS_MAXPTRNLEN 200 83a1dc2096SDima Dorfman char dr_pathptrn[DEVFS_MAXPTRNLEN]; /* Pattern to match path. */ 84a1dc2096SDima Dorfman 85a1dc2096SDima Dorfman /* 86a1dc2096SDima Dorfman * Things to change. dr_iacts determines which of the other 87a1dc2096SDima Dorfman * variables we should process. 88a1dc2096SDima Dorfman */ 89a1dc2096SDima Dorfman int dr_iacts; 90a1dc2096SDima Dorfman #define DRA_BACTS 0x001 91a1dc2096SDima Dorfman #define DRA_UID 0x002 92a1dc2096SDima Dorfman #define DRA_GID 0x004 93a1dc2096SDima Dorfman #define DRA_MODE 0x008 94a1dc2096SDima Dorfman #define DRA_INCSET 0x010 95a1dc2096SDima Dorfman int dr_bacts; /* Boolean (on/off) action. */ 96a1dc2096SDima Dorfman #define DRB_HIDE 0x001 /* Hide entry (DE_WHITEOUT). */ 97a1dc2096SDima Dorfman #define DRB_UNHIDE 0x002 /* Unhide entry. */ 98a1dc2096SDima Dorfman uid_t dr_uid; 99a1dc2096SDima Dorfman gid_t dr_gid; 100a1dc2096SDima Dorfman mode_t dr_mode; 101a1dc2096SDima Dorfman devfs_rsnum dr_incset; /* Included ruleset. */ 102a1dc2096SDima Dorfman }; 103a1dc2096SDima Dorfman 104a1dc2096SDima Dorfman /* 105a1dc2096SDima Dorfman * Rule-related ioctls. 106a1dc2096SDima Dorfman */ 107a1dc2096SDima Dorfman #define DEVFSIO_RADD _IOWR('D', 0, struct devfs_rule) 108a1dc2096SDima Dorfman #define DEVFSIO_RDEL _IOW('D', 1, devfs_rid) 109a1dc2096SDima Dorfman #define DEVFSIO_RAPPLY _IOW('D', 2, struct devfs_rule) 110a1dc2096SDima Dorfman #define DEVFSIO_RAPPLYID _IOW('D', 3, devfs_rid) 111a1dc2096SDima Dorfman #define DEVFSIO_RGETNEXT _IOWR('D', 4, struct devfs_rule) 112a1dc2096SDima Dorfman 113a1dc2096SDima Dorfman #define DEVFSIO_SUSE _IOW('D', 10, devfs_rsnum) 114a1dc2096SDima Dorfman #define DEVFSIO_SAPPLY _IOW('D', 11, devfs_rsnum) 115a1dc2096SDima Dorfman #define DEVFSIO_SGETNEXT _IOWR('D', 12, devfs_rsnum) 116a1dc2096SDima Dorfman 117a1dc2096SDima Dorfman /* XXX: DEVFSIO_RS_GET_INFO for refcount, active if any, etc. */ 118a1dc2096SDima Dorfman 119a1dc2096SDima Dorfman #ifdef _KERNEL 1203f54a085SPoul-Henning Kamp 12193bcdfe2SPoul-Henning Kamp /* 12293bcdfe2SPoul-Henning Kamp * These are default sizes for the DEVFS inode table and the overflow 12393bcdfe2SPoul-Henning Kamp * table. If the default table overflows we allocate the overflow 12493bcdfe2SPoul-Henning Kamp * table, the size of which can also be set with a sysctl. If the 12593bcdfe2SPoul-Henning Kamp * overflow table fills you're toast. 12693bcdfe2SPoul-Henning Kamp */ 12793bcdfe2SPoul-Henning Kamp #ifndef NDEVFSINO 12893bcdfe2SPoul-Henning Kamp #define NDEVFSINO 1024 12993bcdfe2SPoul-Henning Kamp #endif 13093bcdfe2SPoul-Henning Kamp 13193bcdfe2SPoul-Henning Kamp #ifndef NDEVFSOVERFLOW 13293bcdfe2SPoul-Henning Kamp #define NDEVFSOVERFLOW 32768 13393bcdfe2SPoul-Henning Kamp #endif 13493bcdfe2SPoul-Henning Kamp 13593bcdfe2SPoul-Henning Kamp /* 13693bcdfe2SPoul-Henning Kamp * This is the first "per mount" inode, these are used for directories 13793bcdfe2SPoul-Henning Kamp * and symlinks and the like. Must be larger than the number of "true" 13893bcdfe2SPoul-Henning Kamp * device nodes and symlinks. It is. 13993bcdfe2SPoul-Henning Kamp */ 14093bcdfe2SPoul-Henning Kamp #define DEVFSINOMOUNT 0x2000000 1413f54a085SPoul-Henning Kamp 1424cc62415SBruce Evans #ifdef MALLOC_DECLARE 1433f54a085SPoul-Henning Kamp MALLOC_DECLARE(M_DEVFS); 1444cc62415SBruce Evans #endif 1453f54a085SPoul-Henning Kamp 1463f54a085SPoul-Henning Kamp struct devfs_dirent { 1473f54a085SPoul-Henning Kamp int de_inode; 148a481b90bSPoul-Henning Kamp int de_flags; 1495a9300c4SPoul-Henning Kamp #define DE_WHITEOUT 0x1 150a481b90bSPoul-Henning Kamp #define DE_DOT 0x2 151a481b90bSPoul-Henning Kamp #define DE_DOTDOT 0x4 1523f54a085SPoul-Henning Kamp struct dirent *de_dirent; 1533f54a085SPoul-Henning Kamp TAILQ_ENTRY(devfs_dirent) de_list; 154a481b90bSPoul-Henning Kamp TAILQ_HEAD(, devfs_dirent) de_dlist; 155aa2f6ddcSPoul-Henning Kamp LIST_ENTRY(devfs_dirent) de_alias; 156a481b90bSPoul-Henning Kamp struct devfs_dirent *de_dir; 157a481b90bSPoul-Henning Kamp int de_links; 1583f54a085SPoul-Henning Kamp mode_t de_mode; 1593f54a085SPoul-Henning Kamp uid_t de_uid; 1603f54a085SPoul-Henning Kamp gid_t de_gid; 161eca8a663SRobert Watson struct label *de_label; 1623f54a085SPoul-Henning Kamp struct timespec de_atime; 1633f54a085SPoul-Henning Kamp struct timespec de_mtime; 1643f54a085SPoul-Henning Kamp struct timespec de_ctime; 1653f54a085SPoul-Henning Kamp struct vnode *de_vnode; 1663f54a085SPoul-Henning Kamp char *de_symlink; 1673f54a085SPoul-Henning Kamp }; 1683f54a085SPoul-Henning Kamp 1693f54a085SPoul-Henning Kamp struct devfs_mount { 170990b4b2dSRobert Watson struct mount *dm_mount; 171a481b90bSPoul-Henning Kamp struct devfs_dirent *dm_rootdir; 1723f54a085SPoul-Henning Kamp unsigned dm_generation; 1734cfe2093SPoul-Henning Kamp struct devfs_dirent **dm_dirent; 17493bcdfe2SPoul-Henning Kamp struct devfs_dirent **dm_overflow; 1753f54a085SPoul-Henning Kamp int dm_inode; 17693bcdfe2SPoul-Henning Kamp struct lock dm_lock; 177a1dc2096SDima Dorfman devfs_rsnum dm_ruleset; 1783f54a085SPoul-Henning Kamp }; 1793f54a085SPoul-Henning Kamp 1805e080af4SPoul-Henning Kamp extern unsigned devfs_rule_depth; 1815e080af4SPoul-Henning Kamp 18293bcdfe2SPoul-Henning Kamp /* 18393bcdfe2SPoul-Henning Kamp * This is what we fill in dm_dirent[N] for a deleted entry. 18493bcdfe2SPoul-Henning Kamp */ 18593bcdfe2SPoul-Henning Kamp #define DE_DELETED ((struct devfs_dirent *)sizeof(struct devfs_dirent)) 186a481b90bSPoul-Henning Kamp 1873f54a085SPoul-Henning Kamp #define VFSTODEVFS(mp) ((struct devfs_mount *)((mp)->mnt_data)) 1883f54a085SPoul-Henning Kamp 189a1dc2096SDima Dorfman void devfs_rules_apply(struct devfs_mount *dm, struct devfs_dirent *de); 190bc9d8a9aSPoul-Henning Kamp int devfs_rules_ioctl(struct mount *mp, u_long cmd, caddr_t data, struct thread *td); 191a1dc2096SDima Dorfman void devfs_rules_newmount(struct devfs_mount *dm, struct thread *td); 192b40ce416SJulian Elischer int devfs_allocv (struct devfs_dirent *de, struct mount *mp, struct vnode **vpp, struct thread *td); 19389c9c53dSPoul-Henning Kamp struct cdev **devfs_itod (int inode); 19493bcdfe2SPoul-Henning Kamp struct devfs_dirent **devfs_itode (struct devfs_mount *dm, int inode); 19593bcdfe2SPoul-Henning Kamp int devfs_populate (struct devfs_mount *dm); 19693bcdfe2SPoul-Henning Kamp struct devfs_dirent *devfs_newdirent (char *name, int namelen); 19793bcdfe2SPoul-Henning Kamp void devfs_purge (struct devfs_dirent *dd); 19893bcdfe2SPoul-Henning Kamp struct devfs_dirent *devfs_vmkdir (char *name, int namelen, struct devfs_dirent *dotdot); 19993bcdfe2SPoul-Henning Kamp 2003f54a085SPoul-Henning Kamp #endif /* _KERNEL */ 2014cc62415SBruce Evans 2024cc62415SBruce Evans #endif /* !_FS_DEVFS_DEVFS_H_ */ 203