#ifndef _SYS_VNODE_H_
#define _SYS_VNODE_H_
#if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
#ifndef _SYS_QUEUE_H_
#include <sys/queue.h>
#endif
#ifndef _SYS_LOCK_H_
#include <sys/lock.h>
#endif
#ifndef _SYS_EVENT_H_
#include <sys/event.h>
#endif
#ifndef _SYS_BIOTRACK_H_
#include <sys/biotrack.h>
#endif
#ifndef _SYS__UIO_H_
#include <sys/_uio.h>
#endif
#ifndef _SYS_ACL_H_
#include <sys/acl.h>
#endif
#ifndef _SYS_NAMECACHE_H_
#include <sys/namecache.h>
#endif
#ifndef _SYS_THREAD_H_
#include <sys/thread.h>
#endif
#ifndef _SYS_VFSOPS_H_
#include <sys/vfsops.h>
#endif
#ifndef _SYS_VFSCACHE_H_
#include <sys/vfscache.h>
#endif
#ifndef _SYS_TREE_H_
#include <sys/tree.h>
#endif
#ifndef _SYS_SYSLINK_RPC_H_
#include <sys/syslink_rpc.h>
#endif
#ifndef _MACHINE_LOCK_H_
#include <machine/lock.h>
#endif
TAILQ_HEAD(buflists, buf);
struct mountctl_opt {
int o_opt;
const char *o_name;
};
RB_HEAD(buf_rb_tree, buf);
RB_HEAD(buf_rb_hash, buf);
struct vnode {
struct lock v_lock;
struct lwkt_token v_token;
struct spinlock v_spin;
int v_pbuf_count;
int v_writecount;
struct bio_track v_track_read;
struct bio_track v_track_write;
int v_opencount;
int v_flag;
struct mount *v_mount;
struct vop_ops **v_ops;
TAILQ_ENTRY(vnode) v_list;
TAILQ_ENTRY(vnode) v_nmntvnodes;
LIST_ENTRY(vnode) v_synclist;
struct buf_rb_tree v_rbclean_tree;
struct buf_rb_tree v_rbdirty_tree;
struct buf_rb_hash v_rbhash_tree;
enum vtype v_type;
int16_t v_act;
int16_t v_state;
union {
struct socket *vu_socket;
struct {
int vu_umajor;
int vu_uminor;
struct cdev *vu_cdevinfo;
SLIST_ENTRY(vnode) vu_cdevnext;
} vu_cdev;
struct fifoinfo *vu_fifoinfo;
} v_un;
off_t v_filesize;
off_t v_lazyw;
struct vm_object *v_object;
enum vtagtype v_tag;
void *v_data;
struct namecache_list v_namecache;
int v_namecache_count;
int v_auxrefs;
int v_refcnt;
struct {
struct kqinfo vpi_kqinfo;
} v_pollinfo;
struct vmresident *v_resident;
struct mount *v_pfsmp;
struct timespec v_lastwrite_ts;
};
#define v_socket v_un.vu_socket
#define v_umajor v_un.vu_cdev.vu_umajor
#define v_uminor v_un.vu_cdev.vu_uminor
#define v_rdev v_un.vu_cdev.vu_cdevinfo
#define v_cdevnext v_un.vu_cdev.vu_cdevnext
#define v_fifoinfo v_un.vu_fifoinfo
#define VROOT 0x00000001
#define VTEXT 0x00000002
#define VSYSTEM 0x00000004
#define VISTTY 0x00000008
#define VCTTYISOPEN 0x00000010
#define VCKPT 0x00000020
#define VKVABIO 0x00000040
#define VMAYHAVELOCKS 0x00000080
#define VPFSROOT 0x00000100
#define VAGE0 0x00000400
#define VAGE1 0x00000800
#define VOBJBUF 0x00002000
#define VINACTIVE 0x00004000
#define VRECLAIMED 0x00040000
#define VLASTWRITETS 0x00080000
#define VNOTSEEKABLE 0x00100000
#define VONWORKLST 0x00200000
#define VISDIRTY 0x00400000
#define VOBJDIRTY 0x00800000
#define VSWAPCACHE 0x01000000
#define VS_CACHED 0
#define VS_ACTIVE 1
#define VS_INACTIVE 2
#define VS_DYING 3
#define VREF_TERMINATE 0x80000000
#define VREF_FINALIZE 0x40000000
#define VREF_MASK 0xBFFFFFFF
#define VREFCNT(vp) ((int)((vp)->v_refcnt & VREF_MASK))
#define VMSC_GETVP 0x01
#define VMSC_GETVX 0x02
#define VMSC_NOWAIT 0x10
#define VMSC_ONEPASS 0x20
#define IO_UNIT 0x0001
#define IO_APPEND 0x0002
#define IO_SYNC 0x0004
#define IO_NODELOCKED 0x0008
#define IO_NDELAY 0x0010
#define IO_VMIO 0x0020
#define IO_INVAL 0x0040
#define IO_ASYNC 0x0080
#define IO_DIRECT 0x0100
#define IO_RECURSE 0x0200
#define IO_CORE 0x0400
#define IO_NRDELAY 0x0800
#define IO_SEQMAX 0x7F
#define IO_SEQSHIFT 16
#define VSUID 04000
#define VSGID 02000
#define VSVTX 01000
#define VREAD 00400
#define VWRITE 00200
#define VEXEC 00100
#define VNOVAL (-1)
#define VLKTIMEOUT (hz / 20 + 1)
TAILQ_HEAD(freelst, vnode);
struct vnode_index {
struct freelst active_list;
struct vnode active_rover;
struct freelst inactive_list;
struct spinlock spin;
int deac_rover;
int free_rover;
} __cachealign;
#ifdef _KERNEL
extern enum vtype iftovt_tab[];
extern int vttoif_tab[];
#define IFTOVT(mode) (iftovt_tab[((mode) & S_IFMT) >> 12])
#define VTTOIF(indx) (vttoif_tab[(int)(indx)])
#define MAKEIMODE(indx, mode) (int)(VTTOIF(indx) | (mode))
#define SKIPSYSTEM 0x0001
#define FORCECLOSE 0x0002
#define WRITECLOSE 0x0004
#define DOCLOSE 0x0008
#define V_SAVE 0x0001
#ifdef DIAGNOSTIC
#define VATTR_NULL(vap) vattr_null(vap)
#else
#define VATTR_NULL(vap) (*(vap) = va_null)
#endif
#define NULLVP ((struct vnode *)NULL)
#define VNODEOP_SET(f) \
SYSINIT(f##init, SI_SUB_VFS, SI_ORDER_SECOND, vfs_nadd_vnodeops_sysinit, &f); \
SYSUNINIT(f##uninit, SI_SUB_VFS, SI_ORDER_SECOND,vfs_nrm_vnodeops_sysinit, &f)
#define NVEXTF_TRIVIAL 0x0001
#define NVEXTF_BUWRITE 0x0002
struct objcache;
extern struct vnode *rootvnode;
extern struct nchandle rootnch;
extern int maxvnodes;
extern time_t syncdelay;
extern time_t filedelay;
extern time_t dirdelay;
extern time_t metadelay;
extern struct objcache *namei_oc;
extern int prtactive;
extern struct vattr va_null;
extern int numvnodes;
extern int inactivevnodes;
extern int activevnodes;
#define VOPARG_OFFSET(p_type,field) \
((int) (((char *) (&(((p_type)NULL)->field))) - ((char *) NULL)))
#define VOPARG_OFFSETOF(s_type,field) \
VOPARG_OFFSET(s_type*,field)
#define VOPARG_OFFSETTO(S_TYPE,S_OFFSET,STRUCT_P) \
((S_TYPE)(((char*)(STRUCT_P))+(S_OFFSET)))
typedef int (*vnodeopv_entry_t)(struct vop_generic_args *);
typedef int (*vocall_func_t)(struct vop_generic_args *);
#define VOCALL(vops, ap) \
(*(vocall_func_t *)((char *)(vops)+((ap)->a_desc->sd_offset)))(ap)
#define VDESC(OP) (& __CONCAT(OP,_desc))
struct file;
struct mount;
struct nlookupdata;
struct proc;
struct thread;
struct stat;
struct ucred;
struct uio;
struct vattr;
struct vnode;
struct syncer_ctx;
struct vfsops;
struct vnode *getsynthvnode(const char *devname);
void addaliasu (struct vnode *vp, int x, int y);
int v_associate_rdev(struct vnode *vp, cdev_t dev);
void v_release_rdev(struct vnode *vp);
int bdevvp (cdev_t dev, struct vnode **vpp);
struct vnode *allocvnode(int lktimeout, int lkflags);
void allocvnode_gc(void);
int freesomevnodes(int count);
int getnewvnode (enum vtagtype tag, struct mount *mp,
struct vnode **vpp, int timo, int lkflags);
int getspecialvnode (enum vtagtype tag, struct mount *mp,
struct vop_ops **ops, struct vnode **vpp, int timo,
int lkflags);
void speedup_syncer (struct mount *mp);
void trigger_syncer (struct mount *mp);
void trigger_syncer_start (struct mount *mp);
void trigger_syncer_stop (struct mount *mp);
int vaccess(enum vtype, mode_t, uid_t, gid_t, mode_t, struct ucred *);
void vattr_null (struct vattr *vap);
int vcount (struct vnode *vp);
void vfs_nadd_vnodeops_sysinit (void *);
void vfs_nrm_vnodeops_sysinit (void *);
void vfs_add_vnodeops(struct mount *, struct vop_ops *, struct vop_ops **);
void vfs_rm_vnodeops(struct mount *, struct vop_ops *, struct vop_ops **);
int vflush (struct mount *mp, int rootrefs, int flags);
int vmntvnodescan(struct mount *mp, int flags,
int (*fastfunc)(struct mount *mp, struct vnode *vp, void *data),
int (*slowfunc)(struct mount *mp, struct vnode *vp, void *data),
void *data);
int vsyncscan(struct mount *mp, int flags,
int (*slowfunc)(struct mount *mp, struct vnode *vp, void *data),
void *data);
void vclrisdirty(struct vnode *vp);
void vclrobjdirty(struct vnode *vp);
void vsetisdirty(struct vnode *vp);
void vsetobjdirty(struct vnode *vp);
void insmntque(struct vnode *vp, struct mount *mp);
void vclean_unlocked (struct vnode *vp);
void vgone_vxlocked (struct vnode *vp);
int vrevoke (struct vnode *vp, struct ucred *cred);
int vinvalbuf (struct vnode *vp, int save, int slpflag, int slptimeo);
int vtruncbuf (struct vnode *vp, off_t length, int blksize);
void vnode_pager_setsize (struct vnode *, vm_ooffset_t);
int nvtruncbuf (struct vnode *vp, off_t length, int blksize, int boff,
int flags);
int nvextendbuf(struct vnode *vp, off_t olength, off_t nlength,
int oblksize, int nblksize,
int oboff, int nboff, int flags);
void nvnode_pager_setsize (struct vnode *vp, off_t length,
int blksize, int boff);
int vfsync(struct vnode *vp, int waitfor, int passes,
int (*checkdef)(struct buf *),
int (*waitoutput)(struct vnode *, struct thread *));
int vinitvmio(struct vnode *vp, off_t filesize, int blksize, int boff);
void vprint (char *label, struct vnode *vp);
int vrecycle (struct vnode *vp);
int vmaxiosize (struct vnode *vp);
void vn_strategy(struct vnode *vp, struct bio *bio);
int vn_cache_strategy(struct vnode *vp, struct bio *bio);
int vn_close (struct vnode *vp, int flags, struct file *fp);
void vn_gone (struct vnode *vp);
int vn_isdisk (struct vnode *vp, int *errp);
int vn_islocked (struct vnode *vp);
int vn_islocked_unlock (struct vnode *vp);
void vn_islocked_relock (struct vnode *vp, int vpls);
int vn_lock (struct vnode *vp, int flags);
void vn_unlock (struct vnode *vp);
int vn_relock (struct vnode *vp, int flags);
#ifdef DEBUG_VN_UNLOCK
void debug_vn_unlock (struct vnode *vp,
const char *filename, int line);
#define vn_unlock(vp) debug_vn_unlock(vp, __FILE__, __LINE__)
#endif
int vn_get_namelen(struct vnode *, int *);
void vn_setspecops (struct file *fp);
int vn_fullpath (struct proc *p, struct vnode *vn, char **retbuf, char **freebuf, int guess);
int vn_open (struct nlookupdata *ndp, struct file **fpp, int fmode, int cmode);
int vn_opendisk (const char *devname, int fmode, struct vnode **vpp);
int vn_rdwr (enum uio_rw rw, struct vnode *vp, caddr_t base,
int len, off_t offset, enum uio_seg segflg, int ioflg,
struct ucred *cred, int *aresid);
int vn_rdwr_inchunks (enum uio_rw rw, struct vnode *vp, caddr_t base,
int len, off_t offset, enum uio_seg segflg, int ioflg,
struct ucred *cred, int *aresid);
int vn_stat (struct vnode *vp, struct stat *sb, struct ucred *cred);
cdev_t vn_todev (struct vnode *vp);
void vfs_timestamp (struct timespec *);
size_t vfs_flagstostr(int flags, const struct mountctl_opt *optp, char *buf, size_t len, int *errorp);
void vn_mark_atime(struct vnode *vp, struct thread *td);
int vfs_inodehashsize(void);
int vn_writechk (struct vnode *vp);
int ncp_writechk(struct nchandle *nch);
int vop_stdopen (struct vop_open_args *ap);
int vop_stdclose (struct vop_close_args *ap);
int vop_stdgetattr_lite (struct vop_getattr_lite_args *ap);
int vop_stdmountctl(struct vop_mountctl_args *ap);
int vop_stdgetpages(struct vop_getpages_args *ap);
int vop_stdputpages(struct vop_putpages_args *ap);
int vop_stdmarkatime(struct vop_markatime_args *ap);
int vop_stdallocate(struct vop_allocate_args *ap);
int vop_stdnoread(struct vop_read_args *ap);
int vop_stdnowrite(struct vop_write_args *ap);
int vop_stdpathconf (struct vop_pathconf_args *ap);
int vop_stdfdatasync(struct vop_fdatasync_args *ap);
int vop_stdioctl(struct vop_ioctl_args *);
int vop_eopnotsupp (struct vop_generic_args *ap);
int vop_ebadf (struct vop_generic_args *ap);
int vop_einval (struct vop_generic_args *ap);
int vop_enotty (struct vop_generic_args *ap);
int vop_defaultop (struct vop_generic_args *ap);
int vop_null (struct vop_generic_args *ap);
int vop_write_dirent(int *, struct uio *, ino_t, uint8_t, uint16_t,
const char *);
int vop_compat_nresolve(struct vop_nresolve_args *ap);
int vop_compat_nlookupdotdot(struct vop_nlookupdotdot_args *ap);
int vop_compat_ncreate(struct vop_ncreate_args *ap);
int vop_compat_nmkdir(struct vop_nmkdir_args *ap);
int vop_compat_nmknod(struct vop_nmknod_args *ap);
int vop_compat_nlink(struct vop_nlink_args *ap);
int vop_compat_nsymlink(struct vop_nsymlink_args *ap);
int vop_compat_nwhiteout(struct vop_nwhiteout_args *ap);
int vop_compat_nremove(struct vop_nremove_args *ap);
int vop_compat_nrmdir(struct vop_nrmdir_args *ap);
int vop_compat_nrename(struct vop_nrename_args *ap);
void vx_downgrade (struct vnode *vp);
void vx_lock (struct vnode *vp);
void vx_unlock (struct vnode *vp);
void vx_get (struct vnode *vp);
int vx_get_nonblock (struct vnode *vp);
void vx_put (struct vnode *vp);
int vget (struct vnode *vp, int lockflag);
void vput (struct vnode *vp);
void vhold (struct vnode *);
void vdrop (struct vnode *);
void vref (struct vnode *vp);
void vref_special (struct vnode *vp);
void vrele (struct vnode *vp);
void vsetflags (struct vnode *vp, int flags);
void vclrflags (struct vnode *vp, int flags);
void vfinalize (struct vnode *vp);
#ifdef DEBUG_VPUT
void debug_vput (struct vnode *vp, const char *filename, int line);
#define vput(vp) debug_vput(vp, __FILE__, __LINE__)
#endif
void vfs_subr_init(void);
void vfs_mount_init(void);
void vfs_lock_init(void);
void mount_init(struct mount *mp, struct vfsops *ops);
void synchronizevnodecount(void);
int countcachedvnodes(void);
int countcachedandinactivevnodes(void);
void vn_syncer_add(struct vnode *, int);
void vn_syncer_remove(struct vnode *, int);
void vn_syncer_thr_create(struct mount *);
void vn_syncer_thr_stop(struct mount *);
void vn_syncer_one(struct mount *);
long vn_syncer_count(struct mount *);
int vn_bmap_seekhole_locked(struct vnode *vp, u_long cmd, off_t *off,
struct ucred *cred);
int vn_bmap_seekhole(struct vnode *vp, u_long cmd, off_t *off,
struct ucred *cred);
u_quad_t init_va_filerev(void);
extern struct vop_ops default_vnode_vops;
extern struct vop_ops dead_vnode_vops;
extern struct vop_ops *default_vnode_vops_p;
extern struct vop_ops *dead_vnode_vops_p;
#endif
#endif
#endif