* 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:
parent
b1d07c81ca
commit
59c7f5bcdf
@ -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
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user