root/source4/ntvfs/posix/pvfs_flush.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. pvfs_flush_file
  2. pvfs_flush

   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)
     /* [<][>][^][v][top][bottom][index][help] */
  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,
     /* [<][>][^][v][top][bottom][index][help] */
  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 }

/* [<][>][^][v][top][bottom][index][help] */