Updated server-FileEndOfFileInformation patchset, growing a memory mapped file should still work.

This commit is contained in:
Sebastian Lackner
2015-10-31 21:12:40 +01:00
parent 4be7c872c3
commit d4e3581847
3 changed files with 59 additions and 0 deletions

View File

@@ -0,0 +1,55 @@
From 70e97a724ec17b2e78333eb79d25a443defca13c Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sat, 31 Oct 2015 21:11:23 +0100
Subject: server: Growing files which are mapped to memory should still work.
---
server/fd.c | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/server/fd.c b/server/fd.c
index f91659d..144f04a 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -2366,14 +2366,23 @@ static void set_fd_eof( struct fd *fd, file_pos_t eof )
return;
}
- /* can't set eof of files which are mapped to memory */
- LIST_FOR_EACH( ptr, &fd->inode->open )
+ if (fstat( fd->unix_fd, &st ) == -1)
{
- struct fd *fd_ptr = LIST_ENTRY( ptr, struct fd, inode_entry );
- if (fd_ptr != fd && (fd_ptr->access & FILE_MAPPING_ACCESS))
+ file_set_error();
+ return;
+ }
+
+ /* can't truncate files which are mapped to memory */
+ if (eof < st.st_size)
+ {
+ LIST_FOR_EACH( ptr, &fd->inode->open )
{
- set_error( STATUS_USER_MAPPED_FILE );
- return;
+ struct fd *fd_ptr = LIST_ENTRY( ptr, struct fd, inode_entry );
+ if (fd_ptr != fd && (fd_ptr->access & FILE_MAPPING_ACCESS))
+ {
+ set_error( STATUS_USER_MAPPED_FILE );
+ return;
+ }
}
}
@@ -2381,7 +2390,7 @@ static void set_fd_eof( struct fd *fd, file_pos_t eof )
if (ftruncate( fd->unix_fd, eof ) != -1) return;
/* now check for the need to extend the file */
- if (fstat( fd->unix_fd, &st ) != -1 && eof > st.st_size)
+ if (eof > st.st_size)
{
/* extend the file one byte beyond the requested size and then truncate it */
/* this should work around ftruncate implementations that can't extend files */
--
2.6.1