2004-10-12 22:18:02 +00:00
/*
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 0213 9 , USA .
*/
2004-11-05 07:24:25 +00:00
# include "includes.h"
2004-10-12 22:18:02 +00:00
# include "vfs_posix.h"
/*
flush a single open file
*/
static void pvfs_flush_file ( struct pvfs_state * pvfs , struct pvfs_file * f )
{
2004-11-08 03:54:12 +00:00
if ( f - > handle - > name - > dos . attrib & FILE_ATTRIBUTE_DIRECTORY ) {
2004-10-29 04:43:28 +00:00
return ;
}
2004-10-12 22:18:02 +00:00
if ( pvfs - > flags & PVFS_FLAG_STRICT_SYNC ) {
2004-11-08 03:54:12 +00:00
fsync ( f - > handle - > fd ) ;
2004-10-12 22:18:02 +00:00
}
}
/*
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 ;
}