diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2008-04-29 13:24:54 +0400 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2008-04-29 13:24:54 +0400 |
commit | 59c7f5bcdfee597e6e250edeccfb3a0786955f13 (patch) | |
tree | 4e9d1cbec1706b6375c72af72b968193f4d0f5f8 /winsup/cygwin | |
parent | b1d07c81ca6a8f33ecf729a2fd257a1de24c5f10 (diff) |
* 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.
Diffstat (limited to 'winsup/cygwin')
-rw-r--r-- | winsup/cygwin/ChangeLog | 6 | ||||
-rw-r--r-- | winsup/cygwin/syscalls.cc | 22 |
2 files changed, 13 insertions, 15 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 0dfb396af..d095fe14d 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -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> * path.cc (symlink_info::check): Avoid special handling for diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index 7da929efa..b323da203 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -1740,12 +1740,14 @@ rename (const char *oldpath, const char *newpath) /* SUSv3: If the old argument and the new argument resolve to the same existing file, rename() shall return successfully and perform no other action. - The test tries to be as quick as possible. First it tests if oldpath - has more than 1 hardlink, then it opens newpath and tests for identical - file ids. If so, it tests for identical volume serial numbers, If so, - oldpath and newpath refer to the same file. */ + The test tries to be as quick as possible. First it tests for identical + volume serial numbers because that information is available anyway. + Then it tests if oldpath has more than 1 hardlink, then it opens newpath + and tests for identical file ids. If so, oldpath and newpath refer to + the same file. */ if ((removepc || dstpc->exists ()) && !oldpc.isdir () + && dstpc->fs_serial_number () == oldpc.fs_serial_number () && NT_SUCCESS (NtQueryInformationFile (fh, &io, &ofsi, sizeof ofsi, FileStandardInformation)) && ofsi.NumberOfLinks > 1 @@ -1756,23 +1758,13 @@ rename (const char *oldpath, const char *newpath) | ((removepc ?: dstpc)->is_rep_symlink () ? FILE_OPEN_REPARSE_POINT : 0)))) { - static const size_t vsiz = sizeof (FILE_FS_VOLUME_INFORMATION) - + 32 * sizeof (WCHAR); FILE_INTERNAL_INFORMATION ofii, nfii; - PFILE_FS_VOLUME_INFORMATION opffvi, npffvi; if (NT_SUCCESS (NtQueryInformationFile (fh, &io, &ofii, sizeof ofii, FileInternalInformation)) && NT_SUCCESS (NtQueryInformationFile (nfh, &io, &nfii, sizeof nfii, FileInternalInformation)) - && 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) + && ofii.FileId.QuadPart == nfii.FileId.QuadPart) { debug_printf ("%s and %s are the same file", oldpath, newpath); NtClose (nfh); |