diff --git a/sys/sys/dirent.h b/sys/sys/dirent.h index 37a8352748a8..80dd347c7b17 100644 --- a/sys/sys/dirent.h +++ b/sys/sys/dirent.h @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * from: @(#)dir.h 8.1 (Berkeley) 6/2/93 - * $Id: dirent.h,v 1.5 1994/05/23 01:14:59 cgd Exp $ + * $Id: dirent.h,v 1.6 1994/06/08 11:38:34 mycroft Exp $ */ /* @@ -48,12 +48,8 @@ struct dirent { unsigned long d_fileno; /* file number of entry */ unsigned short d_reclen; /* length of this record */ -#ifdef notdef unsigned char d_type; /* file type, see below */ unsigned char d_namlen; /* length of string in d_name */ -#else - unsigned short d_namlen; /* length of string in d_name */ -#endif #ifdef _POSIX_SOURCE char d_name[255 + 1]; /* name must be no longer than this */ #else @@ -62,7 +58,6 @@ struct dirent { #endif }; -#ifdef notyet /* * File types */ @@ -80,4 +75,3 @@ struct dirent { */ #define IFTODT(mode) (((mode) & 0170000) >> 12) #define DTTOIF(dirtype) ((dirtype) << 12) -#endif diff --git a/sys/sys/fcntl.h b/sys/sys/fcntl.h index 086efc2561b0..a2bede651ad1 100644 --- a/sys/sys/fcntl.h +++ b/sys/sys/fcntl.h @@ -1,6 +1,6 @@ /*- - * Copyright (c) 1983, 1990 The Regents of the University of California. - * All rights reserved. + * Copyright (c) 1983, 1990, 1993 + * The Regents of the University of California. All rights reserved. * (c) UNIX System Laboratories, Inc. * All or some portions of this file are derived from material licensed * to the University of California by American Telephone and Telegraph @@ -35,8 +35,8 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * from: @(#)fcntl.h 5.14 (Berkeley) 7/1/91 - * $Id: fcntl.h,v 1.4 1994/05/17 04:25:00 cgd Exp $ + * from: @(#)fcntl.h 8.3 (Berkeley) 1/21/94 + * $Id: fcntl.h,v 1.5 1994/06/08 11:38:38 mycroft Exp $ */ #ifndef _SYS_FCNTL_H_ @@ -65,11 +65,15 @@ #define O_RDWR 0x0002 /* open for reading and writing */ #define O_ACCMODE 0x0003 /* mask for above modes */ -#ifdef KERNEL /* - * Kernel encoding of open mode; separate read and write bits - * that are independently testable: 1 greater than the above. + * Kernel encoding of open mode; separate read and write bits that are + * independently testable: 1 greater than the above. + * + * XXX + * FREAD and FWRITE are excluded from the #ifdef KERNEL so that TIOCFLUSH, + * which was documented to use FREAD/FWRITE, continues to work. */ +#ifndef _POSIX_SOURCE #define FREAD 0x0001 #define FWRITE 0x0002 #endif @@ -154,11 +158,11 @@ * information passed to system by user */ struct flock { - short l_type; /* lock type: read/write, etc. */ - short l_whence; /* type of l_start */ off_t l_start; /* starting offset */ off_t l_len; /* len = 0 means until end of file */ pid_t l_pid; /* lock owner */ + short l_type; /* lock type: read/write, etc. */ + short l_whence; /* type of l_start */ }; diff --git a/sys/sys/lkm.h b/sys/sys/lkm.h index f4ef7fade2ef..da39fc729e08 100644 --- a/sys/sys/lkm.h +++ b/sys/sys/lkm.h @@ -34,7 +34,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: lkm.h,v 1.4 1994/05/05 09:43:58 mycroft Exp $ + * $Id: lkm.h,v 1.5 1994/06/08 11:38:41 mycroft Exp $ */ #ifndef _SYS_LKM_H_ @@ -80,7 +80,9 @@ struct lkm_vfs { int lkm_ver; char *lkm_name; u_long lkm_offset; +#if 0 u_long lkm_flags; +#endif struct vfsops *lkm_vfsops; }; diff --git a/sys/sys/mount.h b/sys/sys/mount.h index b4f4d12006fc..bd9abb9eea85 100644 --- a/sys/sys/mount.h +++ b/sys/sys/mount.h @@ -1,6 +1,6 @@ /* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. + * Copyright (c) 1989, 1991, 1993 + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,12 +30,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * from: @(#)mount.h 7.22 (Berkeley) 6/3/91 - * $Id: mount.h,v 1.30 1994/05/11 18:50:39 chopps Exp $ + * from: @(#)mount.h 8.13 (Berkeley) 3/27/94 + * $Id: mount.h,v 1.31 1994/06/08 11:38:45 mycroft Exp $ */ -#ifndef _SYS_MOUNT_H_ -#define _SYS_MOUNT_H_ +#ifndef KERNEL +#include +#endif #include typedef struct { long val[2]; } fsid_t; /* file system id type */ @@ -79,27 +80,27 @@ struct statfs { /* * File system types. */ -#define MOUNT_EXPORT ((char *)0) /* use this for exporting (mountd) */ - #define MOUNT_UFS "ufs" /* UNIX "Fast" Filesystem */ #define MOUNT_NFS "nfs" /* Network Filesystem */ #define MOUNT_MFS "mfs" /* Memory Filesystem */ #define MOUNT_MSDOS "msdos" /* MSDOS Filesystem */ -#define MOUNT_ISOFS "isofs" /* iso9660 cdrom */ -#define MOUNT_FDESC "fdesc" /* /dev/fd filesystem */ -#define MOUNT_KERNFS "kernfs" /* kernel variable filesystem */ -/* XXX SLOT 8 IS CURRENTLY EMPTY */ -/* XXX SLOT 9 IS CURRENTLY EMPTY */ -#define MOUNT_PROCFS "procfs" /* proc filesystem */ -#define MOUNT_LOFS "lofs" /* loopback filesystem */ -#define MOUNT_PORTAL "portal" /* portal filesystem */ -#define MOUNT_ADOSFS "adosfs" /* amigados filesystem */ +#define MOUNT_LFS "lfs" /* Log-based Filesystem */ +#define MOUNT_LOFS "lofs" /* Loopback filesystem */ +#define MOUNT_FDESC "fdesc" /* File Descriptor Filesystem */ +#define MOUNT_PORTAL "portal" /* Portal Filesystem */ +#define MOUNT_NULL "null" /* Minimal Filesystem Layer */ +#define MOUNT_UMAP "umap" /* User/Group Identifier Remapping Filesystem */ +#define MOUNT_KERNFS "kernfs" /* Kernel Information Filesystem */ +#define MOUNT_PROCFS "procfs" /* /proc Filesystem */ +#define MOUNT_AFS "afs" /* Andrew Filesystem */ +#define MOUNT_CD9660 "cd9660" /* ISO9660 (aka CDROM) Filesystem */ +#define MOUNT_UNION "union" /* Union (translucent) Filesystem */ +#define MOUNT_ADOSFS "adosfs" /* AmigaDOS Filesystem */ /* - * Structure per mounted file system. - * Each mounted file system has an array of - * operations and an instance record. - * The file systems are put on a doubly linked list. + * Structure per mounted file system. Each mounted file system has an + * array of operations and an instance record. The file systems are + * put on a doubly linked list. */ LIST_HEAD(vnodelst, vnode); @@ -109,7 +110,7 @@ struct mount { struct vnode *mnt_vnodecovered; /* vnode we mounted on */ struct vnodelst mnt_vnodelist; /* list of vnodes this mount */ int mnt_flag; /* flags */ - uid_t mnt_exroot; /* exported mapping for uid 0 */ + int mnt_maxsymlinklen; /* max size of short symlink */ struct statfs mnt_stat; /* cache of filesystem stats */ qaddr_t mnt_data; /* private data */ }; @@ -125,19 +126,23 @@ struct mount { #define MNT_NOSUID 0x00000008 /* don't honor setuid bits on fs */ #define MNT_NODEV 0x00000010 /* don't interpret special files */ #define MNT_UNION 0x00000020 /* union with underlying filesystem */ -#define MNT_NOCREATE 0x00000040 /* don't allow filename creation */ +#define MNT_ASYNC 0x00000040 /* file system written asynchronously */ /* * exported mount flags. */ +#define MNT_EXRDONLY 0x00000080 /* exported read only */ #define MNT_EXPORTED 0x00000100 /* file system is exported */ -#define MNT_EXRDONLY 0x00000200 /* exported read only */ +#define MNT_DEFEXPORTED 0x00000200 /* exported to the world */ +#define MNT_EXPORTANON 0x00000400 /* use anon uid mapping for everyone */ +#define MNT_EXKERB 0x00000800 /* exported with Kerberos uid mapping */ /* * Flags set by internal operations. */ #define MNT_LOCAL 0x00001000 /* filesystem is stored locally */ #define MNT_QUOTA 0x00002000 /* quotas are enabled on filesystem */ +#define MNT_ROOTFS 0x00004000 /* identifies the root filesystem */ #define MNT_USER 0x00008000 /* mounted by a user */ /* @@ -153,11 +158,15 @@ struct mount { * and unmounts. */ #define MNT_UPDATE 0x00010000 /* not a real mount, just an update */ +#define MNT_DELEXPORT 0x00020000 /* delete export host lists */ +#define MNT_RELOAD 0x00040000 /* reload filesystem data */ +#define MNT_FORCE 0x00080000 /* force unmount or readonly change */ #define MNT_MLOCK 0x00100000 /* lock so that subtree is stable */ #define MNT_MWAIT 0x00200000 /* someone is waiting for lock */ #define MNT_MPBUSY 0x00400000 /* scan of mount point in progress */ #define MNT_MPWANT 0x00800000 /* waiting for mount point */ #define MNT_UNMOUNT 0x01000000 /* unmount in progress */ +#define MNT_WANTRDWR 0x02000000 /* want upgrade to read/write */ /* * Operations supported on mounted file system. @@ -165,6 +174,7 @@ struct mount { #ifdef KERNEL #ifdef __STDC__ struct nameidata; +struct mbuf; #endif struct vfsops { @@ -176,16 +186,19 @@ struct vfsops { int (*vfs_unmount) __P((struct mount *mp, int mntflags, struct proc *p)); int (*vfs_root) __P((struct mount *mp, struct vnode **vpp)); - /* int uid, should be uid_t */ int (*vfs_quotactl) __P((struct mount *mp, int cmds, uid_t uid, caddr_t arg, struct proc *p)); int (*vfs_statfs) __P((struct mount *mp, struct statfs *sbp, struct proc *p)); - int (*vfs_sync) __P((struct mount *mp, int waitfor)); - int (*vfs_fhtovp) __P((struct mount *mp, struct fid *fhp, + int (*vfs_sync) __P((struct mount *mp, int waitfor, + struct ucred *cred, struct proc *p)); + int (*vfs_vget) __P((struct mount *mp, ino_t ino, struct vnode **vpp)); + int (*vfs_fhtovp) __P((struct mount *mp, struct fid *fhp, + struct mbuf *nam, struct vnode **vpp, + int *exflagsp, struct ucred **credanonp)); int (*vfs_vptofh) __P((struct vnode *vp, struct fid *fhp)); - int (*vfs_init) __P(()); + int (*vfs_init) __P((void)); }; #define VFS_MOUNT(MP, PATH, DATA, NDP, P) \ @@ -195,19 +208,18 @@ struct vfsops { #define VFS_ROOT(MP, VPP) (*(MP)->mnt_op->vfs_root)(MP, VPP) #define VFS_QUOTACTL(MP,C,U,A,P) (*(MP)->mnt_op->vfs_quotactl)(MP, C, U, A, P) #define VFS_STATFS(MP, SBP, P) (*(MP)->mnt_op->vfs_statfs)(MP, SBP, P) -#define VFS_SYNC(MP, WAITFOR) (*(MP)->mnt_op->vfs_sync)(MP, WAITFOR) -#define VFS_FHTOVP(MP, FIDP, VPP) (*(MP)->mnt_op->vfs_fhtovp)(MP, FIDP, VPP) +#define VFS_SYNC(MP, WAIT, C, P) (*(MP)->mnt_op->vfs_sync)(MP, WAIT, C, P) +#define VFS_VGET(MP, INO, VPP) (*(MP)->mnt_op->vfs_vget)(MP, INO, VPP) +#define VFS_FHTOVP(MP, FIDP, NAM, VPP, EXFLG, CRED) \ + (*(MP)->mnt_op->vfs_fhtovp)(MP, FIDP, NAM, VPP, EXFLG, CRED) #define VFS_VPTOFH(VP, FIDP) (*(VP)->v_mount->mnt_op->vfs_vptofh)(VP, FIDP) #endif /* KERNEL */ /* * Flags for various system call interfaces. * - * forcibly flags for vfs_umount(). * waitfor flags to vfs_sync() and getfsstat() */ -#define MNT_FORCE 1 -#define MNT_NOFORCE 2 #define MNT_WAIT 1 #define MNT_NOWAIT 2 @@ -216,33 +228,76 @@ struct vfsops { */ struct fhandle { fsid_t fh_fsid; /* File system id of mount point */ - struct fid fh_fid; /* Id of file */ + struct fid fh_fid; /* File sys specific id */ }; typedef struct fhandle fhandle_t; +#ifdef KERNEL +#include +#include /* XXX for AF_MAX */ + /* - * Arguments to export mount + * Network address lookup element */ -struct export_args { - uid_t exroot; /* mapping for root uid */ +struct netcred { + struct radix_node netc_rnodes[2]; + int netc_exflags; + struct ucred netc_anon; }; /* - * Arguments to mount UFS + * Network export information + */ +struct netexport { + struct netcred ne_defexported; /* Default export */ + struct radix_node_head *ne_rtable[AF_MAX+1]; /* Individual exports */ +}; +#endif /* KERNEL */ + +/* + * Export arguments for local filesystem mount calls. + */ +struct export_args { + int ex_flags; /* export related flags */ + uid_t ex_root; /* mapping for root uid */ + struct ucred ex_anon; /* mapping for anonymous user */ + struct sockaddr *ex_addr; /* net address to which exported */ + int ex_addrlen; /* and the net address length */ + struct sockaddr *ex_mask; /* mask of valid bits in saddr */ + int ex_masklen; /* and the smask length */ +}; + +/* + * Arguments to mount UFS-based filesystems */ struct ufs_args { - char *fspec; /* block special device to mount */ + char *fspec; /* block special device to mount */ + struct export_args export; /* network export information */ }; /* * Arguments to mount MFS */ struct mfs_args { - char *name; /* name to export for statfs */ - caddr_t base; /* base address of file system in memory */ - u_long size; /* size of file system */ + char *fspec; /* name to export for statfs */ + struct export_args export; /* if exported MFSes are supported */ + caddr_t base; /* base of file system in memory */ + u_long size; /* size of file system */ }; +/* + * Arguments to mount ISO 9660 filesystems. + */ +struct iso_args { + char *fspec; /* block special device to mount */ + struct export_args export; /* network export info */ + int flags; /* mounting flags, see below */ + +}; +#define ISOFSMNT_NORRIP 0x00000001 /* disable Rock Ridge Ext.*/ +#define ISOFSMNT_GENS 0x00000002 /* enable generation numbers */ +#define ISOFSMNT_EXTATT 0x00000004 /* enable extended attributes */ + /* * File Handle (32 bytes for version 2), variable up to 1024 for version 3 */ @@ -257,6 +312,7 @@ typedef union nfsv2fh nfsv2fh_t; */ struct nfs_args { struct sockaddr *addr; /* file server address */ + int addrlen; /* length of address */ int sotype; /* Socket type */ int proto; /* and Protocol */ nfsv2fh_t *fh; /* File handle to be mounted */ @@ -265,70 +321,84 @@ struct nfs_args { int rsize; /* read size in bytes */ int timeo; /* initial timeout in .1 secs */ int retrans; /* times to retry send */ + int maxgrouplist; /* Max. size of group list */ + int readahead; /* # of blocks to readahead */ + int leaseterm; /* Term (sec) of lease */ + int deadthresh; /* Retrans threshold */ char *hostname; /* server's name */ }; + /* * NFS mount option flags */ -#define NFSMNT_SOFT 0x0001 /* soft mount (hard is default) */ -#define NFSMNT_WSIZE 0x0002 /* set write size */ -#define NFSMNT_RSIZE 0x0004 /* set read size */ -#define NFSMNT_TIMEO 0x0008 /* set initial timeout */ -#define NFSMNT_RETRANS 0x0010 /* set number of request retrys */ -#define NFSMNT_HOSTNAME 0x0020 /* set hostname for error printf */ -#define NFSMNT_INT 0x0040 /* allow interrupts on hard mount */ -#define NFSMNT_NOCONN 0x0080 /* Don't Connect the socket */ -#define NFSMNT_SCKLOCK 0x0100 /* Lock socket against others */ -#define NFSMNT_WANTSCK 0x0200 /* Want a socket lock */ -#define NFSMNT_SPONGY 0x0400 /* spongy mount (soft for stat and lookup) */ -#define NFSMNT_COMPRESS 0x0800 /* Compress nfs rpc xdr */ -#define NFSMNT_LOCKBITS (NFSMNT_SCKLOCK | NFSMNT_WANTSCK) - -/* - * Arguments to mount ISO 9660 filesystems. - */ -struct iso_args { - char *fspec; /* block special holding the fs to mount */ - int flags; /* mounting flags, see below */ -}; -#define ISOFSMNT_NORRIP 0x00000001 /* disable Rock Ridge Ext.*/ -#define ISOFSMNT_GENS 0x00000002 /* enable usage of generation numbers */ -#define ISOFSMNT_EXTATT 0x00000004 /* enable usage of extended attributes */ +#define NFSMNT_SOFT 0x00000001 /* soft mount (hard is default) */ +#define NFSMNT_WSIZE 0x00000002 /* set write size */ +#define NFSMNT_RSIZE 0x00000004 /* set read size */ +#define NFSMNT_TIMEO 0x00000008 /* set initial timeout */ +#define NFSMNT_RETRANS 0x00000010 /* set number of request retries */ +#define NFSMNT_MAXGRPS 0x00000020 /* set maximum grouplist size */ +#define NFSMNT_INT 0x00000040 /* allow interrupts on hard mount */ +#define NFSMNT_NOCONN 0x00000080 /* Don't Connect the socket */ +#define NFSMNT_NQNFS 0x00000100 /* Use Nqnfs protocol */ +#define NFSMNT_MYWRITE 0x00000200 /* Assume writes were mine */ +#define NFSMNT_KERB 0x00000400 /* Use Kerberos authentication */ +#define NFSMNT_DUMBTIMR 0x00000800 /* Don't estimate rtt dynamically */ +#define NFSMNT_RDIRALOOK 0x00001000 /* Do lookup with readdir (nqnfs) */ +#define NFSMNT_LEASETERM 0x00002000 /* set lease term (nqnfs) */ +#define NFSMNT_READAHEAD 0x00004000 /* set read ahead */ +#define NFSMNT_DEADTHRESH 0x00008000 /* set dead server retry thresh */ +#define NFSMNT_NQLOOKLEASE 0x00010000 /* Get lease for lookup */ +#define NFSMNT_RESVPORT 0x00020000 /* Allocate a reserved port */ +#define NFSMNT_INTERNAL 0xffe00000 /* Bits set internally */ +#define NFSMNT_MNTD 0x00200000 /* Mnt server for mnt point */ +#define NFSMNT_DISMINPROG 0x00400000 /* Dismount in progress */ +#define NFSMNT_DISMNT 0x00800000 /* Dismounted */ +#define NFSMNT_SNDLOCK 0x01000000 /* Send socket lock */ +#define NFSMNT_WANTSND 0x02000000 /* Want above */ +#define NFSMNT_RCVLOCK 0x04000000 /* Rcv socket lock */ +#define NFSMNT_WANTRCV 0x08000000 /* Want above */ +#define NFSMNT_WAITAUTH 0x10000000 /* Wait for authentication */ +#define NFSMNT_HASAUTH 0x20000000 /* Has authenticator */ +#define NFSMNT_WANTAUTH 0x40000000 /* Wants an authenticator */ +#define NFSMNT_AUTHERR 0x80000000 /* Authentication error */ /* * Arguments to mount MSDOS filesystems. */ struct msdosfs_args { - char *fspec; /* blocks special holding the fs to mount */ - uid_t uid; /* uid that owns msdosfs files */ - gid_t gid; /* gid that owns msdosfs files */ - mode_t mask; /* mask to be applied for msdosfs perms */ + char *fspec; /* blocks special holding the fs to mount */ + struct export_args export; /* network export information */ + uid_t uid; /* uid that owns msdosfs files */ + gid_t gid; /* gid that owns msdosfs files */ + mode_t mask; /* mask to be applied for msdosfs perms */ }; /* * Arguments to mount amigados filesystems. */ struct adosfs_args { - char *fspec; /* blocks special holding the fs to mount */ - uid_t uid; /* uid that owns adosfs files */ - gid_t gid; /* gid that owns adosfs files */ - mode_t mask; /* mask to be applied for msdosfs perms */ + char *fspec; /* blocks special holding the fs to mount */ + struct export_args export; /* network export information */ + uid_t uid; /* uid that owns msdosfs files */ + gid_t gid; /* gid that owns msdosfs files */ + mode_t mask; /* mask to be applied for msdosfs perms */ }; #ifdef KERNEL /* * exported vnode operations */ -struct mount *getvfs __P((fsid_t *fsid)); /* return vfs given fsid */ -void getnewfsid __P((struct mount *mp, int mtype)); /* get a uniqe fsid */ -long makefstype __P((char *type)); /* mnt type -> 'unique' number */ -void vfs_remove __P((struct mount *mp)); /* remove a vfs from mount list */ -int vfs_lock __P((struct mount *mp)); /* lock a vfs */ -void vfs_unlock __P((struct mount *mp)); /* unlock a vfs */ -struct mount *rootfs; /* ptr to root mount structure */ -extern TAILQ_HEAD(mntlist, mount) mountlist; /* mounted filesystem list */ -extern struct vfsops *vfssw[]; /* mount filesystem type table */ -extern int nvfssw; /* number of vfssw entries */ +struct mount *getvfs __P((fsid_t *)); /* return vfs given fsid */ +int vfs_export /* process mount export info */ + __P((struct mount *, struct netexport *, struct export_args *)); +struct netcred *vfs_export_lookup /* lookup host in fs export list */ + __P((struct mount *, struct netexport *, struct mbuf *)); +int vfs_lock __P((struct mount *)); /* lock a vfs */ +int vfs_mountedon __P((struct vnode *));/* is a vfs mounted on vp */ +void vfs_unlock __P((struct mount *)); /* unlock a vfs */ +extern TAILQ_HEAD(mntlist, mount) mountlist; /* mounted filesystem list */ +extern struct vfsops *vfssw[]; /* filesystem type table */ +extern int nvfssw; #else /* KERNEL */ @@ -345,5 +415,3 @@ int unmount __P((const char *, int)); __END_DECLS #endif /* KERNEL */ - -#endif /* !_SYS_MOUNT_H_ */ diff --git a/sys/sys/namei.h b/sys/sys/namei.h index 99c0897e22cf..ad6d82da50f8 100644 --- a/sys/sys/namei.h +++ b/sys/sys/namei.h @@ -1,6 +1,6 @@ /* - * Copyright (c) 1985, 1989, 1991 Regents of the University of California. - * All rights reserved. + * Copyright (c) 1985, 1989, 1991, 1993 + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,57 +30,64 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * from: @(#)namei.h 7.15 (Berkeley) 5/15/91 - * $Id: namei.h,v 1.3 1993/05/20 16:22:47 cgd Exp $ + * from: @(#)namei.h 8.2 (Berkeley) 1/4/94 + * $Id: namei.h,v 1.4 1994/06/08 11:38:48 mycroft Exp $ */ #ifndef _SYS_NAMEI_H_ -#define _SYS_NAMEI_H_ +#define _SYS_NAMEI_H_ /* * Encapsulation of namei parameters. */ struct nameidata { /* - * Arguments to namei. + * Arguments to namei/lookup. */ caddr_t ni_dirp; /* pathname pointer */ enum uio_seg ni_segflg; /* location of pathname */ - u_long ni_nameiop; /* see below */ + /* u_long ni_nameiop; namei operation */ + /* u_long ni_flags; flags to namei */ + /* struct proc *ni_proc; process requesting lookup */ /* * Arguments to lookup. */ - struct ucred *ni_cred; /* credentials */ + /* struct ucred *ni_cred; credentials */ struct vnode *ni_startdir; /* starting directory */ struct vnode *ni_rootdir; /* logical root directory */ /* - * Results + * Results: returned from/manipulated by lookup */ struct vnode *ni_vp; /* vnode of result */ struct vnode *ni_dvp; /* vnode of intermediate directory */ /* - * Shared between namei, lookup routines, and commit routines. + * Shared between namei and lookup/commit routines. */ - char *ni_pnbuf; /* pathname buffer */ long ni_pathlen; /* remaining chars in path */ - char *ni_ptr; /* current location in pathname */ - long ni_namelen; /* length of current component */ char *ni_next; /* next location in pathname */ - u_long ni_hash; /* hash value of current component */ - u_char ni_loopcnt; /* count of symlinks encountered */ - u_char ni_makeentry; /* 1 => add entry to name cache */ - u_char ni_isdotdot; /* 1 => current component name is .. */ - u_char ni_more; /* 1 => symlink needs interpretation */ + u_long ni_loopcnt; /* count of symlinks encountered */ /* - * Side effects. + * Lookup parameters: this structure describes the subset of + * information from the nameidata structure that is passed + * through the VOP interface. */ - struct ufs_specific { /* saved info for new dir entry */ - off_t ufs_endoff; /* end of useful directory contents */ - long ufs_offset; /* offset of free space in directory */ - long ufs_count; /* size of free slot in directory */ - ino_t ufs_ino; /* inode number of found directory */ - u_long ufs_reclen; /* size of found directory entry */ - } ni_ufs; + struct componentname { + /* + * Arguments to lookup. + */ + u_long cn_nameiop; /* namei operation */ + u_long cn_flags; /* flags to namei */ + struct proc *cn_proc; /* process requesting lookup */ + struct ucred *cn_cred; /* credentials */ + /* + * Shared between lookup and commit routines. + */ + char *cn_pnbuf; /* pathname buffer */ + char *cn_nameptr; /* pointer to looked up name */ + long cn_namelen; /* length of looked up component */ + u_long cn_hash; /* hash value of looked up name */ + long cn_consume; /* chars to consume in lookup() */ + } ni_cnd; }; #ifdef KERNEL @@ -93,7 +100,7 @@ struct nameidata { #define RENAME 3 /* setup for file renaming */ #define OPMASK 3 /* mask for operation */ /* - * namei operational modifiers + * namei operational modifier flags, stored in ni_cnd.flags */ #define LOCKLEAF 0x0004 /* lock inode on return */ #define LOCKPARENT 0x0008 /* want parent vnode returned locked */ @@ -116,12 +123,26 @@ struct nameidata { * name being sought. The caller is responsible for releasing the * buffer and for vrele'ing ni_startdir. */ -#define NOCROSSMOUNT 0x0100 /* do not cross mount points */ -#define REMOTE 0x0200 /* lookup for remote filesystem servers */ -#define HASBUF 0x0400 /* has allocated pathname buffer */ -#define SAVENAME 0x0800 /* save pathanme buffer */ -#define SAVESTART 0x1000 /* save starting directory */ -#define PARAMASK 0xff00 /* mask of parameter descriptors */ +#define NOCROSSMOUNT 0x00100 /* do not cross mount points */ +#define RDONLY 0x00200 /* lookup with read-only semantics */ +#define HASBUF 0x00400 /* has allocated pathname buffer */ +#define SAVENAME 0x00800 /* save pathanme buffer */ +#define SAVESTART 0x01000 /* save starting directory */ +#define ISDOTDOT 0x02000 /* current component name is .. */ +#define MAKEENTRY 0x04000 /* entry is to be added to name cache */ +#define ISLASTCN 0x08000 /* this is last component of pathname */ +#define ISSYMLINK 0x10000 /* symlink needs interpretation */ +#define PARAMASK 0xfff00 /* mask of parameter descriptors */ +/* + * Initialization of an nameidata structure. + */ +#define NDINIT(ndp, op, flags, segflg, namep, p) { \ + (ndp)->ni_cnd.cn_nameiop = op; \ + (ndp)->ni_cnd.cn_flags = flags; \ + (ndp)->ni_segflg = segflg; \ + (ndp)->ni_dirp = namep; \ + (ndp)->ni_cnd.cn_proc = p; \ +} #endif /* @@ -134,8 +155,8 @@ struct nameidata { #define NCHNAMLEN 31 /* maximum name segment length we bother with */ struct namecache { - struct namecache *nc_forw; /* hash chain, MUST BE FIRST */ - struct namecache *nc_back; /* hash chain, MUST BE FIRST */ + struct namecache *nc_forw; /* hash chain */ + struct namecache **nc_back; /* hash chain */ struct namecache *nc_nxt; /* LRU chain */ struct namecache **nc_prev; /* LRU chain */ struct vnode *nc_dvp; /* vnode of parent of name */ @@ -148,8 +169,10 @@ struct namecache { #ifdef KERNEL u_long nextvnodeid; -int namei __P((struct nameidata *ndp, struct proc *p)); -int lookup __P((struct nameidata *ndp, struct proc *p)); +int namei __P((struct nameidata *ndp)); +int lookup __P((struct nameidata *ndp)); +int relookup __P((struct vnode *dvp, struct vnode **vpp, + struct componentname *cnp)); #endif /* @@ -165,5 +188,4 @@ struct nchstats { long ncs_pass2; /* names found with passes == 2 */ long ncs_2passes; /* number of times we attempt it */ }; - #endif /* !_SYS_NAMEI_H_ */ diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h index 919b0b55999a..d52f4b945c75 100644 --- a/sys/sys/syscall.h +++ b/sys/sys/syscall.h @@ -2,12 +2,9 @@ * System call numbers. * * DO NOT EDIT-- this file is automatically generated. - * created from: syscalls.master,v 1.19 1994/05/17 00:00:46 + * created from: syscalls.master,v 1.18 1994/05/07 00:39:06 */ -#ifndef _SYS_SYSCALL_H -#define _SYS_SYSCALL_H - #define SYS_syscall 0 #define SYS_exit 1 #define SYS_fork 2 @@ -159,10 +156,9 @@ /* 149 is old quota */ /* 150 is old getsockname */ #define SYS_nfssvc 155 -#define SYS_getdirentries 156 + /* 156 is old getdirentries */ #define SYS_statfs 157 #define SYS_fstatfs 158 -#define SYS_async_daemon 160 #define SYS_getfh 161 /* 162 is old getdomainname */ /* 163 is old setdomainname */ @@ -185,6 +181,7 @@ #define SYS_fpathconf 192 #define SYS_getrlimit 194 #define SYS_setrlimit 195 +#define SYS_getdirentries 196 #define SYS_mmap 197 #define SYS___syscall 198 #define SYS_lseek 199 @@ -193,5 +190,3 @@ #define SYS___sysctl 202 #define SYS_mlock 203 #define SYS_munlock 204 - -#endif /* _SYS_SYSCALL_H */ diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 804835542e2b..8d89fb46c23e 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -1,6 +1,6 @@ /* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,62 +30,55 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * from: @(#)vnode.h 7.39 (Berkeley) 6/27/91 - * $Id: vnode.h,v 1.21 1994/05/20 06:38:11 cgd Exp $ + * from: @(#)vnode.h 8.7 (Berkeley) 2/4/94 + * $Id: vnode.h,v 1.22 1994/06/08 11:38:54 mycroft Exp $ */ -#ifndef _SYS_VNODE_H_ -#define _SYS_VNODE_H_ #include -#ifndef KERNEL -#include -#endif - /* - * The vnode is the focus of all file activity in UNIX. - * There is a unique vnode allocated for each active file, - * each current directory, each mounted-on file, text file, and the root. + * The vnode is the focus of all file activity in UNIX. There is a + * unique vnode allocated for each active file, each current directory, + * each mounted-on file, text file, and the root. */ /* - * vnode types. VNON means no type. + * Vnode types. VNON means no type. */ -enum vtype { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD }; +enum vtype { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD }; /* * Vnode tag types. * These are for the benefit of external programs only (e.g., pstat) - * and should NEVER be inspected inside the kernel. + * and should NEVER be inspected by the kernel. */ -enum vtagtype { VT_NON, VT_UFS, VT_NFS, VT_MFS, VT_LFS, VT_MSDOSFS, VT_ISOFS, - VT_KERNFS, VT_FDESC, VT_PROCFS, VT_LOFS, VT_PORTAL, - VT_ADOSFS }; +enum vtagtype { + VT_NON, VT_UFS, VT_NFS, VT_MFS, VT_MSDOSFS, VT_LFS, VT_LOFS, VT_FDESC, + VT_PORTAL, VT_NULL, VT_UMAP, VT_KERNFS, VT_PROCFS, VT_AFS, VT_ISOFS, + VT_UNION, VT_ADOSFS +}; /* - * This defines the maximum size of the private data area - * permitted for any file system type. A defined constant - * is used rather than a union structure to cut down on the - * number of header files that must be included. + * Each underlying filesystem allocates its own private area and hangs + * it from v_data. If non-null, this area is freed in getnewvnode(). */ -#define VN_MAXPRIVATE roundup(192, sizeof(quad_t)) LIST_HEAD(buflists, buf); struct vnode { - u_long v_flag; /* vnode flags (see below) */ - short v_usecount; /* reference count of users */ - short v_writecount; /* reference count of writers */ - long v_holdcnt; /* page & buffer references */ - off_t v_lastr; /* last read (read-ahead) */ - u_long v_id; /* capability identifier */ - struct mount *v_mount; /* ptr to vfs we are in */ - struct vnodeops *v_op; /* vnode operations */ + u_long v_flag; /* vnode flags (see below) */ + short v_usecount; /* reference count of users */ + short v_writecount; /* reference count of writers */ + long v_holdcnt; /* page & buffer references */ + daddr_t v_lastr; /* last read (read-ahead) */ + u_long v_id; /* capability identifier */ + struct mount *v_mount; /* ptr to vfs we are in */ + int (**v_op)(); /* vnode operations vector */ TAILQ_ENTRY(vnode) v_freelist; /* vnode freelist */ - LIST_ENTRY(vnode) v_mntvnodes; /* vnode mountlist */ - struct buflists v_cleanblkhd; /* clean blocklist head */ - struct buflists v_dirtyblkhd; /* dirty blocklist head */ - long v_numoutput; /* num of writes in progress */ - enum vtype v_type; /* vnode type */ + LIST_ENTRY(vnode) v_mntvnodes; /* vnodes for mount point */ + struct buflists v_cleanblkhd; /* clean blocklist head */ + struct buflists v_dirtyblkhd; /* dirty blocklist head */ + long v_numoutput; /* num of writes in progress */ + enum vtype v_type; /* vnode type */ union { struct mount *vu_mountedhere;/* ptr to mounted vfs (VDIR) */ struct socket *vu_socket; /* unix ipc (VSOCK) */ @@ -93,8 +86,16 @@ struct vnode { struct specinfo *vu_specinfo; /* device (VCHR, VBLK) */ struct fifoinfo *vu_fifoinfo; /* fifo (VFIFO) */ } v_un; - enum vtagtype v_tag; /* type of underlying data */ - quad_t v_data[VN_MAXPRIVATE/sizeof(quad_t)]; /* private data for fs */ + struct nqlease *v_lease; /* Soft reference to lease */ + daddr_t v_lastw; /* last write (write cluster) */ + daddr_t v_cstart; /* start block of cluster */ + daddr_t v_lasta; /* last allocation */ + int v_clen; /* length of current cluster */ + int v_ralen; /* Read-ahead length */ + daddr_t v_maxra; /* last readahead block */ + long v_spare[7]; /* round to 128 bytes */ + enum vtagtype v_tag; /* type of underlying data */ + void *v_data; /* private data for fs */ }; #define v_mountedhere v_un.vu_mountedhere #define v_socket v_un.vu_socket @@ -103,7 +104,7 @@ struct vnode { #define v_fifoinfo v_un.vu_fifoinfo /* - * vnode flags. + * Vnode flags. */ #define VROOT 0x0001 /* root of its file system */ #define VTEXT 0x0002 /* vnode is a pure text prototype */ @@ -112,11 +113,11 @@ struct vnode { #define VXWANT 0x0200 /* process is waiting for vnode */ #define VBWAIT 0x0400 /* waiting for output to complete */ #define VALIASED 0x0800 /* vnode has an alias */ +#define VDIROP 0x1000 /* LFS: vnode is involved in a directory op */ /* - * Vnode attributes. A field value of VNOVAL - * represents a field whose value is unavailable - * (getattr) or which is not to be changed (setattr). + * Vnode attributes. A field value of VNOVAL represents a field whose value + * is unavailable (getattr) or which is not to be changed (setattr). */ struct vattr { enum vtype va_type; /* vnode type (for create) */ @@ -128,130 +129,26 @@ struct vattr { long va_fileid; /* file id */ u_quad_t va_size; /* file size in bytes */ long va_blocksize; /* blocksize preferred for i/o */ - struct timespec va_atime; /* time of last access */ - struct timespec va_mtime; /* time of last modification */ - struct timespec va_ctime; /* time file changed */ + struct timespec va_atime; /* time of last access */ + struct timespec va_mtime; /* time of last modification */ + struct timespec va_ctime; /* time file changed */ u_long va_gen; /* generation number of file */ u_long va_flags; /* flags defined for file */ /* XXX should be a dev_t */ u_long va_rdev; /* device the special file represents */ u_quad_t va_bytes; /* bytes of disk space held by file */ + u_quad_t va_filerev; /* file modification number */ u_int va_vaflags; /* operations flags, see below */ + long va_spare; /* remain quad aligned */ }; /* - * Flags for va_vaflags. + * Flags for va_cflags. */ #define VA_UTIMES_NULL 0x01 /* utimes argument was NULL */ /* - * Operations on vnodes. - */ -#ifdef __STDC__ -struct flock; -struct nameidata; -#endif - -struct vnodeops { - int (*vop_lookup) __P((struct vnode *vp, struct nameidata *ndp, - struct proc *p)); - int (*vop_create) __P((struct nameidata *ndp, struct vattr *vap, - struct proc *p)); - int (*vop_mknod) __P((struct nameidata *ndp, struct vattr *vap, - struct ucred *cred, struct proc *p)); - int (*vop_open) __P((struct vnode *vp, int mode, - struct ucred *cred, struct proc *p)); - int (*vop_close) __P((struct vnode *vp, int fflag, - struct ucred *cred, struct proc *p)); - int (*vop_access) __P((struct vnode *vp, int mode, - struct ucred *cred, struct proc *p)); - int (*vop_getattr) __P((struct vnode *vp, struct vattr *vap, - struct ucred *cred, struct proc *p)); - int (*vop_setattr) __P((struct vnode *vp, struct vattr *vap, - struct ucred *cred, struct proc *p)); - int (*vop_read) __P((struct vnode *vp, struct uio *uio, - int ioflag, struct ucred *cred)); - int (*vop_write) __P((struct vnode *vp, struct uio *uio, - int ioflag, struct ucred *cred)); - int (*vop_ioctl) __P((struct vnode *vp, int command, - caddr_t data, int fflag, - struct ucred *cred, struct proc *p)); - int (*vop_select) __P((struct vnode *vp, int which, int fflags, - struct ucred *cred, struct proc *p)); - int (*vop_mmap) __P((struct vnode *vp, int fflags, - struct ucred *cred, struct proc *p)); - int (*vop_fsync) __P((struct vnode *vp, int fflags, - struct ucred *cred, int waitfor, - struct proc *p)); - int (*vop_seek) __P((struct vnode *vp, off_t oldoff, - off_t newoff, struct ucred *cred)); - int (*vop_remove) __P((struct nameidata *ndp, struct proc *p)); - int (*vop_link) __P((struct vnode *vp, struct nameidata *ndp, - struct proc *p)); - int (*vop_rename) __P((struct nameidata *fndp, - struct nameidata *tdnp, struct proc *p)); - int (*vop_mkdir) __P((struct nameidata *ndp, struct vattr *vap, - struct proc *p)); - int (*vop_rmdir) __P((struct nameidata *ndp, struct proc *p)); - int (*vop_symlink) __P((struct nameidata *ndp, struct vattr *vap, - char *target, struct proc *p)); - int (*vop_readdir) __P((struct vnode *vp, struct uio *uio, - struct ucred *cred, int *eofflagp, - u_int *cookies, int ncookies)); - int (*vop_readlink) __P((struct vnode *vp, struct uio *uio, - struct ucred *cred)); - int (*vop_abortop) __P((struct nameidata *ndp)); - int (*vop_inactive) __P((struct vnode *vp, struct proc *p)); - int (*vop_reclaim) __P((struct vnode *vp)); - int (*vop_lock) __P((struct vnode *vp)); - int (*vop_unlock) __P((struct vnode *vp)); - int (*vop_bmap) __P((struct vnode *vp, daddr_t bn, - struct vnode **vpp, daddr_t *bnp)); - int (*vop_strategy) __P((struct buf *bp)); - int (*vop_print) __P((struct vnode *vp)); - int (*vop_islocked) __P((struct vnode *vp)); - int (*vop_advlock) __P((struct vnode *vp, caddr_t id, int op, - struct flock *fl, int flags)); -}; - -/* Macros to call the vnode ops */ -#define VOP_LOOKUP(v,n,p) (*((v)->v_op->vop_lookup))(v,n,p) -#define VOP_CREATE(n,a,p) (*((n)->ni_dvp->v_op->vop_create))(n,a,p) -#define VOP_MKNOD(n,a,c,p) (*((n)->ni_dvp->v_op->vop_mknod))(n,a,c,p) -#define VOP_OPEN(v,f,c,p) (*((v)->v_op->vop_open))(v,f,c,p) -#define VOP_CLOSE(v,f,c,p) (*((v)->v_op->vop_close))(v,f,c,p) -#define VOP_ACCESS(v,f,c,p) (*((v)->v_op->vop_access))(v,f,c,p) -#define VOP_GETATTR(v,a,c,p) (*((v)->v_op->vop_getattr))(v,a,c,p) -#define VOP_SETATTR(v,a,c,p) (*((v)->v_op->vop_setattr))(v,a,c,p) -#define VOP_READ(v,u,i,c) (*((v)->v_op->vop_read))(v,u,i,c) -#define VOP_WRITE(v,u,i,c) (*((v)->v_op->vop_write))(v,u,i,c) -#define VOP_IOCTL(v,o,d,f,c,p) (*((v)->v_op->vop_ioctl))(v,o,d,f,c,p) -#define VOP_SELECT(v,w,f,c,p) (*((v)->v_op->vop_select))(v,w,f,c,p) -#define VOP_MMAP(v,f,c,p) (*((v)->v_op->vop_mmap))(v,f,c,p) -#define VOP_FSYNC(v,f,c,w,p) (*((v)->v_op->vop_fsync))(v,f,c,w,p) -#define VOP_SEEK(v,p,o,w) (*((v)->v_op->vop_seek))(v,p,o,w) -#define VOP_REMOVE(n,p) (*((n)->ni_dvp->v_op->vop_remove))(n,p) -#define VOP_LINK(v,n,p) (*((n)->ni_dvp->v_op->vop_link))(v,n,p) -#define VOP_RENAME(s,t,p) (*((s)->ni_dvp->v_op->vop_rename))(s,t,p) -#define VOP_MKDIR(n,a,p) (*((n)->ni_dvp->v_op->vop_mkdir))(n,a,p) -#define VOP_RMDIR(n,p) (*((n)->ni_dvp->v_op->vop_rmdir))(n,p) -#define VOP_SYMLINK(n,a,m,p) (*((n)->ni_dvp->v_op->vop_symlink))(n,a,m,p) -#define VOP_READDIR(v,u,c,e,k,n) (*((v)->v_op->vop_readdir))(v,u,c,e,k,n) -#define VOP_READLINK(v,u,c) (*((v)->v_op->vop_readlink))(v,u,c) -#define VOP_ABORTOP(n) (*((n)->ni_dvp->v_op->vop_abortop))(n) -#define VOP_INACTIVE(v,p) (*((v)->v_op->vop_inactive))(v,p) -#define VOP_RECLAIM(v) (*((v)->v_op->vop_reclaim))(v) -#define VOP_LOCK(v) (*((v)->v_op->vop_lock))(v) -#define VOP_UNLOCK(v) (*((v)->v_op->vop_unlock))(v) -#define VOP_BMAP(v,s,p,n) (*((v)->v_op->vop_bmap))(v,s,p,n) -#define VOP_STRATEGY(b) (*((b)->b_vp->v_op->vop_strategy))(b) -#define VOP_PRINT(v) (*((v)->v_op->vop_print))(v) -#define VOP_ISLOCKED(v) (((v)->v_flag & VXLOCK) || \ - (*((v)->v_op->vop_islocked))(v)) -#define VOP_ADVLOCK(v,p,o,l,f) (*((v)->v_op->vop_advlock))(v,p,o,l,f) - -/* - * flags for ioflag + * Flags for ioflag. */ #define IO_UNIT 0x01 /* do I/O as atomic unit */ #define IO_APPEND 0x02 /* append write to end */ @@ -260,38 +157,56 @@ struct vnodeops { #define IO_NDELAY 0x10 /* FNDELAY flag set in file table */ /* - * Modes. Some values same as Ixxx entries from inode.h for now + * Modes. Some values same as Ixxx entries from inode.h for now. */ #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 */ -#define VREAD 0400 /* read, write, execute permissions */ -#define VWRITE 0200 -#define VEXEC 0100 +#define VREAD 00400 /* read, write, execute permissions */ +#define VWRITE 00200 +#define VEXEC 00100 /* - * Token indicating no attribute value yet assigned + * Token indicating no attribute value yet assigned. */ #define VNOVAL (-1) #ifdef KERNEL +/* + * Convert between vnode types and inode formats (since POSIX.1 + * defines mode word of stat structure in terms of inode formats). + */ +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)) + /* * Flags to various vnode functions. */ #define SKIPSYSTEM 0x0001 /* vflush: skip vnodes marked VSYSTEM */ #define FORCECLOSE 0x0002 /* vflush: force file closeure */ -#define DOCLOSE 0x0004 /* vclean: close active files */ +#define WRITECLOSE 0x0004 /* vflush: only close writeable files */ +#define DOCLOSE 0x0008 /* vclean: close active files */ +#define V_SAVE 0x0001 /* vinvalbuf: sync file first */ +#define V_SAVEMETA 0x0002 /* vinvalbuf: leave indirect blocks */ -#ifndef DIAGNOSTIC -#define VREF(vp) (vp)->v_usecount++ /* increase reference */ -#define VHOLD(vp) (vp)->v_holdcnt++ /* increase buf or page ref */ -#define HOLDRELE(vp) (vp)->v_holdcnt-- /* decrease buf or page ref */ -#define VATTR_NULL(vap) (*(vap) = va_null) /* initialize a vattr */ -#else /* DIAGNOSTIC */ -#define VREF(vp) vref(vp) -#define VHOLD(vp) vhold(vp) +#ifdef DIAGNOSTIC #define HOLDRELE(vp) holdrele(vp) #define VATTR_NULL(vap) vattr_null(vap) +#define VHOLD(vp) vhold(vp) +#define VREF(vp) vref(vp) + +void holdrele __P((struct vnode *)); +void vattr_null __P((struct vattr *)); +void vhold __P((struct vnode *)); +void vref __P((struct vnode *)); +#else +#define HOLDRELE(vp) (vp)->v_holdcnt-- /* decrease buf or page ref */ +#define VATTR_NULL(vap) (*(vap) = va_null) /* initialize a vattr */ +#define VHOLD(vp) (vp)->v_holdcnt++ /* increase buf or page ref */ +#define VREF(vp) (vp)->v_usecount++ /* increase reference */ #endif #define NULLVP ((struct vnode *)NULL) @@ -300,44 +215,188 @@ struct vnodeops { * Global vnode data. */ extern struct vnode *rootvnode; /* root (i.e. "/") vnode */ -extern long desiredvnodes; /* number of vnodes desired */ +extern int desiredvnodes; /* number of vnodes desired */ extern struct vattr va_null; /* predefined null vattr structure */ /* * Macro/function to check for client cache inconsistency w.r.t. leasing. - * XXX Just no-ops for now. */ #define LEASE_READ 0x1 /* Check lease for readers */ #define LEASE_WRITE 0x2 /* Check lease for modifiers */ + +#ifdef NFSCLIENT +void lease_check __P((struct vnode *vp, struct proc *p, + struct ucred *ucred, int flag)); +void lease_updatetime __P((int deltat)); +#define LEASE_CHECK(vp, p, cred, flag) lease_check((vp), (p), (cred), (flag)) +#define LEASE_UPDATETIME(dt) lease_updatetime(dt) +#else #define LEASE_CHECK(vp, p, cred, flag) #define LEASE_UPDATETIME(dt) +#endif /* NFSCLIENT */ +#endif /* KERNEL */ -int bdevvp __P((int dev, struct vnode **vpp)); -int cdevvp __P((int dev, struct vnode **vpp)); -int getnewvnode __P((enum vtagtype tag, struct mount *mp, - struct vnodeops *vops, struct vnode **vpp)); + +/* + * Mods for exensibility. + */ + +/* + * Flags for vdesc_flags: + */ +#define VDESC_MAX_VPS 16 +/* Low order 16 flag bits are reserved for willrele flags for vp arguments. */ +#define VDESC_VP0_WILLRELE 0x0001 +#define VDESC_VP1_WILLRELE 0x0002 +#define VDESC_VP2_WILLRELE 0x0004 +#define VDESC_VP3_WILLRELE 0x0008 +#define VDESC_NOMAP_VPP 0x0100 +#define VDESC_VPP_WILLRELE 0x0200 + +/* + * VDESC_NO_OFFSET is used to identify the end of the offset list + * and in places where no such field exists. + */ +#define VDESC_NO_OFFSET -1 + +/* + * This structure describes the vnode operation taking place. + */ +struct vnodeop_desc { + int vdesc_offset; /* offset in vector--first for speed */ + char *vdesc_name; /* a readable name for debugging */ + int vdesc_flags; /* VDESC_* flags */ + + /* + * These ops are used by bypass routines to map and locate arguments. + * Creds and procs are not needed in bypass routines, but sometimes + * they are useful to (for example) transport layers. + * Nameidata is useful because it has a cred in it. + */ + int *vdesc_vp_offsets; /* list ended by VDESC_NO_OFFSET */ + int vdesc_vpp_offset; /* return vpp location */ + int vdesc_cred_offset; /* cred location, if any */ + int vdesc_proc_offset; /* proc location, if any */ + int vdesc_componentname_offset; /* if any */ + /* + * Finally, we've got a list of private data (about each operation) + * for each transport layer. (Support to manage this list is not + * yet part of BSD.) + */ + caddr_t *vdesc_transports; +}; + +#ifdef KERNEL +/* + * A list of all the operation descs. + */ +extern struct vnodeop_desc *vnodeop_descs[]; + + +/* + * This macro is very helpful in defining those offsets in the vdesc struct. + * + * This is stolen from X11R4. I ingored all the fancy stuff for + * Crays, so if you decide to port this to such a serious machine, + * you might want to consult Intrisics.h's XtOffset{,Of,To}. + */ +#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))) + + +/* + * This structure is used to configure the new vnodeops vector. + */ +struct vnodeopv_entry_desc { + struct vnodeop_desc *opve_op; /* which operation this is */ + int (*opve_impl)(); /* code implementing this operation */ +}; +struct vnodeopv_desc { + /* ptr to the ptr to the vector where op should go */ + int (***opv_desc_vector_p)(); + struct vnodeopv_entry_desc *opv_desc_ops; /* null terminated list */ +}; + +/* + * A default routine which just returns an error. + */ +int vn_default_error __P((void)); + +/* + * A generic structure. + * This can be used by bypass routines to identify generic arguments. + */ +struct vop_generic_args { + struct vnodeop_desc *a_desc; + /* other random data follows, presumably */ +}; + +/* + * VOCALL calls an op given an ops vector. We break it out because BSD's + * vclean changes the ops vector and then wants to call ops with the old + * vector. + */ +#define VOCALL(OPSV,OFF,AP) (( *((OPSV)[(OFF)])) (AP)) + +/* + * This call works for vnodes in the kernel. + */ +#define VCALL(VP,OFF,AP) VOCALL((VP)->v_op,(OFF),(AP)) +#define VDESC(OP) (& __CONCAT(OP,_desc)) +#define VOFFSET(OP) (VDESC(OP)->vdesc_offset) + +/* + * Finally, include the default set of vnode operations. + */ +#include + +/* + * Public vnode manipulation functions. + */ +struct file; +struct mount; +struct nameidata; +struct proc; +struct stat; +struct ucred; +struct uio; +struct vattr; +struct vnode; +struct vop_bwrite_args; + +int bdevvp __P((dev_t dev, struct vnode **vpp)); +int cdevvp __P((dev_t dev, struct vnode **vpp)); +int getnewvnode __P((enum vtagtype tag, + struct mount *mp, int (**vops)(), struct vnode **vpp)); void vattr_null __P((struct vattr *vap)); int vcount __P((struct vnode *vp)); +void vflushbuf __P((struct vnode *vp, int sync)); int vget __P((struct vnode *vp, int lockflag)); void vgone __P((struct vnode *vp)); void vgoneall __P((struct vnode *vp)); -int vn_close __P((struct vnode *vp, int flags, struct ucred *cred, - struct proc *p)); +int vinvalbuf __P((struct vnode *vp, int save, struct ucred *cred, + struct proc *p, int slpflag, int slptimeo)); +void vprint __P((char *label, struct vnode *vp)); +int vn_bwrite __P((struct vop_bwrite_args *ap)); +int vn_close __P((struct vnode *vp, + int flags, struct ucred *cred, struct proc *p)); int vn_closefile __P((struct file *fp, struct proc *p)); int vn_ioctl __P((struct file *fp, int com, caddr_t data, struct proc *p)); -int vn_open __P((struct nameidata *ndp, struct proc *p, int fmode, - int cmode)); +int vn_open __P((struct nameidata *ndp, int fmode, int cmode)); int vn_rdwr __P((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, struct proc *p)); int vn_read __P((struct file *fp, struct uio *uio, struct ucred *cred)); int vn_select __P((struct file *fp, int which, struct proc *p)); +int vn_stat __P((struct vnode *vp, struct stat *sb, struct proc *p)); int vn_write __P((struct file *fp, struct uio *uio, struct ucred *cred)); -struct vnode *checkalias __P((struct vnode *vp, int nvp_rdev, - struct mount *mp)); +struct vnode * + checkalias __P((struct vnode *vp, dev_t nvp_rdev, struct mount *mp)); void vput __P((struct vnode *vp)); void vref __P((struct vnode *vp)); void vrele __P((struct vnode *vp)); -#endif - -#endif /* !_SYS_VNODE_H_ */ +#endif /* KERNEL */