diff options
Diffstat (limited to 'source3/smbd')
-rw-r--r-- | source3/smbd/vfs.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c index 2ebe2a1062..802639f2fb 100644 --- a/source3/smbd/vfs.c +++ b/source3/smbd/vfs.c @@ -501,13 +501,24 @@ int vfs_allocate_file_space(files_struct *fsp, uint64_t len) return ret; } + if (!lp_strict_allocate(SNUM(fsp->conn))) + return 0; + /* Grow - we need to test if we have enough space. */ contend_level2_oplocks_begin(fsp, LEVEL2_CONTEND_ALLOC_GROW); + + /* See if we have a syscall that will allocate beyond end-of-file + without changing EOF. */ + ret = SMB_VFS_FALLOCATE(fsp, VFS_FALLOCATE_KEEP_SIZE, 0, len); + contend_level2_oplocks_end(fsp, LEVEL2_CONTEND_ALLOC_GROW); - if (!lp_strict_allocate(SNUM(fsp->conn))) + if (ret == 0) { + /* We changed the allocation size on disk, but not + EOF - exactly as required. We're done ! */ return 0; + } len -= fsp->fsp_name->st.st_ex_size; len /= 1024; /* Len is now number of 1k blocks needed. */ |