1 /* $NetBSD: specdev.h,v 1.39 2009/11/14 18:36:57 elad Exp $ */ 2 3 /*- 4 * Copyright (c) 2008 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 /* 30 * Copyright (c) 1990, 1993 31 * The Regents of the University of California. All rights reserved. 32 * 33 * Redistribution and use in source and binary forms, with or without 34 * modification, are permitted provided that the following conditions 35 * are met: 36 * 1. Redistributions of source code must retain the above copyright 37 * notice, this list of conditions and the following disclaimer. 38 * 2. Redistributions in binary form must reproduce the above copyright 39 * notice, this list of conditions and the following disclaimer in the 40 * documentation and/or other materials provided with the distribution. 41 * 3. Neither the name of the University nor the names of its contributors 42 * may be used to endorse or promote products derived from this software 43 * without specific prior written permission. 44 * 45 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 46 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 47 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 48 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 49 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 55 * SUCH DAMAGE. 56 * 57 * @(#)specdev.h 8.6 (Berkeley) 5/21/95 58 */ 59 60 #ifndef _MISCFS_SPECFS_SPECDEV_H_ 61 #define _MISCFS_SPECFS_SPECDEV_H_ 62 63 #include <sys/mutex.h> 64 #include <sys/vnode.h> 65 66 typedef struct specnode { 67 vnode_t *sn_next; 68 struct specdev *sn_dev; 69 u_int sn_opencnt; 70 dev_t sn_rdev; 71 bool sn_gone; 72 } specnode_t; 73 74 typedef struct specdev { 75 struct mount *sd_mountpoint; 76 struct lockf *sd_lockf; 77 vnode_t *sd_bdevvp; 78 u_int sd_opencnt; 79 u_int sd_refcnt; 80 dev_t sd_rdev; 81 } specdev_t; 82 83 /* 84 * Exported shorthand 85 */ 86 #define v_specnext v_specnode->sn_next 87 #define v_rdev v_specnode->sn_rdev 88 #define v_speclockf v_specnode->sn_dev->sd_lockf 89 #define v_specmountpoint v_specnode->sn_dev->sd_mountpoint 90 91 /* 92 * Special device management 93 */ 94 #define SPECHSZ 64 95 #if ((SPECHSZ&(SPECHSZ-1)) == 0) 96 #define SPECHASH(rdev) (((rdev>>5)+(rdev))&(SPECHSZ-1)) 97 #else 98 #define SPECHASH(rdev) (((unsigned)((rdev>>5)+(rdev)))%SPECHSZ) 99 #endif 100 101 extern vnode_t *specfs_hash[SPECHSZ]; 102 103 void spec_node_init(vnode_t *, dev_t); 104 void spec_node_destroy(vnode_t *); 105 void spec_node_revoke(vnode_t *); 106 107 /* 108 * Prototypes for special file operations on vnodes. 109 */ 110 extern int (**spec_vnodeop_p)(void *); 111 struct nameidata; 112 struct componentname; 113 struct flock; 114 struct buf; 115 struct uio; 116 117 int spec_lookup(void *); 118 #define spec_create genfs_badop 119 #define spec_mknod genfs_badop 120 int spec_open(void *); 121 int spec_close(void *); 122 #define spec_access genfs_ebadf 123 #define spec_getattr genfs_ebadf 124 #define spec_setattr genfs_ebadf 125 int spec_read(void *); 126 int spec_write(void *); 127 #define spec_fcntl genfs_fcntl 128 int spec_ioctl(void *); 129 int spec_poll(void *); 130 int spec_kqfilter(void *); 131 #define spec_revoke genfs_revoke 132 int spec_mmap(void *); 133 int spec_fsync(void *); 134 #define spec_seek genfs_nullop /* XXX should query device */ 135 #define spec_remove genfs_badop 136 #define spec_link genfs_badop 137 #define spec_rename genfs_badop 138 #define spec_mkdir genfs_badop 139 #define spec_rmdir genfs_badop 140 #define spec_symlink genfs_badop 141 #define spec_readdir genfs_badop 142 #define spec_readlink genfs_badop 143 #define spec_abortop genfs_badop 144 #define spec_reclaim genfs_nullop 145 int spec_inactive(void *); 146 #define spec_lock genfs_nolock 147 #define spec_unlock genfs_nounlock 148 int spec_bmap(void *); 149 int spec_strategy(void *); 150 int spec_print(void *); 151 #define spec_islocked genfs_noislocked 152 int spec_pathconf(void *); 153 int spec_advlock(void *); 154 #define spec_bwrite vn_bwrite 155 #define spec_getpages genfs_getpages 156 #define spec_putpages genfs_putpages 157 158 bool iskmemvp(struct vnode *); 159 void spec_init(void); 160 161 #endif /* _MISCFS_SPECFS_SPECDEV_H_ */ 162