Annotation of prex/include/sys/vnode.h, Revision 1.1
1.1 ! nbrk 1: /*
! 2: * Copyright (c) 2005-2007, Kohsuke Ohtani
! 3: * All rights reserved.
! 4: *
! 5: * Redistribution and use in source and binary forms, with or without
! 6: * modification, are permitted provided that the following conditions
! 7: * are met:
! 8: * 1. Redistributions of source code must retain the above copyright
! 9: * notice, this list of conditions and the following disclaimer.
! 10: * 2. Redistributions in binary form must reproduce the above copyright
! 11: * notice, this list of conditions and the following disclaimer in the
! 12: * documentation and/or other materials provided with the distribution.
! 13: * 3. Neither the name of the author nor the names of any co-contributors
! 14: * may be used to endorse or promote products derived from this software
! 15: * without specific prior written permission.
! 16: *
! 17: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
! 18: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 19: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 20: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
! 21: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 22: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 23: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 24: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 25: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 26: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 27: * SUCH DAMAGE.
! 28: */
! 29:
! 30: #ifndef _SYS_VNODE_H
! 31: #define _SYS_VNODE_H
! 32:
! 33: #include <sys/types.h>
! 34: #include <sys/stat.h>
! 35: #include <sys/file.h>
! 36: #include <sys/list.h>
! 37: #include <sys/dirent.h>
! 38: #include <sys/syslimits.h>
! 39:
! 40: struct vfsops;
! 41: struct vnops;
! 42: struct vnode;
! 43: struct file;
! 44:
! 45: /*
! 46: * Vnode types.
! 47: */
! 48: enum {
! 49: VNON, /* no type */
! 50: VREG, /* regular file */
! 51: VDIR, /* directory */
! 52: VBLK, /* block device */
! 53: VCHR, /* character device */
! 54: VLNK, /* symbolic link */
! 55: VSOCK, /* socks */
! 56: VFIFO /* FIFO */
! 57: };
! 58:
! 59: /*
! 60: * Reading or writing any of these items requires holding the
! 61: * appropriate lock.
! 62: */
! 63: struct vnode {
! 64: struct list v_link; /* link for hash list */
! 65: struct mount *v_mount; /* mounted vfs pointer */
! 66: struct vnops *v_op; /* vnode operations */
! 67: int v_refcnt; /* reference count */
! 68: int v_type; /* vnode type */
! 69: int v_flags; /* vnode flag */
! 70: mode_t v_mode; /* file mode */
! 71: size_t v_size; /* file size */
! 72: mutex_t v_lock; /* lock for this vnode */
! 73: int v_nrlocks; /* lock count (for debug) */
! 74: int v_blkno; /* block number */
! 75: char *v_path; /* pointer to path in fs */
! 76: void *v_data; /* private data for fs */
! 77: };
! 78: typedef struct vnode *vnode_t;
! 79:
! 80: /* flags for vnode */
! 81: #define VROOT 0x0001 /* root of its file system */
! 82:
! 83: /*
! 84: * Vnode attribute
! 85: */
! 86: struct vattr {
! 87: int va_type; /* vnode type */
! 88: mode_t va_mode; /* file access mode */
! 89: };
! 90:
! 91: /*
! 92: * Modes
! 93: */
! 94: #define VREAD 0x0004
! 95: #define VWRITE 0x0002
! 96: #define VEXEC 0x0001
! 97:
! 98: /*
! 99: * vnode operations
! 100: */
! 101: struct vnops {
! 102: int (*vop_open) (vnode_t vp, int flags);
! 103: int (*vop_close) (vnode_t vp, file_t fp);
! 104: int (*vop_read) (vnode_t vp, file_t fp, void *buf, size_t size, size_t *result);
! 105: int (*vop_write) (vnode_t vp, file_t fp, void *buf, size_t size, size_t *result);
! 106: int (*vop_seek) (vnode_t vp, file_t fp, off_t oldoff, off_t newoff);
! 107: int (*vop_ioctl) (vnode_t vp, file_t fp, u_long cmd, void *arg);
! 108: int (*vop_fsync) (vnode_t vp, file_t fp);
! 109: int (*vop_readdir) (vnode_t vp, file_t fp, struct dirent *dirent);
! 110: int (*vop_lookup) (vnode_t dvp, char *name, vnode_t vp);
! 111: int (*vop_create) (vnode_t dvp, char *name, mode_t mode);
! 112: int (*vop_remove) (vnode_t dvp, vnode_t vp, char *name);
! 113: int (*vop_rename) (vnode_t dvp1, vnode_t vp1, char *name1, vnode_t dvp2, vnode_t vp2, char *name2);
! 114: int (*vop_mkdir) (vnode_t dvp, char *name, mode_t mode);
! 115: int (*vop_rmdir) (vnode_t dvp, vnode_t vp, char *name);
! 116: int (*vop_getattr) (vnode_t vp, struct vattr *vap);
! 117: int (*vop_setattr) (vnode_t vp, struct vattr *vap);
! 118: int (*vop_inactive) (vnode_t vp);
! 119: int (*vop_truncate) (vnode_t vp);
! 120: };
! 121:
! 122: typedef int (*vnop_open_t) (vnode_t, int);
! 123: typedef int (*vnop_close_t) (vnode_t, file_t);
! 124: typedef int (*vnop_read_t) (vnode_t, file_t, void *, size_t, size_t *);
! 125: typedef int (*vnop_write_t) (vnode_t, file_t, void *, size_t, size_t *);
! 126: typedef int (*vnop_seek_t) (vnode_t, file_t, off_t, off_t);
! 127: typedef int (*vnop_ioctl_t) (vnode_t, file_t, u_long, void *);
! 128: typedef int (*vnop_fsync_t) (vnode_t, file_t);
! 129: typedef int (*vnop_readdir_t) (vnode_t, file_t, struct dirent *);
! 130: typedef int (*vnop_lookup_t) (vnode_t, char *, vnode_t);
! 131: typedef int (*vnop_create_t) (vnode_t, char *, mode_t);
! 132: typedef int (*vnop_remove_t) (vnode_t, vnode_t, char *);
! 133: typedef int (*vnop_rename_t) (vnode_t, vnode_t, char *, vnode_t, vnode_t, char *);
! 134: typedef int (*vnop_mkdir_t) (vnode_t, char *, mode_t);
! 135: typedef int (*vnop_rmdir_t) (vnode_t, vnode_t, char *);
! 136: typedef int (*vnop_getattr_t) (vnode_t, struct vattr *);
! 137: typedef int (*vnop_setattr_t) (vnode_t, struct vattr *);
! 138: typedef int (*vnop_inactive_t) (vnode_t);
! 139: typedef int (*vnop_truncate_t) (vnode_t);
! 140:
! 141: /*
! 142: * vnode interface
! 143: */
! 144: #define VOP_OPEN(VP, F) ((VP)->v_op->vop_open)(VP, F)
! 145: #define VOP_CLOSE(VP, FP) ((VP)->v_op->vop_close)(VP, FP)
! 146: #define VOP_READ(VP, FP, B, S, C) ((VP)->v_op->vop_read)(VP, FP, B, S, C)
! 147: #define VOP_WRITE(VP, FP, B, S, C) ((VP)->v_op->vop_write)(VP, FP, B, S, C)
! 148: #define VOP_SEEK(VP, FP, OLD, NEW) ((VP)->v_op->vop_seek)(VP, FP, OLD, NEW)
! 149: #define VOP_IOCTL(VP, FP, C, A) ((VP)->v_op->vop_ioctl)(VP, FP, C, A)
! 150: #define VOP_FSYNC(VP, FP) ((VP)->v_op->vop_fsync)(VP, FP)
! 151: #define VOP_READDIR(VP, FP, DIR) ((VP)->v_op->vop_readdir)(VP, FP, DIR)
! 152: #define VOP_LOOKUP(DVP, N, VP) ((DVP)->v_op->vop_lookup)(DVP, N, VP)
! 153: #define VOP_CREATE(DVP, N, M) ((DVP)->v_op->vop_create)(DVP, N, M)
! 154: #define VOP_REMOVE(DVP, VP, N) ((DVP)->v_op->vop_remove)(DVP, VP, N)
! 155: #define VOP_RENAME(DVP1, VP1, N1, DVP2, VP2, N2) \
! 156: ((DVP1)->v_op->vop_rename)(DVP1, VP1, N1, DVP2, VP2, N2)
! 157: #define VOP_MKDIR(DVP, N, M) ((DVP)->v_op->vop_mkdir)(DVP, N, M)
! 158: #define VOP_RMDIR(DVP, VP, N) ((DVP)->v_op->vop_rmdir)(DVP, VP, N)
! 159: #define VOP_GETATTR(VP, VAP) ((VP)->v_op->vop_getattr)(VP, VAP)
! 160: #define VOP_SETATTR(VP, VAP) ((VP)->v_op->vop_setattr)(VP, VAP)
! 161: #define VOP_INACTIVE(VP) ((VP)->v_op->vop_inactive)(VP)
! 162: #define VOP_TRUNCATE(VP) ((VP)->v_op->vop_truncate)(VP)
! 163:
! 164: __BEGIN_DECLS
! 165: int vop_nullop(void);
! 166: int vop_einval(void);
! 167:
! 168: vnode_t vn_lookup(struct mount *mp, char *path);
! 169: void vn_lock(vnode_t vp);
! 170: void vn_unlock(vnode_t vp);
! 171: int vn_stat(vnode_t vp, struct stat *st);
! 172: vnode_t vget(struct mount *mp, char *path);
! 173: void vput(vnode_t vp);
! 174: void vgone(vnode_t vp);
! 175: void vref(vnode_t vp);
! 176: void vrele(vnode_t vp);
! 177: int vcount(vnode_t vp);
! 178: void vflush(struct mount *mp);
! 179: __END_DECLS
! 180:
! 181: #endif /* !_SYS_VNODE_H */
CVSweb