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 /*
17 * This file includes all the necessary declarations for fsh.c, vfs.c
18 * and vnode.c.
19 */
20
21 #ifndef _FSH_IMPL_H
22 #define _FSH_IMPL_H
23
24 #include <sys/atomic.h>
25 #include <sys/fsh.h>
26 #include <sys/pathname.h>
27 #include <sys/types.h>
28 #include <sys/vfs.h>
29 #include <sys/vnode.h>
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 #define FSH_VFS_MOUNT 0
36 #define FSH_VFS_UNMOUNT 1
37 #define FSH_VFS_ROOT 2
38 #define FSH_VFS_STATFS 3
39 #define FSH_VFS_VGET 4
40
41 #define FSH_VOP_OPEN 5
42 #define FSH_VOP_CLOSE 6
43 #define FSH_VOP_READ 7
44 #define FSH_VOP_WRITE 8
45
46 #define FSH_SUPPORTED_OPS_COUNT 9
47
48 /*
49 * TODO:
50 * - change all defined lists to the ones used in illumos kernel
51 * - add comments
52 */
53
54 typedef union fsh_fn {
55 FSH_OPS;
56 } fsh_fn_t;
57
58 /*
59 * fsh_int_t is the internal fsh_t structure. Instead of using a big
60 * structure containing hooks for all the operations, fsh_int_t contains
61 * a pointer (in union fsh_fn_t) to one function. Thanks to this approach,
62 * we don't have to manipulate such big structures. Instead, we keep
63 * a fsh_int_t list for every operation.
64 */
65 typedef struct fsh_int {
66 fsh_fn_t fshi_fn;
67 void *fshi_arg;
68 } fsh_int_t;
69
70
71 struct fsh_node {
72 fsh_int_t fshn_hooki;
73 struct fsh_node *fshn_next;
74 };
75 /* typedef struct fsh_node fsh_node_t; in fsh.h */
76
77 /*
78 * fshl_lock is read-locked by every call to a fsh_vop/vfsop() for
79 * entire execution. This way, we guarantee that a list of hooks is unchanged
80 * during one fop_foo()/fsop_foo() execution.
81 */
82 typedef struct fsh_list {
83 krwlock_t fshl_lock;
84 fsh_node_t *fshl_head;
85 } fsh_list_t;
86
87 /*
88 * fshfsr_enabled informs whether FSH is enabled for this vfs_t.
89 * There are no locks involved. This field should be change only via
90 * atomic operations.
91 */
92 typedef struct fsh_fsrecord {
93 volatile uint_t fshfsr_enabled;
94 fsh_list_t fshfsr_opv[FSH_SUPPORTED_OPS_COUNT];
95 } fsh_fsrecord_t;
96
97
98 typedef struct fsh_callback_node {
99 fsh_callback_t fshcn_callback;
100 struct fsh_callback_node *fshcn_next;
101 } fsh_callback_node_t;
102
103 typedef struct fsh_callback_list {
104 krwlock_t fshcl_lock;
105 fsh_callback_node_t *fshcl_head;
106 } fsh_callback_list_t;
107
108 /* API for vnode.c and vfs.c only */
109 /* vnode.c */
110 extern int fsh_open(vnode_t **vpp, int mode, cred_t *cr, caller_context_t *ct);
111 extern int fsh_close(vnode_t *vp, int flag, int count, offset_t offset,
112 cred_t *cr, caller_context_t *ct);
113 extern int fsh_read(vnode_t *vp, uio_t *uiop, int ioflag, cred_t *cr,
114 caller_context_t *ct);
115 extern int fsh_write(vnode_t *vp, uio_t *uiop, int ioflag, cred_t *cr,
116 caller_context_t *ct);
117
118 /* vfs.c */
119 extern void fsh_init(void);
120
121 extern int fsh_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap,
122 cred_t *cr);
123 extern int fsh_unmount(vfs_t *vfsp, int flag, cred_t *cr);
124 extern int fsh_root(vfs_t *vfsp, vnode_t **vpp);
125 extern int fsh_statfs(vfs_t *vfsp, statvfs64_t *sp);
126 extern int fsh_vget(vfs_t *vfsp, vnode_t **vpp, fid_t *fidp);
127
128 extern void fsh_exec_mount_callbacks(vfs_t *vfsp);
129 extern void fsh_exec_free_callbacks(vfs_t *vfsp);
130
131 extern void fsh_fsrec_destroy(struct fsh_fsrecord *volatile fsrecp);
132
133 #ifdef __cplusplus
134 }
135 #endif
136
137 #endif /* _FSH_IMPL_H */