r2941: added pvfs_flush() implementation to the posix backend
authorAndrew Tridgell <tridge@samba.org>
Tue, 12 Oct 2004 22:18:02 +0000 (22:18 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:59:50 +0000 (12:59 -0500)
source/ntvfs/posix/config.mk
source/ntvfs/posix/pvfs_flush.c [new file with mode: 0644]
source/ntvfs/posix/vfs_posix.c
source/ntvfs/posix/vfs_posix.h
source/param/loadparm.c

index ad4c754ca723906f1635e34494ecd01f7c9793e8..019288faaae6f5c4d13949333b9ce003a858fab8 100644 (file)
@@ -12,6 +12,7 @@ ADD_OBJ_FILES = \
                ntvfs/posix/pvfs_mkdir.o \
                ntvfs/posix/pvfs_open.o \
                ntvfs/posix/pvfs_read.o \
+               ntvfs/posix/pvfs_flush.o \
                ntvfs/posix/pvfs_write.o \
                ntvfs/posix/pvfs_fsinfo.o \
                ntvfs/posix/pvfs_qfileinfo.o \
diff --git a/source/ntvfs/posix/pvfs_flush.c b/source/ntvfs/posix/pvfs_flush.c
new file mode 100644 (file)
index 0000000..49eaa74
--- /dev/null
@@ -0,0 +1,64 @@
+/* 
+   Unix SMB/CIFS implementation.
+
+   POSIX NTVFS backend - flush
+
+   Copyright (C) Andrew Tridgell 2004
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "include/includes.h"
+#include "vfs_posix.h"
+
+/*
+  flush a single open file
+*/
+static void pvfs_flush_file(struct pvfs_state *pvfs, struct pvfs_file *f)
+{
+       if (pvfs->flags & PVFS_FLAG_STRICT_SYNC) {
+               fsync(f->fd);
+       }
+}
+
+/*
+  flush a fnum
+*/
+NTSTATUS pvfs_flush(struct ntvfs_module_context *ntvfs,
+                   struct smbsrv_request *req, struct smb_flush *io)
+{
+       struct pvfs_state *pvfs = ntvfs->private_data;
+       struct pvfs_file *f;
+
+       if (io->in.fnum != 0xFFFF) {
+               f = pvfs_find_fd(pvfs, req, io->in.fnum);
+               if (!f) {
+                       return NT_STATUS_INVALID_HANDLE;
+               }
+               pvfs_flush_file(pvfs, f);
+               return NT_STATUS_OK;
+       }
+
+       if (!(pvfs->flags & PVFS_FLAG_STRICT_SYNC)) {
+               return NT_STATUS_OK;
+       }
+
+       /* they are asking to flush all open files */
+       for (f=pvfs->open_files;f;f=f->next) {
+               pvfs_flush_file(pvfs, f);
+       }
+
+       return NT_STATUS_OK;
+}
index 7d532c35966ffd89dace114f98ebe2daec9717cd..a17b90e3697ba156c6042f7e5bdf26822339b25d 100644 (file)
@@ -39,6 +39,7 @@ static void pvfs_setup_options(struct pvfs_state *pvfs)
        if (lp_map_archive(snum)) pvfs->flags |= PVFS_FLAG_MAP_ARCHIVE;
        if (lp_map_system(snum)) pvfs->flags |= PVFS_FLAG_MAP_SYSTEM;
        if (lp_readonly(snum)) pvfs->flags |= PVFS_FLAG_READONLY;
+       if (lp_strict_sync(snum)) pvfs->flags |= PVFS_FLAG_STRICT_SYNC;
 
        pvfs->share_name = talloc_strdup(pvfs, lp_servicename(snum));
 }
@@ -160,16 +161,6 @@ static NTSTATUS pvfs_seek(struct ntvfs_module_context *ntvfs,
        return NT_STATUS_NOT_SUPPORTED;
 }
 
-/*
-  flush a file
-*/
-static NTSTATUS pvfs_flush(struct ntvfs_module_context *ntvfs,
-                          struct smbsrv_request *req, struct smb_flush *io)
-{
-       DEBUG(0,("pvfs_flush not implemented\n"));
-       return NT_STATUS_NOT_IMPLEMENTED;
-}
-
 /*
   lock a byte range
 */
index 38e55fd887020941a0411f79e5b9e5e106442da2..6819d01529d23b60dfcfa29c02c188c27ff4bb08 100644 (file)
@@ -152,5 +152,6 @@ struct pvfs_mangle_context {
 #define PVFS_FLAG_MAP_SYSTEM    (1<<2)
 #define PVFS_FLAG_MAP_HIDDEN    (1<<3)
 #define PVFS_FLAG_READONLY      (1<<4)
+#define PVFS_FLAG_STRICT_SYNC   (1<<5)
 
 #endif /* _VFS_POSIX_H_ */
index ee424cb0c4964ce80113662c87fb282b76802982..283a7f80ce935a13e559515a613b6d932389e6f1 100644 (file)
@@ -270,6 +270,7 @@ typedef struct
        BOOL *copymap;
        BOOL bMSDfsRoot;
        BOOL bShareModes;
+       BOOL bStrictSync;
        struct param_opt *param_opt;
 
        char dummy[3];          /* for alignment */
@@ -327,6 +328,7 @@ static service sDefault = {
        NULL,                   /* copymap */
        False,                  /* bMSDfsRoot */
        True,                   /* bShareModes */
+       False,                  /* bStrictSync */
        NULL,                   /* Parametric options */
 
        ""                      /* dummy */
@@ -618,6 +620,7 @@ static struct parm_struct parm_table[] = {
        {"hostname lookups", P_BOOL, P_GLOBAL, &Globals.bHostnameLookups, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
 
        {"name cache timeout", P_INTEGER, P_GLOBAL, &Globals.name_cache_timeout, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+       {"strict sync", P_BOOL, P_LOCAL, &sDefault.bStrictSync, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE}, 
 
        {"Printing Options", P_SEP, P_SEPARATOR},
        
@@ -1244,6 +1247,7 @@ FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
 FN_LOCAL_BOOL(lp_locking, bLocking)
 FN_LOCAL_BOOL(lp_strict_locking, bStrictLocking)
 FN_LOCAL_BOOL(lp_posix_locking, bPosixLocking)
+FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
 FN_LOCAL_BOOL(lp_share_modes, bShareModes)
 FN_LOCAL_BOOL(lp_oplocks, bOpLocks)
 FN_LOCAL_BOOL(lp_level2_oplocks, bLevel2OpLocks)