diff options
-rw-r--r-- | source3/include/proto.h | 1 | ||||
-rw-r--r-- | source3/smbd/close.c | 24 | ||||
-rw-r--r-- | source3/smbd/fileio.c | 8 |
3 files changed, 27 insertions, 6 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index c79db02a4a..f06a0a790f 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -3368,7 +3368,6 @@ BOOL check_plaintext_password(char *user, char *old_passwd, /*The following definitions come from smbd/close.c */ #if OLD_NTDOMAIN -void close_filestruct(files_struct *fsp); int close_file(files_struct *fsp, BOOL normal_close); #endif diff --git a/source3/smbd/close.c b/source3/smbd/close.c index 0b7b5f794e..f71b6b04f1 100644 --- a/source3/smbd/close.c +++ b/source3/smbd/close.c @@ -68,11 +68,15 @@ static void check_magic(files_struct *fsp,connection_struct *conn) Common code to close a file or a directory. ****************************************************************************/ -void close_filestruct(files_struct *fsp) +static int close_filestruct(files_struct *fsp) { connection_struct *conn = fsp->conn; + int ret = 0; - flush_write_cache(fsp, CLOSE_FLUSH); + if(flush_write_cache(fsp, CLOSE_FLUSH) == -1) + ret = -1; + + delete_write_cache(fsp); fsp->is_directory = False; fsp->stat_open = False; @@ -82,6 +86,8 @@ void close_filestruct(files_struct *fsp) free((char *)fsp->wbmpx_ptr); fsp->wbmpx_ptr = NULL; } + + return ret; } /**************************************************************************** @@ -98,10 +104,17 @@ static int close_normal_file(files_struct *fsp, BOOL normal_close) BOOL delete_on_close = fsp->delete_on_close; connection_struct *conn = fsp->conn; int err = 0; + int err1 = 0; remove_pending_lock_requests_by_fid(fsp); - close_filestruct(fsp); + /* + * If we're flushing on a close we can get a write + * error here, we must remember this. + */ + + if (close_filestruct(fsp) == -1) + err1 = -1; if (normal_close && fsp->print_file) { print_fsp_end(fsp); @@ -156,7 +169,10 @@ with error %s\n", fsp->fsp_name, strerror(errno) )); file_free(fsp); - return err; + if (err == -1 || err1 == -1) + return -1; + else + return 0; } /**************************************************************************** diff --git a/source3/smbd/fileio.c b/source3/smbd/fileio.c index 7fbf6e2a37..3ebc46e86b 100644 --- a/source3/smbd/fileio.c +++ b/source3/smbd/fileio.c @@ -186,7 +186,7 @@ ssize_t write_file(files_struct *fsp, char *data, SMB_OFF_T pos, size_t n) * the write cache. */ - if ((fsp->oplock_type == EXCLUSIVE_OPLOCK) && !wcp) { + if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && !wcp) { setup_write_cache(fsp, st.st_size); wcp = fsp->wcp; } @@ -569,6 +569,9 @@ void delete_write_cache(files_struct *fsp) free(wcp); fsp->wcp = NULL; + + DEBUG(10,("delete_write_cache: File %s deleted write cache\n", fsp->fsp_name )); + } /**************************************************************************** @@ -604,6 +607,9 @@ static BOOL setup_write_cache(files_struct *fsp, SMB_OFF_T file_size) fsp->wcp = wcp; allocated_write_caches++; + DEBUG(10,("setup_write_cache: File %s allocated write cache size %u\n", + fsp->fsp_name, wcp->alloc_size )); + return True; } |