Print this page
NEX-1643 dtrace provider for smbsrv
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
NEX-8495 Panic after SMB flush on a named pipe
Reviewed by: Gordon Ross <gwr@nexenta.com>
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
| Split |
Close |
| Expand all |
| Collapse all |
--- old/usr/src/uts/common/fs/smbsrv/smb_flush.c
+++ new/usr/src/uts/common/fs/smbsrv/smb_flush.c
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 5 * Common Development and Distribution License (the "License").
6 6 * You may not use this file except in compliance with the License.
7 7 *
8 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 9 * or http://www.opensolaris.org/os/licensing.
10 10 * See the License for the specific language governing permissions
11 11 * and limitations under the License.
12 12 *
13 13 * When distributing Covered Code, include this CDDL HEADER in each
14 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 15 * If applicable, add the following below this CDDL HEADER, with the
|
↓ open down ↓ |
15 lines elided |
↑ open up ↑ |
16 16 * fields enclosed by brackets "[]" replaced with your own identifying
17 17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 18 *
19 19 * CDDL HEADER END
20 20 */
21 21 /*
22 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 23 * Use is subject to license terms.
24 24 *
25 25 * Copyright 2016 Syneto S.R.L. All rights reserved.
26 + * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
26 27 */
27 28
28 29 /*
29 30 * The flush SMB is sent to ensure all data and allocation information
30 31 * for the corresponding file has been written to stable storage. This
31 32 * is a synchronous request. The response should not be sent until the
32 33 * writes are complete.
33 34 *
34 35 * The SmbFlush request is described in CIFS/1.0 1996 Section 3.9.14.
35 36 *
36 37 * CIFS/1.0 June 13, 1996
37 38 * Heizer, et al
38 39 * draft-heizer-cifs-v1-spec-00.txt
39 40 */
40 41
41 42 #include <smbsrv/smb_kproto.h>
42 43 #include <smbsrv/smb_fsops.h>
43 44
44 45
45 46 /*
46 47 * smb_com_flush
47 48 *
48 49 * Flush any cached data for a specified file, or for all files that
49 50 * this client has open, to stable storage. If the fid is valid (i.e.
50 51 * not 0xFFFF), we flush only that file. Otherwise we flush all files
51 52 * associated with this client.
52 53 *
|
↓ open down ↓ |
17 lines elided |
↑ open up ↑ |
53 54 * We need to protect the list because there's a good chance we'll
54 55 * block during the flush operation.
55 56 */
56 57 smb_sdrc_t
57 58 smb_pre_flush(smb_request_t *sr)
58 59 {
59 60 int rc;
60 61
61 62 rc = smbsr_decode_vwv(sr, "w", &sr->smb_fid);
62 63
63 - DTRACE_SMB_1(op__Flush__start, smb_request_t *, sr);
64 + DTRACE_SMB_START(op__Flush, smb_request_t *, sr);
64 65
65 66 return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
66 67 }
67 68
68 69 void
69 70 smb_post_flush(smb_request_t *sr)
70 71 {
71 - DTRACE_SMB_1(op__Flush__done, smb_request_t *, sr);
72 + DTRACE_SMB_DONE(op__Flush, smb_request_t *, sr);
72 73 }
73 74
74 75 smb_sdrc_t
75 76 smb_com_flush(smb_request_t *sr)
76 77 {
77 78 smb_ofile_t *file;
78 79 smb_llist_t *flist;
79 80 int rc;
80 81
81 82 if (smb_flush_required == 0) {
82 83 rc = smbsr_encode_empty_result(sr);
83 84 return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
84 85 }
85 86
86 87 if (sr->smb_fid != 0xffff) {
87 88 smbsr_lookup_file(sr);
88 89 if (sr->fid_ofile == NULL) {
89 90 smbsr_error(sr, NT_STATUS_INVALID_HANDLE,
90 91 ERRDOS, ERRbadfid);
91 92 return (SDRC_ERROR);
92 93 }
93 94 smb_ofile_flush(sr, sr->fid_ofile);
94 95 } else {
95 96 flist = &sr->tid_tree->t_ofile_list;
96 97 smb_llist_enter(flist, RW_READER);
97 98 file = smb_llist_head(flist);
98 99 while (file) {
99 100 mutex_enter(&file->f_mutex);
100 101 smb_ofile_flush(sr, file);
101 102 mutex_exit(&file->f_mutex);
102 103 file = smb_llist_next(flist, file);
103 104 }
104 105 smb_llist_exit(flist);
105 106 }
106 107
107 108 rc = smbsr_encode_empty_result(sr);
108 109 return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
109 110 }
|
↓ open down ↓ |
28 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX