Print this page
NEX-14666 Need to provide SMB 2.1 Client
NEX-17187 panic in smbfs_acl_store
NEX-17231 smbfs create xattr files finds wrong file
NEX-17224 smbfs lookup EINVAL should be ENOENT
NEX-17260 SMB1 client fails to list directory after NEX-14666
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Joyce McIntosh <joyce.mcintosh@nexenta.com>
and: (cleanup)
5404 smbfs needs mmap support
Portions contributed by: Gordon Ross <gordon.w.ross@gmail.com>
Reviewed by: C Fraire <cfraire@me.com>
Reviewed by: Toomas Soome <tsoome@me.com>
Reviewed by: Jason King <jason.brian.king@gmail.com>
Reviewed by: Andrew Stormont <andyjstormont@gmail.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
| Split |
Close |
| Expand all |
| Collapse all |
--- old/usr/src/uts/common/fs/smbclnt/smbfs/smbfs_node.h
+++ new/usr/src/uts/common/fs/smbclnt/smbfs/smbfs_node.h
1 1 /*
2 2 * Copyright (c) 2000-2001, Boris Popov
3 3 * All rights reserved.
4 4 *
5 5 * Redistribution and use in source and binary forms, with or without
6 6 * modification, are permitted provided that the following conditions
7 7 * are met:
8 8 * 1. Redistributions of source code must retain the above copyright
9 9 * notice, this list of conditions and the following disclaimer.
10 10 * 2. Redistributions in binary form must reproduce the above copyright
11 11 * notice, this list of conditions and the following disclaimer in the
12 12 * documentation and/or other materials provided with the distribution.
13 13 * 3. All advertising materials mentioning features or use of this software
14 14 * must display the following acknowledgement:
15 15 * This product includes software developed by Boris Popov.
16 16 * 4. Neither the name of the author nor the names of any co-contributors
17 17 * may be used to endorse or promote products derived from this software
18 18 * without specific prior written permission.
19 19 *
20 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
↓ open down ↓ |
25 lines elided |
↑ open up ↑ |
26 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 30 * SUCH DAMAGE.
31 31 *
32 32 * $Id: smbfs_node.h,v 1.31.52.1 2005/05/27 02:35:28 lindak Exp $
33 33 */
34 34
35 35 /*
36 - * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
37 36 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
38 37 * Use is subject to license terms.
38 + *
39 + * Copyright 2018 Nexenta Systems, Inc. All rights reserved.
39 40 */
40 41
41 42 #ifndef _FS_SMBFS_NODE_H_
42 43 #define _FS_SMBFS_NODE_H_
43 44
44 45 /*
45 46 * Much code copied into here from Sun NFS.
46 47 * Compare with nfs_clnt.h
47 48 */
48 49
49 50 #include <sys/avl.h>
50 51 #include <sys/list.h>
51 52 #include <netsmb/smb_subr.h>
52 53
53 54 #ifdef __cplusplus
54 55 extern "C" {
55 56 #endif
56 57
57 58 /*
58 59 * Cache whole directories (not yet)
59 60 */
60 61 typedef struct rddir_cache {
61 62 lloff_t _cookie; /* cookie used to find this cache entry */
62 63 lloff_t _ncookie; /* cookie used to find the next cache entry */
63 64 char *entries; /* buffer containing dirent entries */
64 65 int eof; /* EOF reached after this request */
65 66 int entlen; /* size of dirent entries in buf */
66 67 int buflen; /* size of the buffer used to store entries */
67 68 int flags; /* control flags, see below */
68 69 kcondvar_t cv; /* cv for blocking */
69 70 int error; /* error from RPC operation */
70 71 kmutex_t lock;
71 72 uint_t count; /* reference count */
72 73 avl_node_t tree; /* AVL tree links */
73 74 } rddir_cache;
74 75
75 76 #define smbfs_cookie _cookie._p._l
76 77 #define smbfs_ncookie _ncookie._p._l
77 78 #define smbfs3_cookie _cookie._f
78 79 #define smbfs3_ncookie _ncookie._f
79 80
80 81 #define RDDIR 0x1 /* readdir operation in progress */
81 82 #define RDDIRWAIT 0x2 /* waiting on readdir in progress */
82 83 #define RDDIRREQ 0x4 /* a new readdir is required */
83 84 #define RDDIRCACHED 0x8 /* entry is in the cache */
84 85
85 86 #define HAVE_RDDIR_CACHE(rp) (avl_numnodes(&(rp)->r_dir) > 0)
86 87
87 88 /*
88 89 * A homegrown reader/writer lock implementation. It addresses
89 90 * two requirements not addressed by the system primitives. They
90 91 * are that the `enter" operation is optionally interruptible and
91 92 * that that they can be re`enter'ed by writers without deadlock.
92 93 */
93 94 typedef struct smbfs_rwlock {
94 95 int count;
95 96 int waiters;
96 97 kthread_t *owner;
97 98 kmutex_t lock;
98 99 kcondvar_t cv;
99 100 } smbfs_rwlock_t;
100 101
101 102 /*
102 103 * The format of the smbfs node header, which contains the
103 104 * fields used to link nodes in the AVL tree, and those
104 105 * fields needed by the AVL node comparison functions.
105 106 * It's a separate struct so we can call avl_find with
106 107 * this relatively small struct as a stack local.
107 108 *
108 109 * The AVL tree is mntinfo.smi_hash_avl,
109 110 * and its lock is mntinfo.smi_hash_lk.
110 111 */
111 112 typedef struct smbfs_node_hdr {
112 113 /*
113 114 * Our linkage in the node cache AVL tree.
114 115 */
115 116 avl_node_t hdr_avl_node;
116 117
117 118 /*
118 119 * Identity of this node: The full path name,
119 120 * in server form, relative to the share root.
120 121 */
121 122 char *hdr_n_rpath;
122 123 int hdr_n_rplen;
123 124 } smbfs_node_hdr_t;
124 125
125 126 /*
126 127 * Below is the SMBFS-specific representation of a "node".
127 128 * This struct is a mixture of Sun NFS and Darwin code.
128 129 * Fields starting with "r_" came from NFS struct "rnode"
129 130 * and fields starting with "n_" came from Darwin, or
130 131 * were added during the Solaris port. We have avoided
131 132 * renaming fields so we would not cause excessive
132 133 * changes in the code using this struct.
133 134 *
134 135 * Now using an AVL tree instead of hash lists, but kept the
135 136 * "hash" in some member names and functions to reduce churn.
136 137 * One AVL tree per mount replaces the global hash buckets.
137 138 *
138 139 * Notes carried over from the NFS code:
139 140 *
140 141 * The smbnode is the "inode" for remote files. It contains all the
141 142 * information necessary to handle remote file on the client side.
142 143 *
143 144 * Note on file sizes: we keep two file sizes in the smbnode: the size
144 145 * according to the client (r_size) and the size according to the server
145 146 * (r_attr.fa_size). They can differ because we modify r_size during a
146 147 * write system call (smbfs_rdwr), before the write request goes over the
147 148 * wire (before the file is actually modified on the server). If an OTW
148 149 * request occurs before the cached data is written to the server the file
149 150 * size returned from the server (r_attr.fa_size) may not match r_size.
150 151 * r_size is the one we use, in general. r_attr.fa_size is only used to
151 152 * determine whether or not our cached data is valid.
152 153 *
153 154 * Each smbnode has 3 locks associated with it (not including the smbnode
154 155 * "hash" AVL tree and free list locks):
155 156 *
156 157 * r_rwlock: Serializes smbfs_write and smbfs_setattr requests
157 158 * and allows smbfs_read requests to proceed in parallel.
158 159 * Serializes reads/updates to directories.
159 160 *
160 161 * r_lkserlock: Serializes lock requests with map, write, and
161 162 * readahead operations.
162 163 *
163 164 * r_statelock: Protects all fields in the smbnode except for
164 165 * those listed below. This lock is intented
165 166 * to be held for relatively short periods of
166 167 * time (not accross entire putpage operations,
167 168 * for example).
168 169 *
169 170 * The following members are protected by the mutex smbfreelist_lock:
170 171 * r_freef
171 172 * r_freeb
172 173 *
173 174 * The following members are protected by the AVL tree rwlock:
174 175 * r_avl_node (r__hdr.hdr_avl_node)
175 176 *
176 177 * Note: r_modaddr is only accessed when the r_statelock mutex is held.
177 178 * Its value is also controlled via r_rwlock. It is assumed that
178 179 * there will be only 1 writer active at a time, so it safe to
|
↓ open down ↓ |
130 lines elided |
↑ open up ↑ |
179 180 * set r_modaddr and release r_statelock as long as the r_rwlock
180 181 * writer lock is held.
181 182 *
182 183 * 64-bit offsets: the code formerly assumed that atomic reads of
183 184 * r_size were safe and reliable; on 32-bit architectures, this is
184 185 * not true since an intervening bus cycle from another processor
185 186 * could update half of the size field. The r_statelock must now
186 187 * be held whenever any kind of access of r_size is made.
187 188 *
188 189 * Lock ordering:
189 - * r_rwlock > r_lkserlock > r_statelock
190 + * r_rwlock > r_lkserlock > r_statelock
190 191 */
191 192
192 193 typedef struct smbnode {
193 194 /* Our linkage in the node cache AVL tree (see above). */
194 195 smbfs_node_hdr_t r__hdr;
195 196
196 197 /* short-hand names for r__hdr members */
197 198 #define r_avl_node r__hdr.hdr_avl_node
198 199 #define n_rpath r__hdr.hdr_n_rpath
199 200 #define n_rplen r__hdr.hdr_n_rplen
200 201
201 202 smbmntinfo_t *n_mount; /* VFS data */
202 203 vnode_t *r_vnode; /* associated vnode */
203 204
204 205 /*
205 206 * Linkage in smbfreelist, for reclaiming nodes.
206 207 * Lock for the free list is: smbfreelist_lock
207 208 */
208 209 struct smbnode *r_freef; /* free list forward pointer */
209 210 struct smbnode *r_freeb; /* free list back pointer */
210 211
211 212 smbfs_rwlock_t r_rwlock; /* serialize write/setattr requests */
212 213 smbfs_rwlock_t r_lkserlock; /* serialize lock with other ops */
213 214 kmutex_t r_statelock; /* protect (most) smbnode fields */
|
↓ open down ↓ |
14 lines elided |
↑ open up ↑ |
214 215
215 216 /*
216 217 * File handle, directory search handle,
217 218 * and reference counts for them, etc.
218 219 * Lock for these is: r_lkserlock
219 220 */
220 221 int n_dirrefs;
221 222 struct smbfs_fctx *n_dirseq; /* ff context */
222 223 int n_dirofs; /* last ff offset */
223 224 int n_fidrefs;
224 - uint16_t n_fid; /* file handle */
225 + smb_fh_t *n_fid; /* file handle */
225 226 enum vtype n_ovtype; /* vnode type opened */
226 - uint32_t n_rights; /* granted rights */
227 - int n_vcgenid; /* gereration no. (reconnect) */
228 227
229 228 /*
230 229 * Misc. bookkeeping
231 230 */
232 231 cred_t *r_cred; /* current credentials */
233 232 u_offset_t r_nextr; /* next read offset (read-ahead) */
234 233 long r_mapcnt; /* count of mmapped pages */
234 + uint_t r_inmap; /* to serialize read/write and mmap */
235 235 uint_t r_count; /* # of refs not reflect in v_count */
236 236 uint_t r_awcount; /* # of outstanding async write */
237 237 uint_t r_gcount; /* getattrs waiting to flush pages */
238 238 uint_t r_flags; /* flags, see below */
239 - uint32_t n_flag; /* NXXX flags below */
239 + uint32_t n_flag; /* N--- flags below */
240 240 uint_t r_error; /* async write error */
241 241 kcondvar_t r_cv; /* condvar for blocked threads */
242 242 avl_tree_t r_dir; /* cache of readdir responses */
243 243 rddir_cache *r_direof; /* pointer to the EOF entry */
244 + u_offset_t r_modaddr; /* address for page in writenp */
244 245 kthread_t *r_serial; /* id of purging thread */
245 246 list_t r_indelmap; /* list of delmap callers */
246 247
247 248 /*
248 249 * Attributes: local, and as last seen on the server.
249 250 * See notes above re: r_size vs r_attr.fa_size, etc.
250 251 */
251 252 smbfattr_t r_attr; /* attributes from the server */
252 253 hrtime_t r_attrtime; /* time attributes become invalid */
253 254 hrtime_t r_mtime; /* client time file last modified */
254 255 len_t r_size; /* client's view of file size */
255 256
256 257 /*
257 258 * Security attributes.
258 259 */
259 260 vsecattr_t r_secattr;
260 261 hrtime_t r_sectime;
261 262
262 263 /*
263 264 * Other attributes, not carried in smbfattr_t
264 265 */
265 266 u_longlong_t n_ino;
266 267 uid_t n_uid;
267 268 gid_t n_gid;
268 269 mode_t n_mode;
269 270 } smbnode_t;
270 271
271 272 /*
272 273 * Flag bits in: smbnode_t .n_flag
273 274 */
274 275 #define NFLUSHINPROG 0x00001
|
↓ open down ↓ |
21 lines elided |
↑ open up ↑ |
275 276 #define NFLUSHWANT 0x00002 /* they should gone ... */
276 277 #define NMODIFIED 0x00004 /* bogus, until async IO implemented */
277 278 #define NREFPARENT 0x00010 /* node holds parent from recycling */
278 279 #define NGOTIDS 0x00020
279 280 #define NRDIRSERIAL 0x00080 /* serialize readdir operation */
280 281 #define NISMAPPED 0x00800
281 282 #define NFLUSHWIRE 0x01000
282 283 #define NATTRCHANGED 0x02000 /* kill cached attributes at close */
283 284 #define NALLOC 0x04000 /* being created */
284 285 #define NWALLOC 0x08000 /* awaiting creation */
285 -#define N_XATTR 0x10000 /* extended attribute (dir or file) */
286 +#define N_XATTR 0x10000 /* extended attribute (dir or file) */
286 287
287 288 /*
288 289 * Flag bits in: smbnode_t .r_flags
289 290 */
290 291 #define RREADDIRPLUS 0x1 /* issue a READDIRPLUS instead of READDIR */
291 292 #define RDIRTY 0x2 /* dirty pages from write operation */
292 293 #define RSTALE 0x4 /* file handle is stale */
293 294 #define RMODINPROGRESS 0x8 /* page modification happening */
294 295 #define RTRUNCATE 0x10 /* truncating, don't commit */
295 296 #define RHAVEVERF 0x20 /* have a write verifier to compare against */
296 297 #define RCOMMIT 0x40 /* commit in progress */
297 298 #define RCOMMITWAIT 0x80 /* someone is waiting to do a commit */
298 299 #define RHASHED 0x100 /* smbnode is in the "hash" AVL tree */
299 300 #define ROUTOFSPACE 0x200 /* an out of space error has happened */
300 301 #define RDIRECTIO 0x400 /* bypass the buffer cache */
301 302 #define RLOOKUP 0x800 /* a lookup has been performed */
302 303 #define RWRITEATTR 0x1000 /* attributes came from WRITE */
303 304 #define RINDNLCPURGE 0x2000 /* in the process of purging DNLC references */
304 305 #define RDELMAPLIST 0x4000 /* delmap callers tracking for as callback */
305 306
306 307 /*
307 308 * Convert between vnode and smbnode
308 309 */
309 310 #define VTOSMB(vp) ((smbnode_t *)((vp)->v_data))
310 311 #define SMBTOV(np) ((np)->r_vnode)
311 312
312 313 /*
313 314 * A macro to compute the separator that should be used for
314 315 * names under some directory. See smbfs_fullpath().
315 316 */
316 317 #define SMBFS_DNP_SEP(dnp) \
317 318 (((dnp->n_flag & N_XATTR) == 0 && dnp->n_rplen > 1) ? '\\' : '\0')
318 319
319 320 #ifdef __cplusplus
320 321 }
321 322 #endif
322 323
323 324 #endif /* _FS_SMBFS_NODE_H_ */
|
↓ open down ↓ |
28 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX