svn commit: samba r23855 - in branches: SAMBA_3_0_25/source/smbd SAMBA_3_2/source/smbd SAMBA_3_2_0/source/smbd

jra at samba.org jra at samba.org
Thu Jul 12 18:11:51 GMT 2007


Author: jra
Date: 2007-07-12 18:11:41 +0000 (Thu, 12 Jul 2007)
New Revision: 23855

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

Log:
Setting the allocation size updates the modified time
as a write does. Fix bug #4779.
Jeremy.

Modified:
   branches/SAMBA_3_0_25/source/smbd/trans2.c
   branches/SAMBA_3_2/source/smbd/trans2.c
   branches/SAMBA_3_2_0/source/smbd/trans2.c


Changeset:
Modified: branches/SAMBA_3_0_25/source/smbd/trans2.c
===================================================================
--- branches/SAMBA_3_0_25/source/smbd/trans2.c	2007-07-12 18:02:04 UTC (rev 23854)
+++ branches/SAMBA_3_0_25/source/smbd/trans2.c	2007-07-12 18:11:41 UTC (rev 23855)
@@ -4845,18 +4845,25 @@
 		allocation_size = smb_roundup(conn, allocation_size);
 	}
 
-	if(allocation_size == get_file_size(*psbuf)) {
-		return NT_STATUS_OK;
-	}
- 
 	DEBUG(10,("smb_set_file_allocation_info: file %s : setting new allocation size to %.0f\n",
 			fname, (double)allocation_size ));
- 
+
 	if (fsp && fsp->fh->fd != -1) {
 		/* Open file handle. */
-		if (vfs_allocate_file_space(fsp, allocation_size) == -1) {
-			return map_nt_error_from_unix(errno);
+		/* Only change if needed. */
+		if (allocation_size != get_file_size(*psbuf)) {
+			if (vfs_allocate_file_space(fsp, allocation_size) == -1) {
+				return map_nt_error_from_unix(errno);
+			}
 		}
+		/* But always update the time. */
+		if (null_timespec(fsp->pending_modtime)) {
+			/*
+			 * This is equivalent to a write. Ensure it's seen immediately
+			 * if there are no pending writes.
+			 */
+			set_filetime(fsp->conn, fsp->fsp_name, timespec_current());
+		}
 		return NT_STATUS_OK;
 	}
 
@@ -4870,17 +4877,27 @@
 				FILE_ATTRIBUTE_NORMAL,
 				FORCE_OPLOCK_BREAK_TO_NONE,
 				NULL, &new_fsp);
- 
+
 	if (!NT_STATUS_IS_OK(status)) {
 		/* NB. We check for open_was_deferred in the caller. */
 		return status;
 	}
-	if (vfs_allocate_file_space(new_fsp, allocation_size) == -1) {
-		status = map_nt_error_from_unix(errno);
-		close_file(new_fsp,NORMAL_CLOSE);
-		return status;
+
+	/* Only change if needed. */
+	if (allocation_size != get_file_size(*psbuf)) {
+		if (vfs_allocate_file_space(new_fsp, allocation_size) == -1) {
+			status = map_nt_error_from_unix(errno);
+			close_file(new_fsp,NORMAL_CLOSE);
+			return status;
+		}
 	}
 
+	/* Changing the allocation size should set the last mod time. */
+	/* Don't need to call set_filetime as this will be flushed on
+	 * close. */
+
+	fsp_set_pending_modtime(new_fsp, timespec_current());
+
 	close_file(new_fsp,NORMAL_CLOSE);
 	return NT_STATUS_OK;
 }

Modified: branches/SAMBA_3_2/source/smbd/trans2.c
===================================================================
--- branches/SAMBA_3_2/source/smbd/trans2.c	2007-07-12 18:02:04 UTC (rev 23854)
+++ branches/SAMBA_3_2/source/smbd/trans2.c	2007-07-12 18:11:41 UTC (rev 23855)
@@ -5009,18 +5009,25 @@
 		allocation_size = smb_roundup(conn, allocation_size);
 	}
 
-	if(allocation_size == get_file_size(*psbuf)) {
-		return NT_STATUS_OK;
-	}
- 
 	DEBUG(10,("smb_set_file_allocation_info: file %s : setting new allocation size to %.0f\n",
 			fname, (double)allocation_size ));
