123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 |
- #ifndef _VNODE_H_
- #define _VNODE_H_
- struct uio;
- struct stat;
- struct vnode {
- int vn_refcount;
- int vn_opencount;
- struct fs *vn_fs;
- void *vn_data;
- const struct vnode_ops *vn_ops;
- };
- #define VOP_MAGIC 0xa2b3c4d5
- struct vnode_ops {
- unsigned long vop_magic;
- int (*vop_open)(struct vnode *object, int flags_from_open);
- int (*vop_close)(struct vnode *object);
- int (*vop_reclaim)(struct vnode *vnode);
- int (*vop_read)(struct vnode *file, struct uio *uio);
- int (*vop_readlink)(struct vnode *link, struct uio *uio);
- int (*vop_getdirentry)(struct vnode *dir, struct uio *uio);
- int (*vop_write)(struct vnode *file, struct uio *uio);
- int (*vop_ioctl)(struct vnode *object, int op, userptr_t data);
- int (*vop_stat)(struct vnode *object, struct stat *statbuf);
- int (*vop_gettype)(struct vnode *object, mode_t *result);
- int (*vop_tryseek)(struct vnode *object, off_t pos);
- int (*vop_fsync)(struct vnode *object);
- int (*vop_mmap)(struct vnode *file );
- int (*vop_truncate)(struct vnode *file, off_t len);
- int (*vop_namefile)(struct vnode *file, struct uio *uio);
- int (*vop_creat)(struct vnode *dir,
- const char *name, bool excl, mode_t mode,
- struct vnode **result);
- int (*vop_symlink)(struct vnode *dir,
- const char *contents, const char *name);
- int (*vop_mkdir)(struct vnode *parentdir,
- const char *name, mode_t mode);
- int (*vop_link)(struct vnode *dir,
- const char *name, struct vnode *file);
- int (*vop_remove)(struct vnode *dir,
- const char *name);
- int (*vop_rmdir)(struct vnode *dir,
- const char *name);
- int (*vop_rename)(struct vnode *vn1, const char *name1,
- struct vnode *vn2, const char *name2);
-
- int (*vop_lookup)(struct vnode *dir,
- char *pathname, struct vnode **result);
- int (*vop_lookparent)(struct vnode *dir,
- char *pathname, struct vnode **result,
- char *buf, size_t len);
- };
- #define __VOP(vn, sym) (vnode_check(vn, #sym), (vn)->vn_ops->vop_##sym)
- #define VOP_OPEN(vn, flags) (__VOP(vn, open)(vn, flags))
- #define VOP_CLOSE(vn) (__VOP(vn, close)(vn))
- #define VOP_RECLAIM(vn) (__VOP(vn, reclaim)(vn))
- #define VOP_READ(vn, uio) (__VOP(vn, read)(vn, uio))
- #define VOP_READLINK(vn, uio) (__VOP(vn, readlink)(vn, uio))
- #define VOP_GETDIRENTRY(vn, uio) (__VOP(vn,getdirentry)(vn, uio))
- #define VOP_WRITE(vn, uio) (__VOP(vn, write)(vn, uio))
- #define VOP_IOCTL(vn, code, buf) (__VOP(vn, ioctl)(vn,code,buf))
- #define VOP_STAT(vn, ptr) (__VOP(vn, stat)(vn, ptr))
- #define VOP_GETTYPE(vn, result) (__VOP(vn, gettype)(vn, result))
- #define VOP_TRYSEEK(vn, pos) (__VOP(vn, tryseek)(vn, pos))
- #define VOP_FSYNC(vn) (__VOP(vn, fsync)(vn))
- #define VOP_MMAP(vn /*add stuff */) (__VOP(vn, mmap)(vn /*add stuff */))
- #define VOP_TRUNCATE(vn, pos) (__VOP(vn, truncate)(vn, pos))
- #define VOP_NAMEFILE(vn, uio) (__VOP(vn, namefile)(vn, uio))
- #define VOP_CREAT(vn,nm,excl,mode,res) (__VOP(vn, creat)(vn,nm,excl,mode,res))
- #define VOP_SYMLINK(vn, name, content) (__VOP(vn, symlink)(vn, name, content))
- #define VOP_MKDIR(vn, name, mode) (__VOP(vn, mkdir)(vn, name, mode))
- #define VOP_LINK(vn, name, vn2) (__VOP(vn, link)(vn, name, vn2))
- #define VOP_REMOVE(vn, name) (__VOP(vn, remove)(vn, name))
- #define VOP_RMDIR(vn, name) (__VOP(vn, rmdir)(vn, name))
- #define VOP_RENAME(vn1,name1,vn2,name2)(__VOP(vn1,rename)(vn1,name1,vn2,name2))
- #define VOP_LOOKUP(vn, name, res) (__VOP(vn, lookup)(vn, name, res))
- #define VOP_LOOKPARENT(vn,nm,res,bf,ln) (__VOP(vn,lookparent)(vn,nm,res,bf,ln))
- void vnode_check(struct vnode *, const char *op);
- void vnode_incref(struct vnode *);
- void vnode_decref(struct vnode *);
- #define VOP_INCREF(vn) vnode_incref(vn)
- #define VOP_DECREF(vn) vnode_decref(vn)
- void vnode_incopen(struct vnode *);
- void vnode_decopen(struct vnode *);
- #define VOP_INCOPEN(vn) vnode_incopen(vn)
- #define VOP_DECOPEN(vn) vnode_decopen(vn)
- int vnode_init(struct vnode *, const struct vnode_ops *ops,
- struct fs *fs, void *fsdata);
- #define VOP_INIT(vn, ops, fs, data) vnode_init(vn, ops, fs, data)
- void vnode_cleanup(struct vnode *);
- #define VOP_CLEANUP(vn) vnode_cleanup(vn)
- #endif /* _VNODE_H_ */
|