140654Smckusick /* 240654Smckusick * Copyright (c) 1990 The Regents of the University of California. 340654Smckusick * All rights reserved. 440654Smckusick * 544523Sbostic * %sccs.include.redist.c% 640654Smckusick * 7*52313Sheideman * @(#)specdev.h 7.6 (Berkeley) 02/04/92 840654Smckusick */ 940654Smckusick 1040654Smckusick /* 1140654Smckusick * This structure defines the information maintained about 1240654Smckusick * special devices. It is allocated in checkalias and freed 1340654Smckusick * in vgone. 1440654Smckusick */ 1540654Smckusick struct specinfo { 1640654Smckusick struct vnode **si_hashchain; 1740654Smckusick struct vnode *si_specnext; 1840654Smckusick long si_flags; 1940654Smckusick dev_t si_rdev; 2040654Smckusick }; 2140654Smckusick /* 2240654Smckusick * Exported shorthand 2340654Smckusick */ 2440654Smckusick #define v_rdev v_specinfo->si_rdev 2540654Smckusick #define v_hashchain v_specinfo->si_hashchain 2640654Smckusick #define v_specnext v_specinfo->si_specnext 2740654Smckusick #define v_specflags v_specinfo->si_flags 2840654Smckusick 2940654Smckusick /* 3040654Smckusick * Flags for specinfo 3140654Smckusick */ 3240654Smckusick #define SI_MOUNTEDON 0x0001 /* block special device is mounted on */ 3340654Smckusick 3440654Smckusick /* 3540654Smckusick * Special device management 3640654Smckusick */ 3740654Smckusick #define SPECHSZ 64 3840654Smckusick #if ((SPECHSZ&(SPECHSZ-1)) == 0) 3940654Smckusick #define SPECHASH(rdev) (((rdev>>5)+(rdev))&(SPECHSZ-1)) 4040654Smckusick #else 4140654Smckusick #define SPECHASH(rdev) (((unsigned)((rdev>>5)+(rdev)))%SPECHSZ) 4240654Smckusick #endif 4340654Smckusick 4440654Smckusick struct vnode *speclisth[SPECHSZ]; 4548009Smckusick 4648009Smckusick /* 4748009Smckusick * Prototypes for special file operations on vnodes. 4848009Smckusick */ 4948363Smckusick struct nameidata; 50*52313Sheideman struct componentname; 5148363Smckusick struct ucred; 5248363Smckusick struct flock; 5348363Smckusick struct buf; 5448363Smckusick struct uio; 5548363Smckusick 5648009Smckusick int spec_badop(), 5748009Smckusick spec_ebadf(); 5848009Smckusick 5948009Smckusick int spec_lookup __P(( 60*52313Sheideman struct vnode *dvp, 61*52313Sheideman struct vnode **vpp, 62*52313Sheideman struct componentname *cnp)); 6348009Smckusick #define spec_create ((int (*) __P(( \ 64*52313Sheideman struct vnode *dvp, \ 65*52313Sheideman struct vnode **vpp, \ 66*52313Sheideman struct componentname *cnp, \ 67*52313Sheideman struct vattr *vap))) spec_badop) 6848009Smckusick #define spec_mknod ((int (*) __P(( \ 69*52313Sheideman struct vnode *dvp, \ 70*52313Sheideman struct vnode **vpp, \ 71*52313Sheideman struct componentname *cnp, \ 72*52313Sheideman struct vattr *vap))) spec_badop) 7348009Smckusick int spec_open __P(( 7448009Smckusick struct vnode *vp, 7548009Smckusick int mode, 7648009Smckusick struct ucred *cred, 7748009Smckusick struct proc *p)); 7848009Smckusick int spec_close __P(( 7948009Smckusick struct vnode *vp, 8048009Smckusick int fflag, 8148009Smckusick struct ucred *cred, 8248009Smckusick struct proc *p)); 8348009Smckusick #define spec_access ((int (*) __P(( \ 8448009Smckusick struct vnode *vp, \ 8548009Smckusick int mode, \ 8648009Smckusick struct ucred *cred, \ 8748009Smckusick struct proc *p))) spec_ebadf) 8848009Smckusick #define spec_getattr ((int (*) __P(( \ 8948009Smckusick struct vnode *vp, \ 9048009Smckusick struct vattr *vap, \ 9148009Smckusick struct ucred *cred, \ 9248009Smckusick struct proc *p))) spec_ebadf) 9348009Smckusick #define spec_setattr ((int (*) __P(( \ 9448009Smckusick struct vnode *vp, \ 9548009Smckusick struct vattr *vap, \ 9648009Smckusick struct ucred *cred, \ 9748009Smckusick struct proc *p))) spec_ebadf) 9848009Smckusick int spec_read __P(( 9948009Smckusick struct vnode *vp, 10048009Smckusick struct uio *uio, 10148009Smckusick int ioflag, 10248009Smckusick struct ucred *cred)); 10348009Smckusick int spec_write __P(( 10448009Smckusick struct vnode *vp, 10548009Smckusick struct uio *uio, 10648009Smckusick int ioflag, 10748009Smckusick struct ucred *cred)); 10848009Smckusick int spec_ioctl __P(( 10948009Smckusick struct vnode *vp, 11048009Smckusick int command, 11148009Smckusick caddr_t data, 11248009Smckusick int fflag, 11348009Smckusick struct ucred *cred, 11448009Smckusick struct proc *p)); 11548009Smckusick int spec_select __P(( 11648009Smckusick struct vnode *vp, 11748009Smckusick int which, 11848009Smckusick int fflags, 11948009Smckusick struct ucred *cred, 12048009Smckusick struct proc *p)); 12148009Smckusick #define spec_mmap ((int (*) __P(( \ 12248009Smckusick struct vnode *vp, \ 12348009Smckusick int fflags, \ 12448009Smckusick struct ucred *cred, \ 12548009Smckusick struct proc *p))) spec_badop) 12648009Smckusick #define spec_fsync ((int (*) __P(( \ 12748009Smckusick struct vnode *vp, \ 12848009Smckusick int fflags, \ 12948009Smckusick struct ucred *cred, \ 13048009Smckusick int waitfor, \ 13148009Smckusick struct proc *p))) nullop) 13248009Smckusick #define spec_seek ((int (*) __P(( \ 13348009Smckusick struct vnode *vp, \ 13448009Smckusick off_t oldoff, \ 13548009Smckusick off_t newoff, \ 13648009Smckusick struct ucred *cred))) spec_badop) 13748009Smckusick #define spec_remove ((int (*) __P(( \ 138*52313Sheideman struct vnode *dvp, \ 139*52313Sheideman struct vnode *vp, \ 140*52313Sheideman struct componentname *cnp))) spec_badop) 14148009Smckusick #define spec_link ((int (*) __P(( \ 142*52313Sheideman register struct vnode *vp, \ 143*52313Sheideman struct vnode *tdvp, \ 144*52313Sheideman struct componentname *cnp))) spec_badop) 14548009Smckusick #define spec_rename ((int (*) __P(( \ 146*52313Sheideman struct vnode *fdvp, \ 147*52313Sheideman struct vnode *fvp, \ 148*52313Sheideman struct componentname *fcnp, \ 149*52313Sheideman struct vnode *tdvp, \ 150*52313Sheideman struct vnode *tvp, \ 151*52313Sheideman struct componentname *tcnp))) spec_badop) 15248009Smckusick #define spec_mkdir ((int (*) __P(( \ 153*52313Sheideman struct vnode *dvp, \ 154*52313Sheideman struct vnode **vpp, \ 155*52313Sheideman struct componentname *cnp, \ 156*52313Sheideman struct vattr *vap))) spec_badop) 15748009Smckusick #define spec_rmdir ((int (*) __P(( \ 158*52313Sheideman struct vnode *dvp, \ 159*52313Sheideman struct vnode *vp, \ 160*52313Sheideman struct componentname *cnp))) spec_badop) 16148009Smckusick #define spec_symlink ((int (*) __P(( \ 162*52313Sheideman struct vnode *dvp, \ 163*52313Sheideman struct vnode **vpp, \ 164*52313Sheideman struct componentname *cnp, \ 16548009Smckusick struct vattr *vap, \ 166*52313Sheideman char *target))) spec_badop) 16748009Smckusick #define spec_readdir ((int (*) __P(( \ 16848009Smckusick struct vnode *vp, \ 16948009Smckusick struct uio *uio, \ 17048009Smckusick struct ucred *cred, \ 17148009Smckusick int *eofflagp))) spec_badop) 17248009Smckusick #define spec_readlink ((int (*) __P(( \ 17348009Smckusick struct vnode *vp, \ 17448009Smckusick struct uio *uio, \ 17548009Smckusick struct ucred *cred))) spec_badop) 17648009Smckusick #define spec_abortop ((int (*) __P(( \ 177*52313Sheideman struct vnode *dvp, \ 178*52313Sheideman struct componentname *cnp))) spec_badop) 17948009Smckusick #define spec_inactive ((int (*) __P(( \ 18048009Smckusick struct vnode *vp, \ 18148009Smckusick struct proc *p))) nullop) 18248009Smckusick #define spec_reclaim ((int (*) __P(( \ 18348009Smckusick struct vnode *vp))) nullop) 18448009Smckusick int spec_lock __P(( 18548009Smckusick struct vnode *vp)); 18648009Smckusick int spec_unlock __P(( 18748009Smckusick struct vnode *vp)); 18848009Smckusick int spec_bmap __P(( 18948009Smckusick struct vnode *vp, 19048009Smckusick daddr_t bn, 19148009Smckusick struct vnode **vpp, 19248009Smckusick daddr_t *bnp)); 19348009Smckusick int spec_strategy __P(( 19448009Smckusick struct buf *bp)); 19548009Smckusick int spec_print __P(( 19648009Smckusick struct vnode *vp)); 19748009Smckusick #define spec_islocked ((int (*) __P(( \ 19848009Smckusick struct vnode *vp))) nullop) 19948009Smckusick int spec_advlock __P(( 20048009Smckusick struct vnode *vp, 20148009Smckusick caddr_t id, 20248009Smckusick int op, 20348009Smckusick struct flock *fl, 20448009Smckusick int flags)); 20551555Smckusick #define spec_blkatoff ((int (*) __P(( \ 20651555Smckusick struct vnode *vp, \ 20751555Smckusick off_t offset, \ 20851555Smckusick char **res, \ 20951555Smckusick struct buf **bpp))) spec_badop) 21051555Smckusick #define spec_vget ((int (*) __P(( \ 21151555Smckusick struct mount *mp, \ 21251555Smckusick ino_t ino, \ 21351555Smckusick struct vnode **vpp))) spec_badop) 21451555Smckusick #define spec_valloc ((int (*) __P(( \ 21551555Smckusick struct vnode *pvp, \ 21651555Smckusick int mode, \ 21751555Smckusick struct ucred *cred, \ 21851555Smckusick struct vnode **vpp))) spec_badop) 21951555Smckusick #define spec_vfree ((void (*) __P(( \ 22051555Smckusick struct vnode *pvp, \ 22151555Smckusick ino_t ino, \ 22251555Smckusick int mode))) spec_badop) 22351555Smckusick #define spec_truncate ((int (*) __P(( \ 22451555Smckusick struct vnode *vp, \ 22551555Smckusick u_long length, \ 22651555Smckusick int flags))) nullop) 22751555Smckusick #define spec_update ((int (*) __P(( \ 22851555Smckusick struct vnode *vp, \ 22951555Smckusick struct timeval *ta, \ 23051555Smckusick struct timeval *tm, \ 23151555Smckusick int waitfor))) nullop) 23251555Smckusick #define spec_bwrite ((int (*) __P(( \ 23351555Smckusick struct buf *bp))) nullop) 234