1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /*
28 * Copyright 2018 Nexenta Systems, Inc.
29 */
30
31 #ifndef _SHAREFS_SHAREFS_H
32 #define _SHAREFS_SHAREFS_H
33
34 /*
35 * This header provides service for the sharefs module.
36 */
37
38 #include <sys/modctl.h>
39 #include <sys/vfs.h>
40 #include <sys/vnode.h>
41 #include <sys/gfs.h>
42 #include <sharefs/share.h>
43 #include <sharefs/sharetab.h>
44
45 #ifdef __cplusplus
46 extern "C" {
47 #endif
48
49 #define SHAREFS_ROOT "/etc/dfs"
50 #define SHAREFS_BASE "sharetab"
51
52 /*
53 * Lengths of strings.
54 */
55 typedef struct sharefs_lens {
56 int shl_path;
57 int shl_res;
58 int shl_fstype;
59 int shl_opts;
60 int shl_descr;
61 } sharefs_lens_t;
62
63 /*
64 * VFS data object
65 */
66 typedef struct sharefs_vfs {
67 vnode_t *sharefs_vfs_root;
68 } sharefs_vfs_t;
69
70 #define SHAREFS_NAME_MAX MAXNAMELEN
71
72 typedef struct sharetab_globals {
73 /*
74 * The lock ordering whenever sharefs_lock and sharetab_lock both
75 * need to be held is: sharefs_lock and then sharetab_lock.
76 */
77 krwlock_t sharefs_lock; /* lock for the vnode ops */
78 sharetab_t *sharefs_sharetab; /* The sharetab. */
79
80 uint_t sharetab_count; /* How many shares? */
81 krwlock_t sharetab_lock; /* lock for the cached sharetab */
82 size_t sharetab_size; /* How big is the sharetab file? */
83
84 timestruc_t sharetab_mtime; /* Last mod to sharetab */
85 timestruc_t sharetab_snap_time; /* Last snap */
86 uint_t sharetab_generation; /* Which copy is it? */
87 } sharetab_globals_t;
88
89 #define SHAREFS_INO_FILE 0x80
90
91 extern vnode_t *sharefs_create_root_file(vfs_t *);
92 extern sharetab_globals_t *sharetab_get_globals(zone_t *zone);
93
94 /*
95 * Sharetab file
96 *
97 * Note that even though the sharetab code does not explictly
98 * use 'sharefs_file', it is required by GFS that the first
99 * field of the private data be a gfs_file_t.
100 */
101 typedef struct shnode_t {
102 gfs_file_t sharefs_file; /* gfs file */
103 char *sharefs_snap; /* snapshot of the share */
104 size_t sharefs_size; /* size of the snapshot */
105 uint_t sharefs_count; /* number of shares */
106 uint_t sharefs_refs; /* reference count */
107 uint_t sharefs_real_vp; /* Are we a real or snap */
108 uint_t sharefs_generation; /* Which copy are we? */
109 timestruc_t sharefs_snap_time; /* When were we modded? */
110 } shnode_t;
111
112 /*
113 * Some conversion macros:
114 */
115 #define VTOSH(vp) ((shnode_t *)((vp)->v_data))
116
117 extern const fs_operation_def_t sharefs_tops_data[];
118 extern vnodeops_t *sharefs_ops_data;
119
120 extern void sharefs_data_init(void);
121
122 extern void sharefs_sharetab_init(void);
123
124 #ifdef __cplusplus
125 }
126 #endif
127
128 #endif /* !_SHAREFS_SHAREFS_H */