summaryrefslogtreecommitdiff
path: root/source3/smbd/reply.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2005-04-01 00:21:55 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 10:56:26 -0500
commit89fffb349f19708ab23d5fd11fb004ee2ba1fe29 (patch)
tree2fe3b130e1fc5bae78e02f5ebbb8f15f45eab898 /source3/smbd/reply.c
parent4066f6e59a3d2a62abdf2934d7cee970cf2be4d6 (diff)
downloadsamba-89fffb349f19708ab23d5fd11fb004ee2ba1fe29.tar.gz
samba-89fffb349f19708ab23d5fd11fb004ee2ba1fe29.tar.bz2
samba-89fffb349f19708ab23d5fd11fb004ee2ba1fe29.zip
r6160: Ensure allocation size is correctly returned for OpenX. Only set allocation
on create/truncate for nttrans. Jeremy. (This used to be commit fb05ac4c03eec21f3f18668610022ebfa6d6bf4a)
Diffstat (limited to 'source3/smbd/reply.c')
-rw-r--r--source3/smbd/reply.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index 9a811c14a3..e2de97c478 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -1311,6 +1311,21 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
}
size = sbuf.st_size;
+
+ if ((smb_action == FILE_WAS_CREATED) || (smb_action == FILE_WAS_OVERWRITTEN)) {
+ SMB_BIG_UINT allocation_size = (SMB_BIG_UINT)IVAL(inbuf,smb_vwv9);
+ if (allocation_size && (allocation_size > (SMB_BIG_UINT)size)) {
+ fsp->initial_allocation_size = smb_roundup(fsp->conn, allocation_size);
+ if (vfs_allocate_file_space(fsp, fsp->initial_allocation_size) == -1) {
+ close_file(fsp,False);
+ END_PROFILE(SMBntcreateX);
+ return ERROR_NT(NT_STATUS_DISK_FULL);
+ }
+ } else {
+ fsp->initial_allocation_size = smb_roundup(fsp->conn,(SMB_BIG_UINT)size);
+ }
+ }
+
fmode = dos_mode(conn,fname,&sbuf);
mtime = sbuf.st_mtime;
if (fmode & aDIR) {
@@ -1348,7 +1363,7 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt
put_dos_date3(outbuf,smb_vwv4,mtime & ~1);
else
put_dos_date3(outbuf,smb_vwv4,mtime);
- SIVAL(outbuf,smb_vwv6,(uint32)size);
+ SIVAL(outbuf,smb_vwv6,(uint32)get_allocation_size(conn,fsp,&sbuf));
SSVAL(outbuf,smb_vwv8,rmode);
SSVAL(outbuf,smb_vwv11,smb_action);