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_cb)(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 */