X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/blobdiff_plain/ee89633d5330733056052c06919a5dd4c01347bc..aa21a6a5b63c983a247dc24e03bc413bcd5372b8:/sys/sys/vnode.h diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index d12a0429a8..bd3a241006 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -98,6 +98,14 @@ */ TAILQ_HEAD(buflists, buf); +/* + * Struct for mount options to printable formats. + */ +struct mountctl_opt { + int o_opt; + const char *o_name; +}; + /* * Range locks protect offset ranges in files and directories at a high * level, allowing the actual I/O to be broken down into smaller pieces. @@ -178,6 +186,13 @@ vrange_lock_excl(struct vnode *vp, struct vrangelock *vr, * deal with clustered cache coherency issues and, more immediately, to * protect operations associated with the kernel-managed journaling module. * + * Certain fields within the vnode structure requires v_token to be held. + * + * v_rbclean_tree + * v_rbdirty_tree + * v_rbhash_tree + * v_pollinfo + * * NOTE: The vnode operations vector, v_ops, is a double-indirect that * typically points to &v_mount->mnt_vn_use_ops. We use a double * pointer because mnt_vn_use_ops may change dynamically when e.g. @@ -224,11 +239,11 @@ struct vnode { int v_clen; /* length of current cluster */ struct vm_object *v_object; /* Place to store VM object */ struct lock v_lock; /* file/dir ops lock */ + struct lwkt_token v_token; /* structural access */ enum vtagtype v_tag; /* type of underlying data */ void *v_data; /* private data for fs */ struct namecache_list v_namecache; /* associated nc entries */ struct { - struct lwkt_token vpi_token; /* lock to protect below */ struct selinfo vpi_selinfo; /* identity of poller(s) */ short vpi_events; /* what they are looking for */ short vpi_revents; /* what has happened */ @@ -259,30 +274,34 @@ struct vnode { /* * Vnode flags. */ -#define VROOT 0x00001 /* root of its file system */ -#define VTEXT 0x00002 /* vnode is a pure text prototype */ -#define VSYSTEM 0x00004 /* vnode being used by kernel */ -#define VISTTY 0x00008 /* vnode represents a tty */ -#define VCTTYISOPEN 0x00010 /* controlling terminal tty is open */ -#define VCKPT 0x00020 /* checkpoint-restored vnode */ -#define VFSMID 0x00040 /* request FSMID update */ -#define VMAYHAVELOCKS 0x00080 /* there may be posix or flock locks on vp */ -#define VPFSROOT 0x00100 /* may be a pseudo filesystem root */ -/* open for business 0x00200 */ -/* open for business 0x00400 */ -/* open for business 0x00800 */ -#define VCACHED 0x01000 /* No active references but has cache value */ -#define VOBJBUF 0x02000 /* Allocate buffers in VM object */ -#define VINACTIVE 0x04000 /* The vnode is inactive (did VOP_INACTIVE) */ -#define VAGE 0x08000 /* Insert vnode at head of free list */ -#define VOLOCK 0x10000 /* vnode is locked waiting for an object */ -#define VOWANT 0x20000 /* a process is waiting for VOLOCK */ -#define VRECLAIMED 0x40000 /* This vnode has been destroyed */ -#define VFREE 0x80000 /* This vnode is on the freelist */ -/* open for business 0x100000 */ -#define VONWORKLST 0x200000 /* On syncer work-list */ -#define VMOUNT 0x400000 /* Mount in progress */ -#define VOBJDIRTY 0x800000 /* object might be dirty */ +#define VROOT 0x00000001 /* root of its file system */ +#define VTEXT 0x00000002 /* vnode is a pure text prototype */ +#define VSYSTEM 0x00000004 /* vnode being used by kernel */ +#define VISTTY 0x00000008 /* vnode represents a tty */ +#define VCTTYISOPEN 0x00000010 /* controlling terminal tty is open */ +#define VCKPT 0x00000020 /* checkpoint-restored vnode */ +#define VFSMID 0x00000040 /* request FSMID update */ +#define VMAYHAVELOCKS 0x00000080 /* maybe posix or flock locks on vp */ +#define VPFSROOT 0x00000100 /* may be a pseudo filesystem root */ +/* open for business 0x00000200 */ +/* open for business 0x00000400 */ +/* open for business 0x00000800 */ +#define VCACHED 0x00001000 /* No active references but has cache value */ +#define VOBJBUF 0x00002000 /* Allocate buffers in VM object */ +#define VINACTIVE 0x00004000 /* The vnode is inactive (did VOP_INACTIVE) */ +#define VAGE 0x00008000 /* Insert vnode at head of free list */ +#define VOLOCK 0x00010000 /* vnode is locked waiting for an object */ +#define VOWANT 0x00020000 /* a process is waiting for VOLOCK */ +#define VRECLAIMED 0x00040000 /* This vnode has been destroyed */ +#define VFREE 0x00080000 /* This vnode is on the freelist */ +#define VNOTSEEKABLE 0x00100000 /* rd/wr ignores file offset */ +#define VONWORKLST 0x00200000 /* On syncer work-list */ +#define VMOUNT 0x00400000 /* Mount in progress */ +#define VOBJDIRTY 0x00800000 /* object might be dirty */ + +#define VMP_READ 0x01000000 /* supports MPSAFE read */ +#define VMP_WRITE 0x02000000 /* supports MPSAFE write */ +#define VMP_GETATTR 0x04000000 /* supports MPSAFE getattr */ /* * vmntvnodescan() flags @@ -314,14 +333,7 @@ struct vnode { /* * Modes. Note that these V-modes must match file S_I*USR, SUID, SGID, * and SVTX flag bits. - * - * VOWN, VCREATE, VDELETE, and VEXCL may only be used in naccess() calls. */ -#define VOWN 0100000 /* succeed if file owner or (other flags) */ -#define VDELETE 040000 /* delete if the file/dir exists */ -#define VCREATE 020000 /* create if the file/dir does not exist */ -#define VEXCL 010000 /* error if the file/dir already exists */ - #define VSUID 04000 /* set user id on execution */ #define VSGID 02000 /* set group id on execution */ #define VSVTX 01000 /* save swapped text even after use */ @@ -359,7 +371,6 @@ extern int vttoif_tab[]; #define WRITECLOSE 0x0004 /* vflush: only close writable files */ #define DOCLOSE 0x0008 /* vclean: close active files */ #define V_SAVE 0x0001 /* vinvalbuf: sync file first */ -#define REVOKEALL 0x0001 /* vop_revoke: revoke all aliases */ #ifdef DIAGNOSTIC #define VATTR_NULL(vap) vattr_null(vap) @@ -460,7 +471,6 @@ int getnewvnode (enum vtagtype tag, struct mount *mp, int getspecialvnode (enum vtagtype tag, struct mount *mp, struct vop_ops **ops, struct vnode **vpp, int timo, int lkflags); -int spec_vnoperate (struct vop_generic_args *); int speedup_syncer (void); void vattr_null (struct vattr *vap); int vcount (struct vnode *vp); @@ -480,6 +490,7 @@ void vclean_vxlocked (struct vnode *vp, int flags); void vclean_unlocked (struct vnode *vp); void vgone_vxlocked (struct vnode *vp); void vupdatefsmid (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); int vfsync(struct vnode *vp, int waitfor, int passes, @@ -518,18 +529,21 @@ int vn_rdwr_inchunks (enum uio_rw rw, struct vnode *vp, caddr_t base, 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 vn_writechk (struct vnode *vp, struct nchandle *nch); int ncp_writechk(struct nchandle *nch); int vop_stdopen (struct vop_open_args *ap); int vop_stdclose (struct vop_close_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_stdnoread(struct vop_read_args *ap); +int vop_stdnowrite(struct vop_write_args *ap); int vop_nopoll (struct vop_poll_args *ap); int vop_stdpathconf (struct vop_pathconf_args *ap); int vop_stdpoll (struct vop_poll_args *ap); -int vop_stdrevoke (struct vop_revoke_args *ap); int vop_eopnotsupp (struct vop_generic_args *ap); int vop_ebadf (struct vop_generic_args *ap); int vop_einval (struct vop_generic_args *ap); @@ -575,11 +589,9 @@ void vn_syncer_add_to_worklist(struct vnode *, int); void vnlru_proc_wait(void); extern struct vop_ops default_vnode_vops; -extern struct vop_ops spec_vnode_vops; extern struct vop_ops dead_vnode_vops; extern struct vop_ops *default_vnode_vops_p; -extern struct vop_ops *spec_vnode_vops_p; extern struct vop_ops *dead_vnode_vops_p; #endif /* _KERNEL */