summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2002-01-20 00:43:28 +0000
committerJeremy Allison <jra@samba.org>2002-01-20 00:43:28 +0000
commit2590721a36b2d6efd3b822312e9545548cfc96ca (patch)
treeb0433f94e9de8b384bb909f637f3fd1d14608ae0
parent427896866af5a0047482ce7a0e8e3b69e9063fb2 (diff)
downloadsamba-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)
-rw-r--r--source3/smbd/fileio.c46
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;