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_int; 28 typedef struct fsh_int fsh_int_t; 29 30 #define FSH_OPS \ 31 /* vnode */ \ 32 int (*hook_read)(fsh_int_t *fsh_int, void *arg, vnode_t *vp, \ 33 uio_t *uiop, int ioflag, cred_t *cr, caller_context_t *ct); \ 34 int (*hook_write)(fsh_int_t *fsh_int, void *arg, vnode_t *vp, \ 35 uio_t *uiop, int ioflag, cred_t *cr, caller_context_t *ct); \ 36 /* vfs */ \ 37 int (*hook_mount)(fsh_int_t *fsh_int, void *arg, vfs_t *vfsp, \ 38 vnode_t *mvp, struct mounta *uap, cred_t *cr); \ 39 int (*hook_unmount)(fsh_int_t *fsh_int, void *arg, vfs_t *vfsp, \ 40 int flag, cred_t *cr) \ 41 42 /* API */ 43 typedef struct fsh { 44 void *arg; 45 FSH_OPS; 46 } fsh_t; 47 48 extern void fsh_hook_install(vfs_t *vfsp, fsh_t *hooks); 49 extern void fsh_hook_remove(vfs_t *vfsp, fsh_t *hooks); 50 51 typedef struct fsh_callback { 52 void *fshc_arg; 53 void (*fshc_free)(vfs_t *vfsp, void *arg); 54 void (*fshc_mount)(vfs_t *vfsp, void *arg); 55 } fsh_callback_t; 56 57 extern void fsh_callback_install(fsh_callback_t *fsh_callback); 58 extern void fsh_callback_remove(fsh_callback_t *fsh_callback); 59 60 extern void fsh_fs_enable(vfs_t *vfsp); 61 extern void fsh_fs_disable(vfs_t *vfsp); 62 63 /* FSH control passing */ 64 extern int fsh_next_read(fsh_int_t *fsh_int, vnode_t *vp, 65 uio_t *uiop, int ioflag, cred_t *cr, caller_context_t *ct); 66 extern int fsh_next_write(fsh_int_t *fsh_int, vnode_t *vp, 67 uio_t *uiop, int ioflag, cred_t *cr, caller_context_t *ct); 68 69 extern int fsh_next_mount(fsh_int_t *fsh_int, vfs_t *vfsp, 70 vnode_t *mvp, struct mounta *uap, cred_t *cr); 71 extern int fsh_next_unmount(fsh_int_t *fsh_int, vfs_t *vfsp, 72 int flag, cred_t *cr); 73 74 #ifdef __cplusplus 75 } 76 #endif 77 78 #endif /* _FSH_H */