Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 :
4 : POSIX NTVFS backend - flush
5 :
6 : Copyright (C) Andrew Tridgell 2004
7 :
8 : This program is free software; you can redistribute it and/or modify
9 : it under the terms of the GNU General Public License as published by
10 : the Free Software Foundation; either version 3 of the License, or
11 : (at your option) any later version.
12 :
13 : This program is distributed in the hope that it will be useful,
14 : but WITHOUT ANY WARRANTY; without even the implied warranty of
15 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 : GNU General Public License for more details.
17 :
18 : You should have received a copy of the GNU General Public License
19 : along with this program. If not, see <http://www.gnu.org/licenses/>.
20 : */
21 :
22 : #include "includes.h"
23 : #include "vfs_posix.h"
24 :
25 : /*
26 : flush a single open file
27 : */
28 4 : static void pvfs_flush_file(struct pvfs_state *pvfs, struct pvfs_file *f)
29 : {
30 4 : if (f->handle->fd == -1) {
31 1 : return;
32 : }
33 3 : if (pvfs->flags & PVFS_FLAG_STRICT_SYNC) {
34 3 : fsync(f->handle->fd);
35 : }
36 : }
37 :
38 : /*
39 : flush a fnum
40 : */
41 5 : NTSTATUS pvfs_flush(struct ntvfs_module_context *ntvfs,
42 : struct ntvfs_request *req,
43 : union smb_flush *io)
44 : {
45 5 : struct pvfs_state *pvfs = talloc_get_type(ntvfs->private_data,
46 : struct pvfs_state);
47 : struct pvfs_file *f;
48 :
49 5 : switch (io->generic.level) {
50 4 : case RAW_FLUSH_FLUSH:
51 : case RAW_FLUSH_SMB2:
52 : /* TODO: take care of io->smb2.in.unknown */
53 4 : f = pvfs_find_fd(pvfs, req, io->generic.in.file.ntvfs);
54 4 : if (!f) {
55 0 : return NT_STATUS_INVALID_HANDLE;
56 : }
57 4 : pvfs_flush_file(pvfs, f);
58 4 : io->smb2.out.reserved = 0;
59 4 : return NT_STATUS_OK;
60 :
61 1 : case RAW_FLUSH_ALL:
62 1 : if (!(pvfs->flags & PVFS_FLAG_STRICT_SYNC)) {
63 0 : return NT_STATUS_OK;
64 : }
65 :
66 : /*
67 : * they are asking to flush all open files
68 : * for the given SMBPID
69 : */
70 1 : for (f=pvfs->files.list;f;f=f->next) {
71 0 : if (f->ntvfs->smbpid != req->smbpid) continue;
72 :
73 0 : pvfs_flush_file(pvfs, f);
74 : }
75 :
76 1 : return NT_STATUS_OK;
77 : }
78 :
79 0 : return NT_STATUS_INVALID_LEVEL;
80 : }
|