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  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23  * Copyright (c) 2011 Pawel Jakub Dawidek <pawel@dawidek.net>.
24  * All rights reserved.
25  */
26 
27 #ifndef   _SYS_FS_ZFS_VFSOPS_H
28 #define   _SYS_FS_ZFS_VFSOPS_H
29 
30 #include <sys/list.h>
31 #include <sys/vfs.h>
32 #include <sys/zil.h>
33 #include <sys/sa.h>
34 #include <sys/rrwlock.h>
35 #include <sys/zfs_ioctl.h>
36 
37 #ifdef    __cplusplus
38 extern "C" {
39 #endif
40 
41 typedef struct zfsvfs zfsvfs_t;
42 struct znode;
43 
44 struct zfsvfs {
45           vfs_t               *z_vfs;             /* generic fs struct */
46           zfsvfs_t  *z_parent;          /* parent fs */
47           objset_t  *z_os;              /* objset reference */
48           uint64_t  z_root;             /* id of root znode */
49           uint64_t  z_unlinkedobj;      /* id of unlinked zapobj */
50           uint64_t  z_max_blksz;        /* maximum block size for files */
51           uint64_t  z_fuid_obj;         /* fuid table object number */
52           uint64_t  z_fuid_size;        /* fuid table size */
53           avl_tree_t          z_fuid_idx;         /* fuid tree keyed by index */
54           avl_tree_t          z_fuid_domain;      /* fuid tree keyed by domain */
55           krwlock_t z_fuid_lock;        /* fuid lock */
56           boolean_t z_fuid_loaded;      /* fuid tables are loaded */
57           boolean_t z_fuid_dirty;   /* need to sync fuid table ? */
58           struct zfs_fuid_info          *z_fuid_replay; /* fuid info for replay */
59           zilog_t             *z_log;             /* intent log pointer */
60           uint_t              z_acl_mode;         /* acl chmod/mode behavior */
61           uint_t              z_acl_inherit;      /* acl inheritance behavior */
62           zfs_case_t          z_case;             /* case-sense */
63           boolean_t z_utf8;             /* utf8-only */
64           int                 z_norm;             /* normalization flags */
65           boolean_t z_atime;  /* enable atimes mount option */
66           boolean_t z_unmounted;        /* unmounted */
67           rrmlock_t z_teardown_lock;
68           krwlock_t z_teardown_inactive_lock;
69           list_t              z_all_znodes;       /* all vnodes in the fs */
70           kmutex_t  z_znodes_lock;      /* lock for z_all_znodes */
71           struct zfsctl_root  *z_ctldir;          /* .zfs directory pointer */
72           boolean_t z_show_ctldir;      /* expose .zfs in the root dir */
73           boolean_t z_issnap; /* true if this is a snapshot */
74           boolean_t z_vscan;  /* virus scan on/off */
75           boolean_t z_use_fuids;        /* version allows fuids */
76           boolean_t z_replay; /* set during ZIL replay */
77           boolean_t z_use_sa; /* version allow system attributes */
78           boolean_t z_use_namecache;/* make use of FreeBSD name cache */
79           uint64_t  z_version;          /* ZPL version */
80           uint64_t  z_shares_dir;       /* hidden shares dir */
81           kmutex_t  z_lock;
82           uint64_t  z_userquota_obj;
83           uint64_t  z_groupquota_obj;
84           uint64_t  z_replay_eof;       /* New end of file - replay only */
85           sa_attr_type_t      *z_attr_table;      /* SA attr mapping->id */
86 #define   ZFS_OBJ_MTX_SZ      64
87           kmutex_t  z_hold_mtx[ZFS_OBJ_MTX_SZ];   /* znode hold locks */
88 };
89 
90 /*
91  * Normal filesystems (those not under .zfs/snapshot) have a total
92  * file ID size limited to 12 bytes (including the length field) due to
93  * NFSv2 protocol's limitation of 32 bytes for a filehandle.  For historical
94  * reasons, this same limit is being imposed by the Solaris NFSv3 implementation
95  * (although the NFSv3 protocol actually permits a maximum of 64 bytes).  It
96  * is not possible to expand beyond 12 bytes without abandoning support
97  * of NFSv2.
98  *
99  * For normal filesystems, we partition up the available space as follows:
100  *        2 bytes             fid length (required)
101  *        6 bytes             object number (48 bits)
102  *        4 bytes             generation number (32 bits)
103  *
104  * We reserve only 48 bits for the object number, as this is the limit
105  * currently defined and imposed by the DMU.
106  */
107 typedef struct zfid_short {
108           uint16_t  zf_len;
109           uint8_t             zf_object[6];                 /* obj[i] = obj >> (8 * i) */
110           uint8_t             zf_gen[4];                    /* gen[i] = gen >> (8 * i) */
111 } zfid_short_t;
112 
113 /*
114  * Filesystems under .zfs/snapshot have a total file ID size of 22[*] bytes
115  * (including the length field).  This makes files under .zfs/snapshot
116  * accessible by NFSv3 and NFSv4, but not NFSv2.
117  *
118  * For files under .zfs/snapshot, we partition up the available space
119  * as follows:
120  *        2 bytes             fid length (required)
121  *        6 bytes             object number (48 bits)
122  *        4 bytes             generation number (32 bits)
123  *        6 bytes             objset id (48 bits)
124  *        4 bytes[**]         currently just zero (32 bits)
125  *
126  * We reserve only 48 bits for the object number and objset id, as these are
127  * the limits currently defined and imposed by the DMU.
128  *
129  * [*] 20 bytes on FreeBSD to fit into the size of struct fid.
130  * [**] 2 bytes on FreeBSD for the above reason.
131  */
132 typedef struct zfid_long {
133           zfid_short_t        z_fid;
134           uint8_t             zf_setid[6];                  /* obj[i] = obj >> (8 * i) */
135           uint8_t             zf_setgen[2];                 /* gen[i] = gen >> (8 * i) */
136 } zfid_long_t;
137 
138 #define   SHORT_FID_LEN       (sizeof (zfid_short_t) - sizeof (uint16_t))
139 #define   LONG_FID_LEN        (sizeof (zfid_long_t) - sizeof (uint16_t))
140 
141 extern uint_t zfs_fsyncer_key;
142 extern int zfs_super_owner;
143 
144 extern int zfs_suspend_fs(zfsvfs_t *zfsvfs);
145 extern int zfs_resume_fs(zfsvfs_t *zfsvfs, struct dsl_dataset *ds);
146 extern int zfs_userspace_one(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type,
147     const char *domain, uint64_t rid, uint64_t *valuep);
148 extern int zfs_userspace_many(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type,
149     uint64_t *cookiep, void *vbuf, uint64_t *bufsizep);
150 extern int zfs_set_userquota(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type,
151     const char *domain, uint64_t rid, uint64_t quota);
152 extern boolean_t zfs_owner_overquota(zfsvfs_t *zfsvfs, struct znode *,
153     boolean_t isgroup);
154 extern boolean_t zfs_fuid_overquota(zfsvfs_t *zfsvfs, boolean_t isgroup,
155     uint64_t fuid);
156 extern int zfs_set_version(zfsvfs_t *zfsvfs, uint64_t newvers);
157 extern int zfsvfs_create(const char *name, zfsvfs_t **zfvp);
158 extern void zfsvfs_free(zfsvfs_t *zfsvfs);
159 extern int zfs_check_global_label(const char *dsname, const char *hexsl);
160 
161 #ifdef _KERNEL
162 extern void zfsvfs_update_fromname(const char *oldname, const char *newname);
163 #endif
164 
165 #ifdef    __cplusplus
166 }
167 #endif
168 
169 #endif    /* _SYS_FS_ZFS_VFSOPS_H */
170