svn commit: samba r6161 - in trunk/source/smbd: .

jra at samba.org jra at samba.org
Fri Apr 1 00:21:56 GMT 2005


Author: jra
Date: 2005-04-01 00:21:56 +0000 (Fri, 01 Apr 2005)
New Revision: 6161

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=6161

Log:
Ensure allocation size is correctly returned for OpenX. Only set allocation
on create/truncate for nttrans.
Jeremy.

Modified:
   trunk/source/smbd/nttrans.c
   trunk/source/smbd/reply.c


Changeset:
Modified: trunk/source/smbd/nttrans.c
===================================================================
--- trunk/source/smbd/nttrans.c	2005-04-01 00:21:55 UTC (rev 6160)
+++ trunk/source/smbd/nttrans.c	2005-04-01 00:21:56 UTC (rev 6161)
@@ -588,7 +588,6 @@
 	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 @@
 	} 
 	
 	/* 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 (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);
 		}
-		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);
 	}
 
 	/* 
@@ -1224,7 +1225,6 @@
 	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 @@
 	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 (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);
 		}
-		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);
 	}
 
 	/* Realloc the size of parameters and data we will return */

Modified: trunk/source/smbd/reply.c
===================================================================
--- trunk/source/smbd/reply.c	2005-04-01 00:21:55 UTC (rev 6160)
+++ trunk/source/smbd/reply.c	2005-04-01 00:21:56 UTC (rev 6161)
@@ -1311,6 +1311,21 @@
 	}
 
 	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 @@
 		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);
 



More information about the samba-cvs mailing list