4.3BSD-UWisc/src/sys/h/vnode.h
/* NFSSRC @(#)vnode.h 2.1 86/04/11 */
/* @(#)vnode.h 1.1 86/02/03 SMI */
/*
* 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.
*/
enum vtype { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VBAD };
struct vnode {
u_short v_flag; /* vnode flags (see below)*/
u_short v_count; /* reference count */
u_short v_shlockc; /* count of shared locks */
u_short v_exlockc; /* count of exclusive locks */
struct vfs *v_vfsmountedhere; /* ptr to vfs mounted here */
struct vnodeops *v_op; /* vnode operations */
struct socket *v_socket; /* unix ipc */
struct vfs *v_vfsp; /* ptr to vfs we are in */
enum vtype v_type; /* vnode type */
dev_t v_rdev; /* device (VCHR, VBLK) */
caddr_t v_data; /* private data for fs */
struct text *v_text; /* text entry, if any (should be region) */
};
/*
* vnode flags.
*/
#define VROOT 0x01 /* root of its file system */
#define VTEXT 0x02 /* vnode is a pure text prototype */
#define VEXLOCK 0x10 /* exclusive lock */
#define VSHLOCK 0x20 /* shared lock */
#define VLWAIT 0x40 /* proc is waiting on shared or excl. lock */
#define VTEXTMOD 0x80 /* text has been modified (e.g. ptrace) */
/*
* Operations on vnodes.
*/
struct vnodeops {
int (*vn_open)();
int (*vn_close)();
int (*vn_rdwr)();
int (*vn_ioctl)();
int (*vn_select)();
int (*vn_getattr)();
int (*vn_setattr)();
int (*vn_access)();
int (*vn_lookup)();
int (*vn_create)();
int (*vn_remove)();
int (*vn_link)();
int (*vn_rename)();
int (*vn_mkdir)();
int (*vn_rmdir)();
int (*vn_readdir)();
int (*vn_symlink)();
int (*vn_readlink)();
int (*vn_fsync)();
int (*vn_inactive)();
int (*vn_bmap)();
int (*vn_strategy)();
int (*vn_bread)();
int (*vn_brelse)();
};
#ifdef KERNEL
#define VOP_OPEN(VPP,F,C) (*(*(VPP))->v_op->vn_open)(VPP, F, C)
#define VOP_CLOSE(VP,F,C) (*(VP)->v_op->vn_close)(VP,F,C)
#define VOP_RDWR(VP,UIOP,RW,F,C) (*(VP)->v_op->vn_rdwr)(VP,UIOP,RW,F,C)
#define VOP_IOCTL(VP,C,D,F,CR) (*(VP)->v_op->vn_ioctl)(VP,C,D,F,CR)
#define VOP_SELECT(VP,W,C) (*(VP)->v_op->vn_select)(VP,W,C)
#define VOP_GETATTR(VP,VA,C) (*(VP)->v_op->vn_getattr)(VP,VA,C)
#define VOP_SETATTR(VP,VA,C) (*(VP)->v_op->vn_setattr)(VP,VA,C)
#define VOP_ACCESS(VP,M,C) (*(VP)->v_op->vn_access)(VP,M,C)
#define VOP_LOOKUP(VP,NM,VPP,C) (*(VP)->v_op->vn_lookup)(VP,NM,VPP,C)
#define VOP_CREATE(VP,NM,VA,E,M,VPP,C) (*(VP)->v_op->vn_create) \
(VP,NM,VA,E,M,VPP,C)
#define VOP_REMOVE(VP,NM,C) (*(VP)->v_op->vn_remove)(VP,NM,C)
#define VOP_LINK(VP,TDVP,TNM,C) (*(VP)->v_op->vn_link)(VP,TDVP,TNM,C)
#define VOP_RENAME(VP,NM,TDVP,TNM,C) (*(VP)->v_op->vn_rename) \
(VP,NM,TDVP,TNM,C)
#define VOP_MKDIR(VP,NM,VA,VPP,C) (*(VP)->v_op->vn_mkdir)(VP,NM,VA,VPP,C)
#define VOP_RMDIR(VP,NM,C) (*(VP)->v_op->vn_rmdir)(VP,NM,C)
#define VOP_READDIR(VP,UIOP,C) (*(VP)->v_op->vn_readdir)(VP,UIOP,C)
#define VOP_SYMLINK(VP,LNM,VA,TNM,C) (*(VP)->v_op->vn_symlink) \
(VP,LNM,VA,TNM,C)
#define VOP_READLINK(VP,UIOP,C) (*(VP)->v_op->vn_readlink)(VP,UIOP,C)
#define VOP_FSYNC(VP,C) (*(VP)->v_op->vn_fsync)(VP,C)
#define VOP_INACTIVE(VP,C) (*(VP)->v_op->vn_inactive)(VP,C)
#define VOP_BMAP(VP,BN,VPP,BNP) (*(VP)->v_op->vn_bmap)(VP,BN,VPP,BNP)
#define VOP_STRATEGY(BP) (*(BP)->b_vp->v_op->vn_strategy)(BP)
#define VOP_BREAD(VP,BN,BPP) (*(VP)->v_op->vn_bread)(VP,BN,BPP)
#define VOP_BRELSE(VP,BP) (*(VP)->v_op->vn_brelse)(VP,BP)
/*
* flags for above
*/
#define IO_UNIT 0x01 /* do io as atomic unit for VOP_RDWR */
#define IO_APPEND 0x02 /* append write for VOP_RDWR */
#define IO_SYNC 0x04 /* sync io for VOP_RDWR */
#endif
/*
* Vnode attributes. A field value of -1
* 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) */
u_short va_mode; /* files access mode and type */
short va_uid; /* owner user id */
short va_gid; /* owner group id */
long va_fsid; /* file system id (dev for now) */
long va_nodeid; /* node id */
short va_nlink; /* number of references to file */
u_long va_size; /* file size in bytes (quad?) */
long va_blocksize; /* blocksize preferred for i/o */
struct timeval va_atime; /* time of last access */
struct timeval va_mtime; /* time of last modification */
struct timeval va_ctime; /* time file ``created */
dev_t va_rdev; /* device the file represents */
long va_blocks; /* kbytes of disk space held by file */
};
/*
* 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
#ifdef KERNEL
/*
* public vnode manipulation functions
*/
extern int vn_open(); /* open vnode */
extern int vn_create(); /* creat/mkdir vnode */
extern int vn_rdwr(); /* read or write vnode */
extern int vn_close(); /* close vnode */
extern void vn_rele(); /* release vnode */
extern int vn_link(); /* make hard link */
extern int vn_rename(); /* rename (move) */
extern int vn_remove(); /* remove/rmdir */
extern void vattr_null(); /* set attributes to null */
extern int getvnodefp(); /* get fp from vnode fd */
#define VN_HOLD(VP) { \
(VP)->v_count++; \
}
#define VN_RELE(VP) { \
vn_rele(VP); \
}
#define VN_INIT(VP, VFSP, TYPE, DEV) { \
(VP)->v_flag = 0; \
(VP)->v_count = 1; \
(VP)->v_shlockc = (VP)->v_exlockc = 0; \
(VP)->v_vfsp = (VFSP); \
(VP)->v_type = (TYPE); \
(VP)->v_rdev = (DEV); \
}
/*
* flags for above
*/
enum rm { FILE, DIRECTORY }; /* rmdir or rm (remove) */
enum symfollow { NO_FOLLOW, FOLLOW_LINK }; /* follow symlinks (lookuppn) */
enum vcexcl { NONEXCL, EXCL}; /* (non)excl create (create) */
/*
* Global vnode data.
*/
extern struct vnode *rootdir; /* root (i.e. "/") vnode */
#endif