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*/ 28static 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*/ 41NTSTATUS 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