* fhandler_disk_file.cc (fhandler_disk_file::opendir): Don't try to
use FileIdBothDirectoryInformation on NFS shares. Fix comment to explain why. * path.cc (symlink_info::check): Reinstantiate no_ea. Use in erroneously changed condition.
This commit is contained in:
parent
e765b3c0ad
commit
6afd630106
|
@ -1,3 +1,11 @@
|
||||||
|
2008-05-23 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* fhandler_disk_file.cc (fhandler_disk_file::opendir): Don't try to
|
||||||
|
use FileIdBothDirectoryInformation on NFS shares. Fix comment to
|
||||||
|
explain why.
|
||||||
|
* path.cc (symlink_info::check): Reinstantiate no_ea. Use in
|
||||||
|
erroneously changed condition.
|
||||||
|
|
||||||
2008-05-23 Christopher Faylor <me+cygwin@cgf.cx>
|
2008-05-23 Christopher Faylor <me+cygwin@cgf.cx>
|
||||||
|
|
||||||
* mount.cc (find_root_from_cygwin_dll): New function factored from
|
* mount.cc (find_root_from_cygwin_dll): New function factored from
|
||||||
|
@ -19,7 +27,7 @@
|
||||||
|
|
||||||
* path.cc (symlink_info::check): Remove unused variable.
|
* path.cc (symlink_info::check): Remove unused variable.
|
||||||
|
|
||||||
2008-05-22 Corinna Vinschen <corinna@vinschen.de>
|
2008-05-23 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* shared.cc (open_shared): Fix comments. Fix a condition which has
|
* shared.cc (open_shared): Fix comments. Fix a condition which has
|
||||||
been overlooked to revert to its old state in change from 2008-04-18.
|
been overlooked to revert to its old state in change from 2008-04-18.
|
||||||
|
@ -30,7 +38,7 @@
|
||||||
loop. Set to NULL on first STATUS_EAS_NOT_SUPPORTED. Align comments.
|
loop. Set to NULL on first STATUS_EAS_NOT_SUPPORTED. Align comments.
|
||||||
Fix formatting.
|
Fix formatting.
|
||||||
|
|
||||||
2008-05-22 Corinna Vinschen <corinna@vinschen.de>
|
2008-05-23 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* fhandler_disk_file.cc (fhandler_disk_file::readdir): Eliminate
|
* fhandler_disk_file.cc (fhandler_disk_file::readdir): Eliminate
|
||||||
compiler warning.
|
compiler warning.
|
||||||
|
|
|
@ -1569,19 +1569,21 @@ fhandler_disk_file::opendir (int fd)
|
||||||
FileIdBothDirectoryInformation only on filesystems supporting
|
FileIdBothDirectoryInformation only on filesystems supporting
|
||||||
persistent ACLs, FileDirectoryInformation otherwise.
|
persistent ACLs, FileDirectoryInformation otherwise.
|
||||||
|
|
||||||
On older NFS clients (up to SFU 3.5), dangling symlinks
|
NFS clients hide dangling symlinks from directory queries,
|
||||||
are hidden from directory queries, unless you use the
|
unless you use the FileNamesInformation info class.
|
||||||
FileNamesInformation info class. Nevertheless, we try
|
On newer NFS clients (>=Vista) FileIdBothDirectoryInformation
|
||||||
FileIdBothDirectoryInformation first. On newer NFS clients
|
works fine, but only if the NFS share is mounted to a drive
|
||||||
it works fine, on the older ones it returns "invalid info
|
letter. TODO: We don't test that here for now, but it might
|
||||||
class". So we can stick to the above explained mechanism. */
|
be worth to test if there's a speed gain in using
|
||||||
|
FileIdBothDirectoryInformation, because it doesn't require to
|
||||||
|
open the file to read the inode number. */
|
||||||
if (pc.hasgood_inode ())
|
if (pc.hasgood_inode ())
|
||||||
{
|
{
|
||||||
dir->__flags |= dirent_set_d_ino;
|
dir->__flags |= dirent_set_d_ino;
|
||||||
if (wincap.has_fileid_dirinfo ())
|
|
||||||
dir->__flags |= dirent_get_d_ino;
|
|
||||||
if (pc.fs_is_nfs ())
|
if (pc.fs_is_nfs ())
|
||||||
dir->__flags |= dirent_nfs_d_ino;
|
dir->__flags |= dirent_nfs_d_ino;
|
||||||
|
else if (wincap.has_fileid_dirinfo ())
|
||||||
|
dir->__flags |= dirent_get_d_ino;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fd >= 0)
|
if (fd >= 0)
|
||||||
|
|
|
@ -2342,7 +2342,7 @@ symlink_info::check (char *path, const suffix_info *suffixes, unsigned opt,
|
||||||
tp.u_get (&upath);
|
tp.u_get (&upath);
|
||||||
InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE, NULL, NULL);
|
InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE, NULL, NULL);
|
||||||
|
|
||||||
void *eabuf = &nfs_aol_ffei;
|
PVOID eabuf = &nfs_aol_ffei;
|
||||||
ULONG easize = sizeof nfs_aol_ffei;
|
ULONG easize = sizeof nfs_aol_ffei;
|
||||||
|
|
||||||
while (suffix.next ())
|
while (suffix.next ())
|
||||||
|
@ -2350,6 +2350,7 @@ symlink_info::check (char *path, const suffix_info *suffixes, unsigned opt,
|
||||||
FILE_BASIC_INFORMATION fbi;
|
FILE_BASIC_INFORMATION fbi;
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
IO_STATUS_BLOCK io;
|
IO_STATUS_BLOCK io;
|
||||||
|
bool no_ea = false;
|
||||||
|
|
||||||
error = 0;
|
error = 0;
|
||||||
get_nt_native_path (suffix.path, upath, pflags & MOUNT_ENC);
|
get_nt_native_path (suffix.path, upath, pflags & MOUNT_ENC);
|
||||||
|
@ -2373,6 +2374,7 @@ symlink_info::check (char *path, const suffix_info *suffixes, unsigned opt,
|
||||||
/* No right to access EAs or EAs not supported? */
|
/* No right to access EAs or EAs not supported? */
|
||||||
if (status == STATUS_ACCESS_DENIED || status == STATUS_EAS_NOT_SUPPORTED)
|
if (status == STATUS_ACCESS_DENIED || status == STATUS_EAS_NOT_SUPPORTED)
|
||||||
{
|
{
|
||||||
|
no_ea = true;
|
||||||
/* If EAs are not supported, there's no sense to check them again
|
/* If EAs are not supported, there's no sense to check them again
|
||||||
whith suffixes attached. So we set eabuf/easize to 0 here once. */
|
whith suffixes attached. So we set eabuf/easize to 0 here once. */
|
||||||
if (status == STATUS_EAS_NOT_SUPPORTED)
|
if (status == STATUS_EAS_NOT_SUPPORTED)
|
||||||
|
@ -2380,8 +2382,7 @@ symlink_info::check (char *path, const suffix_info *suffixes, unsigned opt,
|
||||||
eabuf = NULL;
|
eabuf = NULL;
|
||||||
easize = 0;
|
easize = 0;
|
||||||
}
|
}
|
||||||
status = NtCreateFile (&h,
|
status = NtCreateFile (&h, READ_CONTROL | FILE_READ_ATTRIBUTES,
|
||||||
READ_CONTROL | FILE_READ_ATTRIBUTES,
|
|
||||||
&attr, &io, NULL, FILE_ATTRIBUTE_NORMAL,
|
&attr, &io, NULL, FILE_ATTRIBUTE_NORMAL,
|
||||||
FILE_SHARE_VALID_FLAGS, FILE_OPEN,
|
FILE_SHARE_VALID_FLAGS, FILE_OPEN,
|
||||||
FILE_OPEN_REPARSE_POINT
|
FILE_OPEN_REPARSE_POINT
|
||||||
|
@ -2526,7 +2527,7 @@ symlink_info::check (char *path, const suffix_info *suffixes, unsigned opt,
|
||||||
/* If the file could be opened with FILE_READ_EA, and if it's on a
|
/* If the file could be opened with FILE_READ_EA, and if it's on a
|
||||||
NFS share, check if it's a symlink. Only files can be symlinks
|
NFS share, check if it's a symlink. Only files can be symlinks
|
||||||
(which can be symlinks to directories). */
|
(which can be symlinks to directories). */
|
||||||
else if (!eabuf && !(fileattr & FILE_ATTRIBUTE_DIRECTORY) && fs.is_nfs ())
|
else if (!no_ea && !(fileattr & FILE_ATTRIBUTE_DIRECTORY) && fs.is_nfs ())
|
||||||
{
|
{
|
||||||
res = check_nfs_symlink (h);
|
res = check_nfs_symlink (h);
|
||||||
if (!res)
|
if (!res)
|
||||||
|
|
Loading…
Reference in New Issue