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 
  37         /* vnode */
  38         int (*read)(fsh_int_t *, void *, vnode_t *, uio_t *, int, cred_t *,
  39                 caller_context_t *);
  40         int (*write)(fsh_int_t *, void *, vnode_t *, uio_t *, int, cred_t *,
  41                 caller_context_t *);
  42 
  43         /* vfs */
  44         int (*mount)(fsh_int_t *, void *, vfs_t *, vnode_t *, struct mounta *,
  45                 cred_t *);
  46         int (*unmount)(fsh_int_t *, void *, vfs_t *, int, cred_t *);
  47 } fsh_t;
  48 
  49 typedef struct fsh_callback {
  50         void    *fshc_arg;
  51         void    (*fshc_free)(vfs_t *, void *);
  52         void    (*fshc_mount)(vfs_t *, void *);
  53 } fsh_callback_t;
  54 
  55 /* API */
  56 extern fsh_handle_t fsh_hook_install(vfs_t *, fsh_t *);
  57 extern int fsh_hook_remove(fsh_handle_t);
  58 
  59 extern fsh_callback_handle_t fsh_callback_install(fsh_callback_t *);
  60 extern int fsh_callback_remove(fsh_callback_handle_t);
  61 
  62 extern void fsh_fs_enable(vfs_t *);
  63 extern void fsh_fs_disable(vfs_t *);
  64 
  65 /* fsh control passing */
  66 extern int fsh_next_read(fsh_int_t *, vnode_t *, uio_t *, int, cred_t *,
  67                 caller_context_t *);
  68 extern int fsh_next_write(fsh_int_t *, vnode_t *, uio_t *, int, cred_t *,
  69                 caller_context_t *);
  70 
  71 extern int fsh_next_mount(fsh_int_t *, vfs_t *, vnode_t *, struct mounta *uap,
  72                 cred_t *);
  73 extern int fsh_next_unmount(fsh_int_t *, vfs_t *, int, cred_t *);
  74 
  75 #ifdef __cplusplus
  76 }
  77 #endif
  78 
  79 #endif /* _FSH_H */