* syscalls.cc (rename): Use volume serial numbers stored in path_conv

rather than fetching them here for the "same file" test.  Change
	comment to reflect this.
This commit is contained in:
Corinna Vinschen 2008-04-29 09:24:54 +00:00
parent b1d07c81ca
commit 59c7f5bcdf
2 changed files with 13 additions and 15 deletions

View File

@ -1,3 +1,9 @@
2008-04-29 Corinna Vinschen <corinna@vinschen.de>
* syscalls.cc (rename): Use volume serial numbers stored in path_conv
rather than fetching them here for the "same file" test. Change
comment to reflect this.
2008-04-28 Corinna Vinschen <corinna@vinschen.de> 2008-04-28 Corinna Vinschen <corinna@vinschen.de>
* path.cc (symlink_info::check): Avoid special handling for * path.cc (symlink_info::check): Avoid special handling for

View File

@ -1740,12 +1740,14 @@ rename (const char *oldpath, const char *newpath)
/* SUSv3: If the old argument and the new argument resolve to the same /* SUSv3: If the old argument and the new argument resolve to the same
existing file, rename() shall return successfully and perform no existing file, rename() shall return successfully and perform no
other action. other action.
The test tries to be as quick as possible. First it tests if oldpath The test tries to be as quick as possible. First it tests for identical
has more than 1 hardlink, then it opens newpath and tests for identical volume serial numbers because that information is available anyway.
file ids. If so, it tests for identical volume serial numbers, If so, Then it tests if oldpath has more than 1 hardlink, then it opens newpath
oldpath and newpath refer to the same file. */ and tests for identical file ids. If so, oldpath and newpath refer to
the same file. */
if ((removepc || dstpc->exists ()) if ((removepc || dstpc->exists ())
&& !oldpc.isdir () && !oldpc.isdir ()
&& dstpc->fs_serial_number () == oldpc.fs_serial_number ()
&& NT_SUCCESS (NtQueryInformationFile (fh, &io, &ofsi, sizeof ofsi, && NT_SUCCESS (NtQueryInformationFile (fh, &io, &ofsi, sizeof ofsi,
FileStandardInformation)) FileStandardInformation))
&& ofsi.NumberOfLinks > 1 && ofsi.NumberOfLinks > 1
@ -1756,23 +1758,13 @@ rename (const char *oldpath, const char *newpath)
| ((removepc ?: dstpc)->is_rep_symlink () | ((removepc ?: dstpc)->is_rep_symlink ()
? FILE_OPEN_REPARSE_POINT : 0)))) ? FILE_OPEN_REPARSE_POINT : 0))))
{ {
static const size_t vsiz = sizeof (FILE_FS_VOLUME_INFORMATION)
+ 32 * sizeof (WCHAR);
FILE_INTERNAL_INFORMATION ofii, nfii; FILE_INTERNAL_INFORMATION ofii, nfii;
PFILE_FS_VOLUME_INFORMATION opffvi, npffvi;
if (NT_SUCCESS (NtQueryInformationFile (fh, &io, &ofii, sizeof ofii, if (NT_SUCCESS (NtQueryInformationFile (fh, &io, &ofii, sizeof ofii,
FileInternalInformation)) FileInternalInformation))
&& NT_SUCCESS (NtQueryInformationFile (nfh, &io, &nfii, sizeof nfii, && NT_SUCCESS (NtQueryInformationFile (nfh, &io, &nfii, sizeof nfii,
FileInternalInformation)) FileInternalInformation))
&& ofii.FileId.QuadPart == nfii.FileId.QuadPart && ofii.FileId.QuadPart == nfii.FileId.QuadPart)
&& (opffvi = (PFILE_FS_VOLUME_INFORMATION) alloca (vsiz))
&& (npffvi = (PFILE_FS_VOLUME_INFORMATION) alloca (vsiz))
&& NT_SUCCESS (NtQueryVolumeInformationFile (fh, &io, opffvi, vsiz,
FileFsVolumeInformation))
&& NT_SUCCESS (NtQueryVolumeInformationFile (nfh, &io, npffvi, vsiz,
FileFsVolumeInformation))
&& opffvi->VolumeSerialNumber == npffvi->VolumeSerialNumber)
{ {
debug_printf ("%s and %s are the same file", oldpath, newpath); debug_printf ("%s and %s are the same file", oldpath, newpath);
NtClose (nfh); NtClose (nfh);