Merge branch 'master' of ssh://git.samba.org/data/git/samba
[jra/samba/.git] / source4 / ntvfs / posix / pvfs_flush.c
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 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 */
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 = ntvfs->private_data;
46         struct pvfs_file *f;
47
48         switch (io->generic.level) {
49         case RAW_FLUSH_FLUSH:
50         case RAW_FLUSH_SMB2:
51                 /* TODO: take care of io->smb2.in.unknown */
52                 f = pvfs_find_fd(pvfs, req, io->generic.in.file.ntvfs);
53                 if (!f) {
54                         return NT_STATUS_INVALID_HANDLE;
55                 }
56                 pvfs_flush_file(pvfs, f);
57                 io->smb2.out.reserved = 0;
58                 return NT_STATUS_OK;
59
60         case RAW_FLUSH_ALL:
61                 if (!(pvfs->flags & PVFS_FLAG_STRICT_SYNC)) {
62                         return NT_STATUS_OK;
63                 }
64
65                 /* 
66                  * they are asking to flush all open files
67                  * for the given SMBPID
68                  */
69                 for (f=pvfs->files.list;f;f=f->next) {
70                         if (f->ntvfs->smbpid != req->smbpid) continue;
71
72                         pvfs_flush_file(pvfs, f);
73                 }
74
75                 return NT_STATUS_OK;
76         }
77
78         return NT_STATUS_INVALID_LEVEL;
79 }