From 2590721a36b2d6efd3b822312e9545548cfc96ca Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sun, 20 Jan 2002 00:43:28 +0000 Subject: Fix file size calculations for write cache code. Jeremy. (This used to be commit 71d647b6c0db8470d6144683c41ab26a7e1ef35e) --- source3/smbd/fileio.c | 46 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) (limited to 'source3/smbd/fileio.c') diff --git a/source3/smbd/fileio.c b/source3/smbd/fileio.c index 84b8e35bf0..6e1f5cfcf6 100644 --- a/source3/smbd/fileio.c +++ b/source3/smbd/fileio.c @@ -270,6 +270,13 @@ nonop=%u allocated=%u active=%u direct=%u perfect=%u readhits=%u\n", if(pos + data_used > wcp->offset + wcp->data_size) wcp->data_size = pos + data_used - wcp->offset; + /* + * Update the file size if changed. + */ + + if (wcp->offset + wcp->data_size > wcp->file_size) + wcp->file_size = wcp->offset + wcp->data_size; + /* * If we used all the data then * return here. @@ -312,6 +319,13 @@ nonop=%u allocated=%u active=%u direct=%u perfect=%u readhits=%u\n", if(pos + n > wcp->offset + wcp->data_size) wcp->data_size = pos + n - wcp->offset; + /* + * Update the file size if changed. + */ + + if (wcp->offset + wcp->data_size > wcp->file_size) + wcp->file_size = wcp->offset + wcp->data_size; + /* * We don't need to move the start of data, but we * cut down the amount left by the amount used. @@ -363,10 +377,11 @@ nonop=%u allocated=%u active=%u direct=%u perfect=%u readhits=%u\n", wcp->data_size = pos + data_used - wcp->offset; /* - * Update the known file length. + * Update the file size if changed. */ - wcp->file_size = wcp->offset + wcp->data_size; + if (wcp->offset + wcp->data_size > wcp->file_size) + wcp->file_size = wcp->offset + wcp->data_size; /* * If we used all the data then @@ -419,8 +434,16 @@ 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 { + ssize_t ret = real_write_file(fsp, data, pos, n); + DO_PROFILE_INC(writecache_direct_writes); - return real_write_file(fsp, data, pos, n); + if (ret == -1) + return ret; + + if (pos + ret > wcp->file_size) + wcp->file_size = pos + ret; + + return ret; } write_path = 4; @@ -446,8 +469,13 @@ n = %u, wcp->offset=%.0f, wcp->data_size=%u\n", */ if (n > wcp->alloc_size ) { - if(real_write_file(fsp, data, pos, n) == -1) + ssize_t ret = real_write_file(fsp, data, pos, n); + if (ret == -1) return -1; + + if (pos + ret > wcp->file_size) + wcp->file_size = pos + n; + DO_PROFILE_INC(writecache_direct_writes); return total_written + n; } @@ -470,7 +498,15 @@ n = %u, wcp->offset=%.0f, wcp->data_size=%u\n", DO_PROFILE_INC(writecache_num_write_caches); } wcp->data_size += n; + + /* + * Update the file size if changed. + */ + + if (wcp->offset + wcp->data_size > wcp->file_size) + wcp->file_size = wcp->offset + wcp->data_size; DEBUG(9,("cache return %u\n", (unsigned int)n)); + total_written += n; return total_written; /* .... that's a write :) */ } @@ -595,7 +631,7 @@ ssize_t flush_write_cache(files_struct *fsp, enum flush_reason_enum reason) * Ensure file size if kept up to date if write extends file. */ - if ((ret != -1) && (wcp->offset + ret >= wcp->file_size)) + if ((ret != -1) && (wcp->offset + ret > wcp->file_size)) wcp->file_size = wcp->offset + ret; return ret; -- cgit