1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 12 /* 13 * Copyright 2013 Damian Bogel. All rights reserved. 14 */ 15 16 #ifndef _FSH_H 17 #define _FSH_H 18 19 #include <sys/types.h> 20 #include <sys/vfs.h> 21 #include <sys/vnode.h> 22 23 #ifdef __cplusplus 24 extern "C" { 25 #endif 26 27 struct fsh_node; 28 typedef struct fsh_node fsh_node_t; 29 30 #define FSH_OPS \ 31 int (*hook_open)(const fsh_node_t *fsh_node, void *arg, vnode_t **vpp, \ 32 int mode, cred_t *cr, caller_context_t *ct); \ 33 int (*hook_close)(const fsh_node_t *fsh_node, void *arg, vnode_t *vp, \ 34 int flag, int count, offset_t offset, cred_t *cr, \ 35 caller_context_t *ct); \ 36 int (*hook_read)(const fsh_node_t *fsh_node, void *arg, vnode_t *vp, \ 37 uio_t *uiop, int ioflag, cred_t *cr, caller_context_t *ct); \ 38 int (*hook_write)(const fsh_node_t *fsh_node, void *arg, vnode_t *vp, \ 39 uio_t *uiop, int ioflag, cred_t *cr, caller_context_t *ct); \ 40 /* vfs */ \ 41 int (*hook_mount)(const fsh_node_t *fsh_node, void *arg, vfs_t *vfsp, \ 42 vnode_t *mvp, struct mounta *uap, cred_t *cr); \ 43 int (*hook_unmount)(const fsh_node_t *fsh_node, void *arg, vfs_t *vfsp, \ 44 int flag, cred_t *cr); \ 45 int (*hook_root)(const fsh_node_t *fsh_node, void *arg, vfs_t *vfsp, \ 46 vnode_t **vpp); \ 47 int (*hook_statfs)(const fsh_node_t *fsh_node, void *arg, vfs_t *vfsp, \ 48 statvfs64_t *sp); \ 49 int (*hook_vget)(const fsh_node_t *fsh_node, void *arg, vfs_t *vfsp, \ 50 vnode_t **vpp, fid_t *fidp) /* NO ';' HERE */ 51 52 /* API */ 53 typedef struct fsh { 54 void *arg; 55 FSH_OPS; 56 } fsh_t; 57 58 extern void fsh_hook_install(vfs_t *vfsp, fsh_t *hooks); 59 extern void fsh_hook_remove(vfs_t *vfsp, fsh_t *hooks); 60 extern void fsh_hook_check(vfs_t *vfsp, fsh_t *hooks, fsh_t *mask); 61 62 typedef struct fsh_callback { 63 void *fshc_arg; 64 void (*fshc_mount)(vfs_t *vfsp, void *arg); 65 void (*fshc_free)(vfs_t *vfsp, void *arg); 66 } fsh_callback_t; 67 68 extern void fsh_callback_install(fsh_callback_t *fsh_callback); 69 extern void fsh_callback_remove(fsh_callback_t *fsh_callback); 70 71 extern void fsh_fs_enable(vfs_t *vfsp); 72 extern void fsh_fs_disable(vfs_t *vfsp); 73 74 /* FSH control passing */ 75 extern int fsh_next_open(fsh_node_t *fsh_node, vnode_t **vpp, 76 int mode, cred_t *cr, caller_context_t *ct); 77 extern int fsh_next_close(fsh_node_t *fsh_node, vnode_t *vp, 78 int flag, int count, offset_t offset, cred_t *cr, 79 caller_context_t *ct); 80 extern int fsh_next_read(fsh_node_t *fsh_node, vnode_t *vp, 81 uio_t *uiop, int ioflag, cred_t *cr, caller_context_t *ct); 82 extern int fsh_next_write(fsh_node_t *fsh_node, vnode_t *vp, 83 uio_t *uiop, int ioflag, cred_t *cr, caller_context_t *ct); 84 85 extern int fsh_next_mount(fsh_node_t *fsh_node, vfs_t *vfsp, 86 vnode_t *mvp, struct mounta *uap, cred_t *cr); 87 extern int fsh_next_unmount(fsh_node_t *fsh_node, vfs_t *vfsp, 88 int flag, cred_t *cr); 89 extern int fsh_next_root(fsh_node_t *fsh_node, vfs_t *vfsp, 90 vnode_t **vpp); 91 extern int fsh_next_statfs(fsh_node_t *fsh_node, vfs_t *vfsp, statvfs64_t *sp); 92 extern int fsh_next_vget(fsh_node_t *fsh_node, vfs_t *vfsp, 93 vnode_t **vpp, fid_t *fidp); 94 95 #ifdef __cplusplus 96 } 97 #endif 98 99 #endif /* _FSH_H */