diff options
Diffstat (limited to 'usr/src/uts/common/sys/vnode.h')
-rw-r--r-- | usr/src/uts/common/sys/vnode.h | 184 |
1 files changed, 86 insertions, 98 deletions
diff --git a/usr/src/uts/common/sys/vnode.h b/usr/src/uts/common/sys/vnode.h index 0e69840c1a..d2494e013e 100644 --- a/usr/src/uts/common/sys/vnode.h +++ b/usr/src/uts/common/sys/vnode.h @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -59,41 +59,6 @@ extern "C" { #endif - -typedef int (*fs_generic_func_p) (); - -/* - * File systems use arrays of fs_operation_def structures to form - * name/value pairs of operations. These arrays get passed to: - * - * - vn_make_ops() to create vnodeops - * - vfs_makefsops()/vfs_setfsops() to create vfsops. - */ -typedef struct fs_operation_def { - char *name; /* name of operation (NULL at end) */ - fs_generic_func_p func; /* function implementing operation */ -} fs_operation_def_t; - -/* - * The operation registration mechanism uses two master tables of operations: - * one for vnode operations (vn_ops_table[]) and one for vfs operations - * (vfs_ops_table[]). These tables are arrays of fs_operation_trans_def - * structures. They contain all of the information necessary for the system - * to populate an operations structure (e.g., vnodeops, vfsops). - * - * File systems call registration routines (vfs_setfsops(), vfs_makefsops(), - * and vn_make_ops()) and pass in their operations specification tables - * (arrays of fs_operation_def structures). These routines use the master - * table(s) of operations to build a vnodeops or vfsops structure. - */ -typedef struct fs_operation_trans_def { - char *name; /* name of operation (NULL at end) */ - int offset; /* byte offset within ops vector */ - fs_generic_func_p defaultFunc; /* default function */ - fs_generic_func_p errorFunc; /* error function */ -} fs_operation_trans_def_t; - - /* * Statistics for all vnode operations. * All operations record number of ops (since boot/mount/zero'ed). @@ -562,74 +527,98 @@ struct seg; struct as; struct pollhead; +#ifdef _KERNEL + /* - * Operations on vnodes. Note: File systems should never operate directly + * VNODE_OPS defines all the vnode operations. It is used to define + * the vnodeops structure (below) and the fs_func_p union (vfs_opreg.h). + */ +#define VNODE_OPS \ + int (*vop_open)(vnode_t **, int, cred_t *); \ + int (*vop_close)(vnode_t *, int, int, offset_t, cred_t *); \ + int (*vop_read)(vnode_t *, uio_t *, int, cred_t *, \ + caller_context_t *); \ + int (*vop_write)(vnode_t *, uio_t *, int, cred_t *, \ + caller_context_t *); \ + int (*vop_ioctl)(vnode_t *, int, intptr_t, int, cred_t *, \ + int *); \ + int (*vop_setfl)(vnode_t *, int, int, cred_t *); \ + int (*vop_getattr)(vnode_t *, vattr_t *, int, cred_t *); \ + int (*vop_setattr)(vnode_t *, vattr_t *, int, cred_t *, \ + caller_context_t *); \ + int (*vop_access)(vnode_t *, int, int, cred_t *); \ + int (*vop_lookup)(vnode_t *, char *, vnode_t **, \ + struct pathname *, \ + int, vnode_t *, cred_t *); \ + int (*vop_create)(vnode_t *, char *, vattr_t *, vcexcl_t, \ + int, vnode_t **, cred_t *, int); \ + int (*vop_remove)(vnode_t *, char *, cred_t *); \ + int (*vop_link)(vnode_t *, vnode_t *, char *, cred_t *); \ + int (*vop_rename)(vnode_t *, char *, vnode_t *, char *, \ + cred_t *); \ + int (*vop_mkdir)(vnode_t *, char *, vattr_t *, vnode_t **, \ + cred_t *); \ + int (*vop_rmdir)(vnode_t *, char *, vnode_t *, cred_t *); \ + int (*vop_readdir)(vnode_t *, uio_t *, cred_t *, int *); \ + int (*vop_symlink)(vnode_t *, char *, vattr_t *, char *, \ + cred_t *); \ + int (*vop_readlink)(vnode_t *, uio_t *, cred_t *); \ + int (*vop_fsync)(vnode_t *, int, cred_t *); \ + void (*vop_inactive)(vnode_t *, cred_t *); \ + int (*vop_fid)(vnode_t *, struct fid *); \ + int (*vop_rwlock)(vnode_t *, int, caller_context_t *); \ + void (*vop_rwunlock)(vnode_t *, int, caller_context_t *); \ + int (*vop_seek)(vnode_t *, offset_t, offset_t *); \ + int (*vop_cmp)(vnode_t *, vnode_t *); \ + int (*vop_frlock)(vnode_t *, int, struct flock64 *, \ + int, offset_t, \ + struct flk_callback *, cred_t *); \ + int (*vop_space)(vnode_t *, int, struct flock64 *, \ + int, offset_t, \ + cred_t *, caller_context_t *); \ + int (*vop_realvp)(vnode_t *, vnode_t **); \ + int (*vop_getpage)(vnode_t *, offset_t, size_t, uint_t *, \ + struct page **, size_t, struct seg *, \ + caddr_t, enum seg_rw, cred_t *); \ + int (*vop_putpage)(vnode_t *, offset_t, size_t, \ + int, cred_t *); \ + int (*vop_map)(vnode_t *, offset_t, struct as *, \ + caddr_t *, size_t, \ + uchar_t, uchar_t, uint_t, cred_t *); \ + int (*vop_addmap)(vnode_t *, offset_t, struct as *, \ + caddr_t, size_t, \ + uchar_t, uchar_t, uint_t, cred_t *); \ + int (*vop_delmap)(vnode_t *, offset_t, struct as *, \ + caddr_t, size_t, \ + uint_t, uint_t, uint_t, cred_t *); \ + int (*vop_poll)(vnode_t *, short, int, short *, \ + struct pollhead **); \ + int (*vop_dump)(vnode_t *, caddr_t, int, int); \ + int (*vop_pathconf)(vnode_t *, int, ulong_t *, cred_t *); \ + int (*vop_pageio)(vnode_t *, struct page *, \ + u_offset_t, size_t, int, cred_t *); \ + int (*vop_dumpctl)(vnode_t *, int, int *); \ + void (*vop_dispose)(vnode_t *, struct page *, \ + int, int, cred_t *); \ + int (*vop_setsecattr)(vnode_t *, vsecattr_t *, \ + int, cred_t *); \ + int (*vop_getsecattr)(vnode_t *, vsecattr_t *, \ + int, cred_t *); \ + int (*vop_shrlock)(vnode_t *, int, struct shrlock *, \ + int, cred_t *); \ + int (*vop_vnevent)(vnode_t *, vnevent_t) /* NB: No ";" */ + +/* + * Operations on vnodes. Note: File systems must never operate directly * on a 'vnodeops' structure -- it WILL change in future releases! They - * should use vn_make_ops() to create the structure. + * must use vn_make_ops() to create the structure. */ typedef struct vnodeops { const char *vnop_name; - int (*vop_open)(vnode_t **, int, cred_t *); - int (*vop_close)(vnode_t *, int, int, offset_t, cred_t *); - int (*vop_read)(vnode_t *, uio_t *, int, cred_t *, - caller_context_t *); - int (*vop_write)(vnode_t *, uio_t *, int, cred_t *, - caller_context_t *); - int (*vop_ioctl)(vnode_t *, int, intptr_t, int, cred_t *, int *); - int (*vop_setfl)(vnode_t *, int, int, cred_t *); - int (*vop_getattr)(vnode_t *, vattr_t *, int, cred_t *); - int (*vop_setattr)(vnode_t *, vattr_t *, int, cred_t *, - caller_context_t *); - int (*vop_access)(vnode_t *, int, int, cred_t *); - int (*vop_lookup)(vnode_t *, char *, vnode_t **, struct pathname *, - int, vnode_t *, cred_t *); - int (*vop_create)(vnode_t *, char *, vattr_t *, vcexcl_t, int, - vnode_t **, cred_t *, int); - int (*vop_remove)(vnode_t *, char *, cred_t *); - int (*vop_link)(vnode_t *, vnode_t *, char *, cred_t *); - int (*vop_rename)(vnode_t *, char *, vnode_t *, char *, cred_t *); - int (*vop_mkdir)(vnode_t *, char *, vattr_t *, vnode_t **, - cred_t *); - int (*vop_rmdir)(vnode_t *, char *, vnode_t *, cred_t *); - int (*vop_readdir)(vnode_t *, uio_t *, cred_t *, int *); - int (*vop_symlink)(vnode_t *, char *, vattr_t *, char *, cred_t *); - int (*vop_readlink)(vnode_t *, uio_t *, cred_t *); - int (*vop_fsync)(vnode_t *, int, cred_t *); - void (*vop_inactive)(vnode_t *, cred_t *); - int (*vop_fid)(vnode_t *, struct fid *); - int (*vop_rwlock)(vnode_t *, int, caller_context_t *); - void (*vop_rwunlock)(vnode_t *, int, caller_context_t *); - int (*vop_seek)(vnode_t *, offset_t, offset_t *); - int (*vop_cmp)(vnode_t *, vnode_t *); - int (*vop_frlock)(vnode_t *, int, struct flock64 *, int, offset_t, - struct flk_callback *, cred_t *); - int (*vop_space)(vnode_t *, int, struct flock64 *, int, offset_t, - cred_t *, caller_context_t *); - int (*vop_realvp)(vnode_t *, vnode_t **); - int (*vop_getpage)(vnode_t *, offset_t, size_t, uint_t *, - struct page **, size_t, struct seg *, - caddr_t, enum seg_rw, cred_t *); - int (*vop_putpage)(vnode_t *, offset_t, size_t, int, cred_t *); - int (*vop_map)(vnode_t *, offset_t, struct as *, caddr_t *, size_t, - uchar_t, uchar_t, uint_t, cred_t *); - int (*vop_addmap)(vnode_t *, offset_t, struct as *, caddr_t, size_t, - uchar_t, uchar_t, uint_t, cred_t *); - int (*vop_delmap)(vnode_t *, offset_t, struct as *, caddr_t, size_t, - uint_t, uint_t, uint_t, cred_t *); - int (*vop_poll)(vnode_t *, short, int, short *, struct pollhead **); - int (*vop_dump)(vnode_t *, caddr_t, int, int); - int (*vop_pathconf)(vnode_t *, int, ulong_t *, cred_t *); - int (*vop_pageio)(vnode_t *, struct page *, u_offset_t, size_t, - int, cred_t *); - int (*vop_dumpctl)(vnode_t *, int, int *); - void (*vop_dispose)(vnode_t *, struct page *, int, int, cred_t *); - int (*vop_setsecattr)(vnode_t *, vsecattr_t *, int, cred_t *); - int (*vop_getsecattr)(vnode_t *, vsecattr_t *, int, cred_t *); - int (*vop_shrlock)(vnode_t *, int, struct shrlock *, int, cred_t *); - int (*vop_vnevent)(vnode_t *, vnevent_t); + VNODE_OPS; /* Signatures of all vnode operations (vops) */ } vnodeops_t; -#ifdef _KERNEL +typedef int (*fs_generic_func_p) (); /* Generic vop/vfsop/femop/fsemop ptr */ extern int fop_open(vnode_t **, int, cred_t *); extern int fop_close(vnode_t *, int, int, offset_t, cred_t *); @@ -876,7 +865,6 @@ struct vfs *vn_mountedvfs(vnode_t *); void vn_create_cache(void); void vn_destroy_cache(void); -int vn_make_ops(const char *, const fs_operation_def_t *, vnodeops_t **); void vn_freevnodeops(vnodeops_t *); int vn_open(char *pnamep, enum uio_seg seg, int filemode, int createmode, |