* 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:
Corinna Vinschen 2008-05-23 17:22:18 +00:00
parent e765b3c0ad
commit 6afd630106
3 changed files with 25 additions and 14 deletions

View File

@ -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.

View File

@ -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)

View File

@ -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)