X-Git-Url: http://git.samba.org/samba.git/?p=kai%2Fsamba.git;a=blobdiff_plain;f=source3%2Fmodules%2Fvfs_commit.c;h=865250a5d8a86a2d274107ff765e4cd608b8a272;hp=a8105e021edb007bbda83be46ac481b2e98c558d;hb=6c0bef17569d650c32ab82396f43d435ab9ef831;hpb=122dbbf00acc1768f98e5b57e94aab2b61671f40 diff --git a/source3/modules/vfs_commit.c b/source3/modules/vfs_commit.c index a8105e021ed..865250a5d8a 100644 --- a/source3/modules/vfs_commit.c +++ b/source3/modules/vfs_commit.c @@ -17,6 +17,8 @@ */ #include "includes.h" +#include "system/filesys.h" +#include "smbd/smbd.h" /* Commit data module. * @@ -66,11 +68,11 @@ enum eof_mode struct commit_info { /* For chunk-based commits */ - SMB_OFF_T dbytes; /* Dirty (uncommitted) bytes */ - SMB_OFF_T dthresh; /* Dirty data threshold */ + off_t dbytes; /* Dirty (uncommitted) bytes */ + off_t dthresh; /* Dirty data threshold */ /* For commits on EOF */ enum eof_mode on_eof; - SMB_OFF_T eof; /* Expected file size */ + off_t eof; /* Expected file size */ }; static int commit_do( @@ -88,6 +90,8 @@ static int commit_do( #elif HAVE_FSYNC result = fsync(fd); #else + DEBUG(0, ("%s: WARNING: no commit support on this platform\n", + MODULE)); result = 0 #endif if (result == 0) { @@ -102,7 +106,7 @@ static int commit_all( { struct commit_info *c; - if ((c = VFS_FETCH_FSP_EXTENSION(handle, fsp))) { + if ((c = (struct commit_info *)VFS_FETCH_FSP_EXTENSION(handle, fsp))) { if (c->dbytes) { DEBUG(module_debug, ("%s: flushing %lu dirty bytes\n", @@ -117,12 +121,13 @@ static int commit_all( static int commit( struct vfs_handle_struct * handle, files_struct * fsp, - SMB_OFF_T offset, + off_t offset, ssize_t last_write) { struct commit_info *c; - if ((c = VFS_FETCH_FSP_EXTENSION(handle, fsp)) == NULL) { + if ((c = (struct commit_info *)VFS_FETCH_FSP_EXTENSION(handle, fsp)) + == NULL) { return 0; } @@ -161,25 +166,31 @@ static int commit_connect( const char * service, const char * user) { + int ret = SMB_VFS_NEXT_CONNECT(handle, service, user); + + if (ret < 0) { + return ret; + } + module_debug = lp_parm_int(SNUM(handle->conn), MODULE, "debug", 100); - return SMB_VFS_NEXT_CONNECT(handle, service, user); + return 0; } static int commit_open( vfs_handle_struct * handle, - const char * fname, + struct smb_filename *smb_fname, files_struct * fsp, int flags, mode_t mode) { - SMB_OFF_T dthresh; + off_t dthresh; const char *eof_mode; struct commit_info *c = NULL; int fd; /* Don't bother with read-only files. */ if ((flags & O_ACCMODE) == O_RDONLY) { - return SMB_VFS_NEXT_OPEN(handle, fname, fsp, flags, mode); + return SMB_VFS_NEXT_OPEN(handle, smb_fname, fsp, flags, mode); } /* Read and check module configuration */ @@ -190,7 +201,8 @@ static int commit_open( MODULE, "eof mode", "none"); if (dthresh > 0 || !strequal(eof_mode, "none")) { - c = VFS_ADD_FSP_EXTENSION(handle, fsp, struct commit_info, NULL); + c = (struct commit_info *)VFS_ADD_FSP_EXTENSION( + handle, fsp, struct commit_info, NULL); /* Process main tunables */ if (c) { c->dthresh = dthresh; @@ -208,7 +220,7 @@ static int commit_open( } } - fd = SMB_VFS_NEXT_OPEN(handle, fname, fsp, flags, mode); + fd = SMB_VFS_NEXT_OPEN(handle, smb_fname, fsp, flags, mode); if (fd == -1) { VFS_REMOVE_FSP_EXTENSION(handle, fsp); return fd; @@ -220,16 +232,16 @@ static int commit_open( if (SMB_VFS_FSTAT(fsp, &st) == -1) { return -1; } - c->eof = st.st_size; + c->eof = st.st_ex_size; } - return 0; + return fd; } static ssize_t commit_write( vfs_handle_struct * handle, files_struct * fsp, - void * data, + const void * data, size_t count) { ssize_t ret; @@ -247,9 +259,9 @@ static ssize_t commit_write( static ssize_t commit_pwrite( vfs_handle_struct * handle, files_struct * fsp, - void * data, + const void * data, size_t count, - SMB_OFF_T offset) + off_t offset) { ssize_t ret; @@ -275,14 +287,15 @@ static int commit_close( static int commit_ftruncate( vfs_handle_struct * handle, files_struct * fsp, - SMB_OFF_T len) + off_t len) { int result; result = SMB_VFS_NEXT_FTRUNCATE(handle, fsp, len); if (result == 0) { struct commit_info *c; - if ((c = VFS_FETCH_FSP_EXTENSION(handle, fsp))) { + if ((c = (struct commit_info *)VFS_FETCH_FSP_EXTENSION( + handle, fsp))) { commit(handle, fsp, len, 0); c->eof = len; } @@ -291,28 +304,20 @@ static int commit_ftruncate( return result; } -static vfs_op_tuple commit_ops [] = -{ - {SMB_VFS_OP(commit_open), - SMB_VFS_OP_OPEN, SMB_VFS_LAYER_TRANSPARENT}, - {SMB_VFS_OP(commit_close), - SMB_VFS_OP_CLOSE, SMB_VFS_LAYER_TRANSPARENT}, - {SMB_VFS_OP(commit_write), - SMB_VFS_OP_WRITE, SMB_VFS_LAYER_TRANSPARENT}, - {SMB_VFS_OP(commit_pwrite), - SMB_VFS_OP_PWRITE, SMB_VFS_LAYER_TRANSPARENT}, - {SMB_VFS_OP(commit_connect), - SMB_VFS_OP_CONNECT, SMB_VFS_LAYER_TRANSPARENT}, - {SMB_VFS_OP(commit_ftruncate), - SMB_VFS_OP_FTRUNCATE, SMB_VFS_LAYER_TRANSPARENT}, - - {SMB_VFS_OP(NULL), SMB_VFS_OP_NOOP, SMB_VFS_LAYER_NOOP} +static struct vfs_fn_pointers vfs_commit_fns = { + .open_fn = commit_open, + .close_fn = commit_close, + .write = commit_write, + .pwrite = commit_pwrite, + .connect_fn = commit_connect, + .ftruncate = commit_ftruncate }; NTSTATUS vfs_commit_init(void); NTSTATUS vfs_commit_init(void) { - return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, MODULE, commit_ops); + return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, MODULE, + &vfs_commit_fns); }