summaryrefslogtreecommitdiff
path: root/source3/smbd/fileio.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2002-01-20 00:04:15 +0000
committerJeremy Allison <jra@samba.org>2002-01-20 00:04:15 +0000
commit427896866af5a0047482ce7a0e8e3b69e9063fb2 (patch)
treee191b72ddbdf17b5a5eafe0f153c8a735c1cb813 /source3/smbd/fileio.c
parent74462c0c17caecf19bc01d5159776ae6a0f39a11 (diff)
downloadsamba-427896866af5a0047482ce7a0e8e3b69e9063fb2.tar.gz
samba-427896866af5a0047482ce7a0e8e3b69e9063fb2.tar.bz2
samba-427896866af5a0047482ce7a0e8e3b69e9063fb2.zip
Attempt to fix bugs in write cache code (yes I know it's going away :-).
Jeremy. (This used to be commit ccda82b457b11ec683f404c9059b02c1214a0fd1)
Diffstat (limited to 'source3/smbd/fileio.c')
-rw-r--r--source3/smbd/fileio.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/source3/smbd/fileio.c b/source3/smbd/fileio.c
index 38da96b741..84b8e35bf0 100644
--- a/source3/smbd/fileio.c
+++ b/source3/smbd/fileio.c
@@ -419,7 +419,7 @@ len = %u\n",fsp->fd, (double)pos, (unsigned int)n, (double)wcp->offset, (unsigne
if ( n <= wcp->alloc_size && n > wcp->data_size) {
cache_flush_needed = True;
} else {
- DO_PROFILE_INC(writecache_direct_writes);
+ DO_PROFILE_INC(writecache_direct_writes);
return real_write_file(fsp, data, pos, n);
}
@@ -552,7 +552,13 @@ static BOOL setup_write_cache(files_struct *fsp, SMB_OFF_T file_size)
void set_filelen_write_cache(files_struct *fsp, SMB_OFF_T file_size)
{
if(fsp->wcp) {
- flush_write_cache(fsp, SIZECHANGE_FLUSH);
+ /* The cache *must* have been flushed before we do this. */
+ if (fsp->wcp->data_size != 0) {
+ pstring msg;
+ slprintf(msg, sizeof(msg)-1, "set_filelen_write_cache: size change \
+on file %s with write cache size = %u\n", fsp->fsp_name, fsp->wcp->data_size );
+ smb_panic(msg);
+ }
fsp->wcp->file_size = file_size;
}
}
@@ -565,6 +571,7 @@ ssize_t flush_write_cache(files_struct *fsp, enum flush_reason_enum reason)
{
write_cache *wcp = fsp->wcp;
size_t data_size;
+ ssize_t ret;
if(!wcp || !wcp->data_size)
return 0;
@@ -582,7 +589,16 @@ ssize_t flush_write_cache(files_struct *fsp, enum flush_reason_enum reason)
DO_PROFILE_INC(writecache_num_perfect_writes);
#endif
- return real_write_file(fsp, wcp->data, wcp->offset, data_size);
+ ret = real_write_file(fsp, wcp->data, wcp->offset, data_size);
+
+ /*
+ * Ensure file size if kept up to date if write extends file.
+ */
+
+ if ((ret != -1) && (wcp->offset + ret >= wcp->file_size))
+ wcp->file_size = wcp->offset + ret;
+
+ return ret;
}
/*******************************************************************