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/id_space.h> 20 #include <sys/types.h> 21 #include <sys/vfs.h> 22 #include <sys/vnode.h> 23 24 #ifdef __cplusplus 25 extern "C" { 26 #endif 27 28 typedef id_t fsh_handle_t; 29 typedef id_t fsh_callback_handle_t; 30 31 struct fsh_int; 32 typedef struct fsh_int fsh_int_t; 33 34 typedef struct fsh { 35 void *arg; 36 void (*remove_callback)(void *, fsh_handle_t); 37 38 /* vnode */ 39 int (*read)(fsh_int_t *, void *, vnode_t *, uio_t *, int, cred_t *, 40 caller_context_t *); 41 int (*write)(fsh_int_t *, void *, vnode_t *, uio_t *, int, cred_t *, 42 caller_context_t *); 43 44 /* vfs */ 45 int (*mount)(fsh_int_t *, void *, vfs_t *, vnode_t *, struct mounta *, 46 cred_t *); 47 int (*unmount)(fsh_int_t *, void *, vfs_t *, int, cred_t *); 48 } fsh_t; 49 50 typedef struct fsh_callback { 51 void *fshc_arg; 52 void (*fshc_free)(vfs_t *, void *); 53 void (*fshc_mount)(vfs_t *, void *); 54 } fsh_callback_t; 55 56 /* API */ 57 extern fsh_handle_t fsh_hook_install(vfs_t *, fsh_t *); 58 extern int fsh_hook_remove(fsh_handle_t); 59 60 extern fsh_callback_handle_t fsh_callback_install(fsh_callback_t *); 61 extern int fsh_callback_remove(fsh_callback_handle_t); 62 63 extern void fsh_fs_enable(vfs_t *); 64 extern void fsh_fs_disable(vfs_t *); 65 66 /* fsh control passing */ 67 extern int fsh_next_read(fsh_int_t *, vnode_t *, uio_t *, int, cred_t *, 68 caller_context_t *); 69 extern int fsh_next_write(fsh_int_t *, vnode_t *, uio_t *, int, cred_t *, 70 caller_context_t *); 71 72 extern int fsh_next_mount(fsh_int_t *, vfs_t *, vnode_t *, struct mounta *uap, 73 cred_t *); 74 extern int fsh_next_unmount(fsh_int_t *, vfs_t *, int, cred_t *); 75 76 #ifdef __cplusplus 77 } 78 #endif 79 80 #endif /* _FSH_H */