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 typedef struct fsh {
  32         void *arg;
  33         void (*remove_cb)(void *, fsh_handle_t);
  34 
  35         /* vnode */
  36         void (*pre_read)(void *, void **, vnode_t **, uio_t **, int *,
  37                 cred_t **, caller_context_t **);
  38         int (*post_read)(int, void *, void *, vnode_t *, uio_t *, int, cred_t *,
  39                 caller_context_t *);
  40         void (*pre_write)(void *, void **, vnode_t **, uio_t **, int *,
  41                 cred_t **, caller_context_t **);
  42         int (*post_write)(int, void *, void *, vnode_t *, uio_t *, int,
  43                 cred_t *, caller_context_t *);
  44 
  45         /* vfs */
  46         void (*pre_mount)(void *, void **, vfs_t **, vnode_t **,
  47                 struct mounta **, cred_t **);
  48         int (*post_mount)(int, void *, void *, vfs_t *, vnode_t *,
  49                 struct mounta *, cred_t *);
  50         void (*pre_unmount)(void *, void **, vfs_t **, int *, cred_t **);
  51         int (*post_unmount)(int, void *, void *, vfs_t *, int, cred_t *);
  52 } fsh_t;
  53 
  54 typedef struct fsh_callback {
  55         void    *fshc_arg;
  56         void    (*fshc_free)(vfs_t *, void *);
  57         void    (*fshc_mount)(vfs_t *, void *);
  58 } fsh_callback_t;
  59 
  60 /* API */
  61 extern fsh_handle_t fsh_hook_install(vfs_t *, fsh_t *);
  62 extern int fsh_hook_remove(fsh_handle_t);
  63 
  64 extern fsh_callback_handle_t fsh_callback_install(fsh_callback_t *);
  65 extern int fsh_callback_remove(fsh_callback_handle_t);
  66 
  67 extern void fsh_fs_enable(vfs_t *);
  68 extern void fsh_fs_disable(vfs_t *);
  69 
  70 #ifdef __cplusplus
  71 }
  72 #endif
  73 
  74 #endif /* _FSH_H */