LCOV - code coverage report
Current view: top level - source4/ntvfs/posix - pvfs_flush.c (source / functions) Hit Total Coverage
Test: coverage report for master 2f515e9b Lines: 18 24 75.0 %
Date: 2024-04-21 15:09:00 Functions: 2 2 100.0 %

          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           0 :         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             : }

Generated by: LCOV version 1.14