diff options
-rw-r--r-- | source4/ntvfs/posix/config.mk | 1 | ||||
-rw-r--r-- | source4/ntvfs/posix/pvfs_flush.c | 64 | ||||
-rw-r--r-- | source4/ntvfs/posix/vfs_posix.c | 11 | ||||
-rw-r--r-- | source4/ntvfs/posix/vfs_posix.h | 1 | ||||
-rw-r--r-- | source4/param/loadparm.c | 4 |
5 files changed, 71 insertions, 10 deletions
diff --git a/source4/ntvfs/posix/config.mk b/source4/ntvfs/posix/config.mk index ad4c754ca7..019288faaa 100644 --- a/source4/ntvfs/posix/config.mk +++ b/source4/ntvfs/posix/config.mk @@ -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/source4/ntvfs/posix/pvfs_flush.c b/source4/ntvfs/posix/pvfs_flush.c new file mode 100644 index 0000000000..49eaa74cfb --- /dev/null +++ b/source4/ntvfs/posix/pvfs_flush.c @@ -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; +} diff --git a/source4/ntvfs/posix/vfs_posix.c b/source4/ntvfs/posix/vfs_posix.c index 7d532c3596..a17b90e369 100644 --- a/source4/ntvfs/posix/vfs_posix.c +++ b/source4/ntvfs/posix/vfs_posix.c @@ -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)); } @@ -161,16 +162,6 @@ static NTSTATUS pvfs_seek(struct ntvfs_module_context *ntvfs, } /* - 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 */ static NTSTATUS pvfs_lock(struct ntvfs_module_context *ntvfs, diff --git a/source4/ntvfs/posix/vfs_posix.h b/source4/ntvfs/posix/vfs_posix.h index 38e55fd887..6819d01529 100644 --- a/source4/ntvfs/posix/vfs_posix.h +++ b/source4/ntvfs/posix/vfs_posix.h @@ -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_ */ diff --git a/source4/param/loadparm.c b/source4/param/loadparm.c index ee424cb0c4..283a7f80ce 100644 --- a/source4/param/loadparm.c +++ b/source4/param/loadparm.c @@ -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) |