summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/mount.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/mount.cc')
-rw-r--r--winsup/cygwin/mount.cc86
1 files changed, 36 insertions, 50 deletions
diff --git a/winsup/cygwin/mount.cc b/winsup/cygwin/mount.cc
index 0b87534de..02c60deec 100644
--- a/winsup/cygwin/mount.cc
+++ b/winsup/cygwin/mount.cc
@@ -171,12 +171,10 @@ fs_info::update (PUNICODE_STRING upath, HANDLE in_vol)
if (!NT_SUCCESS (status))
ffdi.DeviceType = ffdi.Characteristics = 0;
- if (ffdi.Characteristics & FILE_REMOTE_DEVICE
+ if ((ffdi.Characteristics & FILE_REMOTE_DEVICE)
|| (!ffdi.DeviceType
&& RtlEqualUnicodePathPrefix (attr.ObjectName, &ro_u_uncp, TRUE)))
is_remote_drive (true);
- else
- is_remote_drive (false);
if (!no_media)
status = NtQueryVolumeInformationFile (vol, &io, &ffai_buf.ffai,
@@ -217,8 +215,6 @@ fs_info::update (PUNICODE_STRING upath, HANDLE in_vol)
| FILE_NAMED_STREAMS)
RtlInitCountedUnicodeString (&fsname, ffai_buf.ffai.FileSystemName,
ffai_buf.ffai.FileSystemNameLength);
- is_fat (RtlEqualUnicodePathPrefix (&fsname, &ro_u_fat, TRUE));
- is_csc_cache (RtlEqualUnicodeString (&fsname, &ro_u_csc, FALSE));
if (is_remote_drive ())
{
/* This always fails on NT4. */
@@ -234,40 +230,44 @@ fs_info::update (PUNICODE_STRING upath, HANDLE in_vol)
samba_version (extended_info->samba_version);
}
}
- /* Test for Samba on NT4 or for older Samba releases not supporting
- extended info. */
- if (!is_samba ())
- is_samba (RtlEqualUnicodeString (&fsname, &ro_u_ntfs, FALSE)
- && FS_IS_SAMBA);
-
- if (!is_samba ())
- {
- is_netapp (RtlEqualUnicodeString (&fsname, &ro_u_ntfs, FALSE)
- && FS_IS_NETAPP_DATAONTAP);
-
- is_nfs (RtlEqualUnicodeString (&fsname, &ro_u_nfs, FALSE));
-
- if (!is_nfs ())
- {
- /* Known remote file systems which can't handle calls to
- NtQueryDirectoryFile(FileIdBothDirectoryInformation) */
- has_buggy_fileid_dirinfo (RtlEqualUnicodeString (&fsname,
- &ro_u_unixfs,
- FALSE));
-
- /* Known remote file systems with buggy open calls. Further
- explanation in fhandler.cc (fhandler_disk_file::open). */
- has_buggy_open (RtlEqualUnicodeString (&fsname, &ro_u_sunwnfs,
- FALSE));
- }
- }
+ if (!got_fs ()
+ /* Test for Samba on NT4 or for older Samba releases not supporting
+ extended info. */
+ && !is_samba (RtlEqualUnicodeString (&fsname, &ro_u_ntfs, FALSE)
+ && FS_IS_SAMBA)
+ /* Netapp inode info is unusable. */
+ && !is_netapp (RtlEqualUnicodeString (&fsname, &ro_u_ntfs, FALSE)
+ && FS_IS_NETAPP_DATAONTAP)
+ /* Microsoft NFS needs distinct access methods for metadata. */
+ && !is_nfs (RtlEqualUnicodeString (&fsname, &ro_u_nfs, FALSE))
+ /* Known remote file system which can't handle calls to
+ NtQueryDirectoryFile(FileIdBothDirectoryInformation) */
+ && !is_unixfs (RtlEqualUnicodeString (&fsname, &ro_u_unixfs, FALSE)))
+ /* Known remote file system with buggy open calls. Further
+ explanation in fhandler.cc (fhandler_disk_file::open). */
+ is_sunwnfs (RtlEqualUnicodeString (&fsname, &ro_u_sunwnfs, FALSE));
+ }
+ if (!got_fs ()
+ && !is_ntfs (RtlEqualUnicodeString (&fsname, &ro_u_ntfs, FALSE))
+ && !is_fat (RtlEqualUnicodePathPrefix (&fsname, &ro_u_fat, TRUE))
+ && !is_csc_cache (RtlEqualUnicodeString (&fsname, &ro_u_csc, FALSE))
+ && is_cdrom (ffdi.DeviceType == FILE_DEVICE_CD_ROM))
+ {
+ is_udf (RtlEqualUnicodeString (&fsname, &ro_u_udf, FALSE));
+ /* UDF on NT 5.x is broken (at least) in terms of case sensitivity.
+ The UDF driver reports the FILE_CASE_SENSITIVE_SEARCH capability
+ but:
+ - Opening the root directory for query seems to work at first,
+ but the filenames in the directory listing are mutilated.
+ - When trying to open a file or directory case sensitive, the file
+ appears to be non-existant. */
+ if (is_udf () && wincap.has_broken_udf ())
+ caseinsensitive (true);
}
- is_ntfs (RtlEqualUnicodeString (&fsname, &ro_u_ntfs, FALSE)
- && !is_samba () && !is_netapp ());
has_acls (flags () & FS_PERSISTENT_ACLS);
- hasgood_inode (((flags () & FILE_PERSISTENT_ACLS) && !is_netapp ())
- || is_nfs ());
+ /* Netapp inodes numbers are fly-by-night. */
+ hasgood_inode ((has_acls () && !is_netapp ()) || is_nfs ());
/* Case sensitivity is supported if FILE_CASE_SENSITIVE_SEARCH is set,
except on Samba which handles Windows clients case insensitive.
NFS doesn't set the FILE_CASE_SENSITIVE_SEARCH flag but is case
@@ -275,20 +275,6 @@ fs_info::update (PUNICODE_STRING upath, HANDLE in_vol)
caseinsensitive ((!(flags () & FILE_CASE_SENSITIVE_SEARCH) || is_samba ())
&& !is_nfs ());
- is_cdrom (ffdi.DeviceType == FILE_DEVICE_CD_ROM);
- if (is_cdrom ())
- {
- is_udf (RtlEqualUnicodeString (&fsname, &ro_u_udf, FALSE));
- /* UDF on NT 5.x is broken (at least) in terms of case sensitivity. The
- UDF driver reports the FILE_CASE_SENSITIVE_SEARCH capability but:
- - Opening the root directory for query seems to work at first, but the
- filenames in the directory listing are mutilated.
- - When trying to open a file or directory case sensitive, the file
- appears to be non-existant. */
- if (is_udf () && wincap.has_broken_udf ())
- caseinsensitive (true);
- }
-
if (!in_vol)
NtClose (vol);
return true;