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 */
pvfs_flush_file(struct pvfs_state * pvfs,struct pvfs_file * f)28 static void pvfs_flush_file(struct pvfs_state *pvfs, struct pvfs_file *f)
29 {
30 	if (f->handle->fd == -1) {
31 		return;
32 	}
33 	if (pvfs->flags & PVFS_FLAG_STRICT_SYNC) {
34 		fsync(f->handle->fd);
35 	}
36 }
37 
38 /*
39   flush a fnum
40 */
pvfs_flush(struct ntvfs_module_context * ntvfs,struct ntvfs_request * req,union smb_flush * io)41 NTSTATUS pvfs_flush(struct ntvfs_module_context *ntvfs,
42 		    struct ntvfs_request *req,
43 		    union smb_flush *io)
44 {
45 	struct pvfs_state *pvfs = talloc_get_type(ntvfs->private_data,
46 				  struct pvfs_state);
47 	struct pvfs_file *f;
48 
49 	switch (io->generic.level) {
50 	case RAW_FLUSH_FLUSH:
51 	case RAW_FLUSH_SMB2:
52 		/* TODO: take care of io->smb2.in.unknown */
53 		f = pvfs_find_fd(pvfs, req, io->generic.in.file.ntvfs);
54 		if (!f) {
55 			return NT_STATUS_INVALID_HANDLE;
56 		}
57 		pvfs_flush_file(pvfs, f);
58 		io->smb2.out.reserved = 0;
59 		return NT_STATUS_OK;
60 
61 	case RAW_FLUSH_ALL:
62 		if (!(pvfs->flags & PVFS_FLAG_STRICT_SYNC)) {
63 			return NT_STATUS_OK;
64 		}
65 
66 		/*
67 		 * they are asking to flush all open files
68 		 * for the given SMBPID
69 		 */
70 		for (f=pvfs->files.list;f;f=f->next) {
71 			if (f->ntvfs->smbpid != req->smbpid) continue;
72 
73 			pvfs_flush_file(pvfs, f);
74 		}
75 
76 		return NT_STATUS_OK;
77 	}
78 
79 	return NT_STATUS_INVALID_LEVEL;
80 }
81