diff options
author | Jeremy Allison <jra@samba.org> | 2002-01-20 00:43:28 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2002-01-20 00:43:28 +0000 |
commit | 2590721a36b2d6efd3b822312e9545548cfc96ca (patch) | |
tree | b0433f94e9de8b384bb909f637f3fd1d14608ae0 /source3 | |
parent | 427896866af5a0047482ce7a0e8e3b69e9063fb2 (diff) | |
download | samba-2590721a36b2d6efd3b822312e9545548cfc96ca.tar.gz samba-2590721a36b2d6efd3b822312e9545548cfc96ca.tar.bz2 samba-2590721a36b2d6efd3b822312e9545548cfc96ca.zip |
Fix file size calculations for write cache code.
Jeremy.
(This used to be commit 71d647b6c0db8470d6144683c41ab26a7e1ef35e)
Diffstat (limited to 'source3')
-rw-r--r-- | source3/smbd/fileio.c | 46 |
1 files changed, 41 insertions, 5 deletions
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 @@ -271,6 +271,13 @@ nonop=%u allocated=%u active=%u direct=%u perfect=%u readhits=%u\n", 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. */ @@ -313,6 +320,13 @@ nonop=%u allocated=%u active=%u direct=%u perfect=%u readhits=%u\n", 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; |