diff options
author | Jeremy Allison <jra@samba.org> | 2005-04-01 00:21:55 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 10:56:26 -0500 |
commit | 89fffb349f19708ab23d5fd11fb004ee2ba1fe29 (patch) | |
tree | 2fe3b130e1fc5bae78e02f5ebbb8f15f45eab898 /source3/smbd/reply.c | |
parent | 4066f6e59a3d2a62abdf2934d7cee970cf2be4d6 (diff) | |
download | samba-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.c | 17 |
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); |