1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-26 21:57:41 +03:00

r23855: Setting the allocation size updates the modified time

as a write does. Fix bug #4779.
Jeremy.
(This used to be commit ed0e2174a895b25ce2b4e8ffd912ad57b31dd2e9)
This commit is contained in:
Jeremy Allison 2007-07-12 18:11:41 +00:00 committed by Gerald (Jerry) Carter
parent c52c8b4821
commit 967b22827f

View File

@ -5009,17 +5009,24 @@ static NTSTATUS smb_set_file_allocation_info(connection_struct *conn,
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 @@ static NTSTATUS smb_set_file_allocation_info(connection_struct *conn,
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;
}