r6160: Ensure allocation size is correctly returned for OpenX. Only set allocation
authorJeremy Allison <jra@samba.org>
Fri, 1 Apr 2005 00:21:55 +0000 (00:21 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:56:26 +0000 (10:56 -0500)
on create/truncate for nttrans.
Jeremy.
(This used to be commit fb05ac4c03eec21f3f18668610022ebfa6d6bf4a)

source3/smbd/nttrans.c
source3/smbd/reply.c

index 70b3f0d0e00ce4479fda61a3f3379043710234e0..5f5854cda370cabdf832a4fa40c373ebfa026dbc 100644 (file)
@@ -588,7 +588,6 @@ int reply_ntcreate_and_X(connection_struct *conn,
        uint32 create_disposition = IVAL(inbuf,smb_ntcreate_CreateDisposition);
        uint32 create_options = IVAL(inbuf,smb_ntcreate_CreateOptions);
        uint16 root_dir_fid = (uint16)IVAL(inbuf,smb_ntcreate_RootDirectoryFid);
-       SMB_BIG_UINT allocation_size = 0;
        int smb_ofun;
        int smb_open_mode;
        /* Breakout the oplock request bits so we can set the
@@ -931,25 +930,27 @@ create_options = 0x%x root_dir_fid = 0x%x\n", flags, desired_access, file_attrib
        } 
        
        /* Save the requested allocation size. */
-       allocation_size = (SMB_BIG_UINT)IVAL(inbuf,smb_ntcreate_AllocationSize);
+       if ((smb_action == FILE_WAS_CREATED) || (smb_action == FILE_WAS_OVERWRITTEN)) {
+               SMB_BIG_UINT allocation_size = (SMB_BIG_UINT)IVAL(inbuf,smb_ntcreate_AllocationSize);
 #ifdef LARGE_SMB_OFF_T
-       allocation_size |= (((SMB_BIG_UINT)IVAL(inbuf,smb_ntcreate_AllocationSize + 4)) << 32);
+               allocation_size |= (((SMB_BIG_UINT)IVAL(inbuf,smb_ntcreate_AllocationSize + 4)) << 32);
 #endif
-       if (allocation_size && (allocation_size > (SMB_BIG_UINT)file_len)) {
-               fsp->initial_allocation_size = smb_roundup(fsp->conn, allocation_size);
-               if (fsp->is_directory) {
-                       close_file(fsp,False);
-                       END_PROFILE(SMBntcreateX);
-                       /* Can't set allocation size on a directory. */
-                       return ERROR_NT(NT_STATUS_ACCESS_DENIED);
-               }
-               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);
+               if (allocation_size && (allocation_size > (SMB_BIG_UINT)file_len)) {
+                       fsp->initial_allocation_size = smb_roundup(fsp->conn, allocation_size);
+                       if (fsp->is_directory) {
+                               close_file(fsp,False);
+                               END_PROFILE(SMBntcreateX);
+                               /* Can't set allocation size on a directory. */
+                               return ERROR_NT(NT_STATUS_ACCESS_DENIED);
+                       }
+                       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)file_len);
                }
-       } else {
-               fsp->initial_allocation_size = smb_roundup(fsp->conn,(SMB_BIG_UINT)file_len);
        }
 
        /* 
@@ -1224,7 +1225,6 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
        uint32 sd_len;
        uint32 ea_len;
        uint16 root_dir_fid;
-       SMB_BIG_UINT allocation_size = 0;
        int smb_ofun;
        int smb_open_mode;
        time_t c_time;
@@ -1585,24 +1585,26 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
        restore_case_semantics(conn, file_attributes);
 
        /* Save the requested allocation size. */
-       allocation_size = (SMB_BIG_UINT)IVAL(params,12);
+       if ((smb_action == FILE_WAS_CREATED) || (smb_action == FILE_WAS_OVERWRITTEN)) {
+               SMB_BIG_UINT allocation_size = (SMB_BIG_UINT)IVAL(params,12);
 #ifdef LARGE_SMB_OFF_T
-       allocation_size |= (((SMB_BIG_UINT)IVAL(params,16)) << 32);
+               allocation_size |= (((SMB_BIG_UINT)IVAL(params,16)) << 32);
 #endif
-       if (allocation_size && (allocation_size > file_len)) {
-               fsp->initial_allocation_size = smb_roundup(fsp->conn, allocation_size);
-               if (fsp->is_directory) {
-                       close_file(fsp,False);
-                       END_PROFILE(SMBntcreateX);
-                       /* Can't set allocation size on a directory. */
-                       return ERROR_NT(NT_STATUS_ACCESS_DENIED);
-               }
-               if (vfs_allocate_file_space(fsp, fsp->initial_allocation_size) == -1) {
-                       close_file(fsp,False);
-                       return ERROR_NT(NT_STATUS_DISK_FULL);
+               if (allocation_size && (allocation_size > file_len)) {
+                       fsp->initial_allocation_size = smb_roundup(fsp->conn, allocation_size);
+                       if (fsp->is_directory) {
+                               close_file(fsp,False);
+                               END_PROFILE(SMBntcreateX);
+                               /* Can't set allocation size on a directory. */
+                               return ERROR_NT(NT_STATUS_ACCESS_DENIED);
+                       }
+                       if (vfs_allocate_file_space(fsp, fsp->initial_allocation_size) == -1) {
+                               close_file(fsp,False);
+                               return ERROR_NT(NT_STATUS_DISK_FULL);
+                       }
+               } else {
+                       fsp->initial_allocation_size = smb_roundup(fsp->conn, (SMB_BIG_UINT)file_len);
                }
-       } else {
-               fsp->initial_allocation_size = smb_roundup(fsp->conn, (SMB_BIG_UINT)file_len);
        }
 
        /* Realloc the size of parameters and data we will return */
index 9a811c14a36adbd9c28f8e460033d167ac377359..e2de97c47853f6c148121fa4753ccd9542941de2 100644 (file)
@@ -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);