- 
+
 	if (fsp && fsp->fh->fd != -1) {
 		/* Open file handle. */
-		if (vfs_allocate_file_space(fsp, allocation_size) == -1) {
-			return map_nt_error_from_unix(errno);
+		/* Only change if needed. */
+		if (allocation_size != get_file_size(*psbuf)) {
+			if (vfs_allocate_file_space(fsp, allocation_size) == -1) {
+				return map_nt_error_from_unix(errno);
+			}
 		}
+		/* But always update the time. */
+		if (null_timespec(fsp->pending_modtime)) {
+			/*
+			 * This is equivalent to a write. Ensure it's seen immediately
+			 * if there are no pending writes.
+			 */
+			set_filetime(fsp->conn, fsp->fsp_name, timespec_current());
+		}
 		return NT_STATUS_OK;
 	}
 
@@ -5034,17 +5041,27 @@
 				FILE_ATTRIBUTE_NORMAL,
 				FORCE_OPLOCK_BREAK_TO_NONE,
 				NULL, &new_fsp);
- 
+
 	if (!NT_STATUS_IS_OK(status)) {
 		/* NB. We check for open_was_deferred in the caller. */
 		return status;
 	}
-	if (vfs_allocate_file_space(new_fsp, allocation_size) == -1) {
-		status = map_nt_error_from_unix(errno);
-		close_file(new_fsp,NORMAL_CLOSE);
-		return status;
+
+	/* Only change if needed. */
+	if (allocation_size != get_file_size(*psbuf)) {
+		if (vfs_allocate_file_space(new_fsp, allocation_size) == -1) {
+			status = map_nt_error_from_unix(errno);
+			close_file(new_fsp,NORMAL_CLOSE);
+			return status;
+		}
 	}
 
+	/* Changing the allocation size should set the last mod time. */
+	/* Don't need to call set_filetime as this will be flushed on
+	 * close. */
+
+	fsp_set_pending_modtime(new_fsp, timespec_current());
+
 	close_file(new_fsp,NORMAL_CLOSE);
 	return NT_STATUS_OK;
 }

Modified: branches/SAMBA_3_2_0/source/smbd/trans2.c
===================================================================
--- branches/SAMBA_3_2_0/source/smbd/trans2.c	2007-07-12 18:02:04 UTC (rev 23854)
+++ branches/SAMBA_3_2_0/source/smbd/trans2.c	2007-07-12 18:11:41 UTC (rev 23855)
@@ -4955,18 +4955,25 @@
 		allocation_size = smb_roundup(conn, allocation_size);
 	}
 
-	if(allocation_size == get_file_size(*psbuf)) {
-		return NT_STATUS_OK;
-	}
- 
 	DEBUG(10,("smb_set_file_allocation_info: file %s : setting new allocation size to %.0f\n",
 			fname, (double)allocation_size ));
- 
+
 	if (fsp && fsp->fh->fd != -1) {
 		/* Open file handle. */
-		if (vfs_allocate_file_space(fsp, allocation_size) == -1) {
-			return map_nt_error_from_unix(errno);
+		/* Only change if needed. */
+		if (allocation_size != get_file_size(*psbuf)) {
+			if (vfs_allocate_file_space(fsp, allocation_size) == -1) {
+				return map_nt_error_from_unix(errno);
+			}
 		}
+		/* But always update the time. */
+		if (null_timespec(fsp->pending_modtime)) {
+			/*
+			 * This is equivalent to a write. Ensure it's seen immediately
+			 * if there are no pending writes.
+			 */
+			set_filetime(fsp->conn, fsp->fsp_name, timespec_current());
+		}
 		return NT_STATUS_OK;
 	}
 
@@ -4980,17 +4987,27 @@
 				FILE_ATTRIBUTE_NORMAL,
 				FORCE_OPLOCK_BREAK_TO_NONE,
 				NULL, &new_fsp);
- 
+
 	if (!NT_STATUS_IS_OK(status)) {
 		/* NB. We check for open_was_deferred in the caller. */
 		return status;
 	}
-	if (vfs_allocate_file_space(new_fsp, allocation_size) == -1) {
-		status = map_nt_error_from_unix(errno);
-		close_file(new_fsp,NORMAL_CLOSE);
-		return status;
+
+	/* Only change if needed. */
+	if (allocation_size != get_file_size(*psbuf)) {
+		if (vfs_allocate_file_space(new_fsp, allocation_size) == -1) {
+			status = map_nt_error_from_unix(errno);
+			close_file(new_fsp,NORMAL_CLOSE);
+			return status;
+		}
 	}
 
+	/* Changing the allocation size should set the last mod time. */
+	/* Don't need to call set_filetime as this will be flushed on
+	 * close. */
+
+	fsp_set_pending_modtime(new_fsp, timespec_current());
+
 	close_file(new_fsp,NORMAL_CLOSE);
 	return NT_STATUS_OK;
 }



More information about the samba-cvs mailing list