bin/91134: [PATCH] Preserve access and modification time when
cp to a smbfs destination path
Bruce Evans
bde at zeta.org.au
Sat Dec 31 16:10:08 PST 2005
The following reply was made to PR bin/91134; it has been noted by GNATS.
From: Bruce Evans <bde at zeta.org.au>
To: Gilbert Cao <hika at bsdmon.com>
Cc: FreeBSD-gnats-submit at freebsd.org, freebsd-bugs at freebsd.org
Subject: Re: bin/91134: [PATCH] Preserve access and modification time when
cp to a smbfs destination path
Date: Sun, 1 Jan 2006 11:06:48 +1100 (EST)
On Sat, 31 Dec 2005, Gilbert Cao wrote:
>> Fix:
> The following patch has fixed the problem as I have finally found the problem in
> the src/bin/cp source code, especially the utils.c file :
> I have found out that utimes() does nothing on the newly created file, if its
> file descriptor is not closed yet, and this is only the case in a SMB destination path.
This is a bug in smbfs. cp only works on POSIX file systems.
> --- patch_cp_utils.diff begins here ---
> --- ./src/bin/cp/utils.c.orig Sat Nov 12 22:21:45 2005
> +++ ./src/bin/cp/utils.c Fri Dec 30 19:23:04 2005
> @@ -204,8 +204,6 @@
> * to remove it if we created it and its length is 0.
> */
>
> - if (pflag && setfile(fs, to_fd))
> - rval = 1;
> if (pflag && preserve_fd_acls(from_fd, to_fd) != 0)
> rval = 1;
> (void)close(from_fd);
> @@ -213,6 +211,14 @@
> warn("%s", to.p_path);
> rval = 1;
> }
> + /*
> + * To preserve times in SMB to.p_path,
> + * setfile() should be call *AFTER* we have closed the file
> + * descriptors. As we have closed the descriptors, we should
> + * pass -1 instead of the `to_fd` value
> + */
> + if (pflag && setfile(fs, -1))
> + rval = 1;
> return (rval);
> }
It can't be right to always close the file. This leaves the fd >= 0 case
in setfile() unused and bogotifies all the code that handles this case,
even for POSIX file systems where this code just works. However, I can't
see any reason to have the fd >= 0 case except to avoid minor races for
regular files only.
Bruce
More information about the freebsd-bugs
mailing list