* fhandler_disk_file.cc (fhandler_base::fstat_by_name): Check for
file systems incapable of handling FileIdBothDirectoryInformation correctly. (fhandler_disk_file::opendir): Ditto. * path.cc (fs_info::update): Always clear at the start. Rearrange to make certain tests only on non-Samba, non-NFS remote drives. Add test for file systems known to be incapable of handling FileIdBothDirectoryInformation correctly. Right now that's just "UNIXFS". * path.h (struct fs_info): Add has_buggy_fileid_dirinfo flag and accessor methods. (class path_conv): Add has_buggy_fileid_dirinfo method.
This commit is contained in:
parent
b54881352d
commit
d79a78e5c8
|
@ -1,3 +1,19 @@
|
||||||
|
2008-07-30 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* fhandler_disk_file.cc (fhandler_base::fstat_by_name): Check for
|
||||||
|
file systems incapable of handling FileIdBothDirectoryInformation
|
||||||
|
correctly.
|
||||||
|
(fhandler_disk_file::opendir): Ditto.
|
||||||
|
* path.cc (fs_info::update): Always clear at the start.
|
||||||
|
Rearrange to make certain tests only on non-Samba, non-NFS remote
|
||||||
|
drives.
|
||||||
|
Add test for file systems known to be incapable of handling
|
||||||
|
FileIdBothDirectoryInformation correctly. Right now that's just
|
||||||
|
"UNIXFS".
|
||||||
|
* path.h (struct fs_info): Add has_buggy_fileid_dirinfo flag and
|
||||||
|
accessor methods.
|
||||||
|
(class path_conv): Add has_buggy_fileid_dirinfo method.
|
||||||
|
|
||||||
2008-07-30 Corinna Vinschen <corinna@vinschen.de>
|
2008-07-30 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* sec_auth.cc (extract_nt_dom_user): Return domain and user name as
|
* sec_auth.cc (extract_nt_dom_user): Return domain and user name as
|
||||||
|
|
|
@ -390,7 +390,7 @@ fhandler_base::fstat_by_name (struct __stat64 *buf)
|
||||||
debug_printf ("%p = NtOpenFile(%S)", status, pc.get_nt_native_path ());
|
debug_printf ("%p = NtOpenFile(%S)", status, pc.get_nt_native_path ());
|
||||||
goto too_bad;
|
goto too_bad;
|
||||||
}
|
}
|
||||||
if (wincap.has_fileid_dirinfo ()
|
if (wincap.has_fileid_dirinfo () && !pc.has_buggy_fileid_dirinfo ()
|
||||||
&& NT_SUCCESS (status = NtQueryDirectoryFile (dir, NULL, NULL, 0, &io,
|
&& NT_SUCCESS (status = NtQueryDirectoryFile (dir, NULL, NULL, 0, &io,
|
||||||
&fdi_buf.fdi, sizeof fdi_buf,
|
&fdi_buf.fdi, sizeof fdi_buf,
|
||||||
FileIdBothDirectoryInformation,
|
FileIdBothDirectoryInformation,
|
||||||
|
@ -1574,7 +1574,8 @@ fhandler_disk_file::opendir (int fd)
|
||||||
dir->__flags |= dirent_set_d_ino;
|
dir->__flags |= dirent_set_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 ())
|
else if (wincap.has_fileid_dirinfo ()
|
||||||
|
&& !pc.has_buggy_fileid_dirinfo ())
|
||||||
dir->__flags |= dirent_get_d_ino;
|
dir->__flags |= dirent_get_d_ino;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -389,6 +389,7 @@ fs_info::update (PUNICODE_STRING upath, HANDLE in_vol)
|
||||||
} ffvi_buf;
|
} ffvi_buf;
|
||||||
UNICODE_STRING fsname, testname;
|
UNICODE_STRING fsname, testname;
|
||||||
|
|
||||||
|
clear ();
|
||||||
if (in_vol)
|
if (in_vol)
|
||||||
vol = in_vol;
|
vol = in_vol;
|
||||||
else
|
else
|
||||||
|
@ -420,7 +421,6 @@ fs_info::update (PUNICODE_STRING upath, HANDLE in_vol)
|
||||||
{
|
{
|
||||||
debug_printf ("Cannot access path %S, status %08lx",
|
debug_printf ("Cannot access path %S, status %08lx",
|
||||||
attr.ObjectName, status);
|
attr.ObjectName, status);
|
||||||
clear ();
|
|
||||||
NtClose (vol);
|
NtClose (vol);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -450,8 +450,6 @@ fs_info::update (PUNICODE_STRING upath, HANDLE in_vol)
|
||||||
{
|
{
|
||||||
debug_printf ("Cannot get volume attributes (%S), %08lx",
|
debug_printf ("Cannot get volume attributes (%S), %08lx",
|
||||||
attr.ObjectName, status);
|
attr.ObjectName, status);
|
||||||
has_buggy_open (false);
|
|
||||||
flags (0);
|
|
||||||
if (!in_vol)
|
if (!in_vol)
|
||||||
NtClose (vol);
|
NtClose (vol);
|
||||||
return false;
|
return false;
|
||||||
|
@ -506,23 +504,38 @@ fs_info::update (PUNICODE_STRING upath, HANDLE in_vol)
|
||||||
is_samba (RtlEqualUnicodeString (&fsname, &testname, FALSE)
|
is_samba (RtlEqualUnicodeString (&fsname, &testname, FALSE)
|
||||||
&& FS_IS_SAMBA);
|
&& FS_IS_SAMBA);
|
||||||
|
|
||||||
is_netapp (!is_samba ()
|
if (!is_samba ())
|
||||||
&& RtlEqualUnicodeString (&fsname, &testname, FALSE)
|
{
|
||||||
|
is_netapp (RtlEqualUnicodeString (&fsname, &testname, FALSE)
|
||||||
&& FS_IS_NETAPP_DATAONTAP);
|
&& FS_IS_NETAPP_DATAONTAP);
|
||||||
|
|
||||||
|
RtlInitUnicodeString (&testname, L"NFS");
|
||||||
|
is_nfs (RtlEqualUnicodeString (&fsname, &testname, FALSE));
|
||||||
|
|
||||||
|
if (!is_nfs ())
|
||||||
|
{
|
||||||
|
/* Known remote file systems which can't handle calls to
|
||||||
|
NtQueryDirectoryFile(FileIdBothDirectoryInformation) */
|
||||||
|
RtlInitUnicodeString (&testname, L"UNIXFS");
|
||||||
|
has_buggy_fileid_dirinfo (RtlEqualUnicodeString (&fsname,
|
||||||
|
&testname,
|
||||||
|
FALSE));
|
||||||
|
|
||||||
|
/* Known remote file systems with buggy open calls. Further
|
||||||
|
explanation in fhandler.cc (fhandler_disk_file::open). */
|
||||||
|
RtlInitUnicodeString (&testname, L"SUNWNFS");
|
||||||
|
has_buggy_open (RtlEqualUnicodeString (&fsname, &testname,
|
||||||
|
FALSE));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
is_ntfs (RtlEqualUnicodeString (&fsname, &testname, FALSE)
|
is_ntfs (RtlEqualUnicodeString (&fsname, &testname, FALSE)
|
||||||
&& !is_samba () && !is_netapp ());
|
&& !is_samba () && !is_netapp ());
|
||||||
RtlInitUnicodeString (&testname, L"NFS");
|
|
||||||
is_nfs (RtlEqualUnicodeString (&fsname, &testname, FALSE));
|
|
||||||
is_cdrom (ffdi.DeviceType == FILE_DEVICE_CD_ROM);
|
is_cdrom (ffdi.DeviceType == FILE_DEVICE_CD_ROM);
|
||||||
|
|
||||||
has_acls (flags () & FS_PERSISTENT_ACLS);
|
has_acls (flags () & FS_PERSISTENT_ACLS);
|
||||||
hasgood_inode (((flags () & FILE_PERSISTENT_ACLS) && !is_netapp ())
|
hasgood_inode (((flags () & FILE_PERSISTENT_ACLS) && !is_netapp ())
|
||||||
|| is_nfs ());
|
|| is_nfs ());
|
||||||
/* Known file systems with buggy open calls. Further explanation
|
|
||||||
in fhandler.cc (fhandler_disk_file::open). */
|
|
||||||
RtlInitUnicodeString (&testname, L"SUNWNFS");
|
|
||||||
has_buggy_open (RtlEqualUnicodeString (&fsname, &testname, FALSE));
|
|
||||||
/* Case sensitivity is supported if FILE_CASE_SENSITIVE_SEARCH is set,
|
/* Case sensitivity is supported if FILE_CASE_SENSITIVE_SEARCH is set,
|
||||||
except on Samba which handles Windows clients case insensitive.
|
except on Samba which handles Windows clients case insensitive.
|
||||||
NFS doesn't set the FILE_CASE_SENSITIVE_SEARCH flag but is case
|
NFS doesn't set the FILE_CASE_SENSITIVE_SEARCH flag but is case
|
||||||
|
|
|
@ -93,6 +93,7 @@ struct fs_info
|
||||||
ULONG name_len; /* MaximumComponentNameLength */
|
ULONG name_len; /* MaximumComponentNameLength */
|
||||||
unsigned is_remote_drive : 1;
|
unsigned is_remote_drive : 1;
|
||||||
unsigned has_buggy_open : 1;
|
unsigned has_buggy_open : 1;
|
||||||
|
unsigned has_buggy_fileid_dirinfo : 1;
|
||||||
unsigned has_acls : 1;
|
unsigned has_acls : 1;
|
||||||
unsigned hasgood_inode : 1;
|
unsigned hasgood_inode : 1;
|
||||||
unsigned caseinsensitive : 1;
|
unsigned caseinsensitive : 1;
|
||||||
|
@ -113,6 +114,7 @@ struct fs_info
|
||||||
IMPLEMENT_STATUS_FLAG (ULONG, name_len)
|
IMPLEMENT_STATUS_FLAG (ULONG, name_len)
|
||||||
IMPLEMENT_STATUS_FLAG (bool, is_remote_drive)
|
IMPLEMENT_STATUS_FLAG (bool, is_remote_drive)
|
||||||
IMPLEMENT_STATUS_FLAG (bool, has_buggy_open)
|
IMPLEMENT_STATUS_FLAG (bool, has_buggy_open)
|
||||||
|
IMPLEMENT_STATUS_FLAG (bool, has_buggy_fileid_dirinfo)
|
||||||
IMPLEMENT_STATUS_FLAG (bool, has_acls)
|
IMPLEMENT_STATUS_FLAG (bool, has_acls)
|
||||||
IMPLEMENT_STATUS_FLAG (bool, hasgood_inode)
|
IMPLEMENT_STATUS_FLAG (bool, hasgood_inode)
|
||||||
IMPLEMENT_STATUS_FLAG (bool, caseinsensitive)
|
IMPLEMENT_STATUS_FLAG (bool, caseinsensitive)
|
||||||
|
@ -149,6 +151,7 @@ class path_conv
|
||||||
bool isgood_inode (__ino64_t ino) const;
|
bool isgood_inode (__ino64_t ino) const;
|
||||||
int has_symlinks () const {return path_flags & PATH_HAS_SYMLINKS;}
|
int has_symlinks () const {return path_flags & PATH_HAS_SYMLINKS;}
|
||||||
int has_buggy_open () const {return fs.has_buggy_open ();}
|
int has_buggy_open () const {return fs.has_buggy_open ();}
|
||||||
|
int has_buggy_fileid_dirinfo () const {return fs.has_buggy_fileid_dirinfo ();}
|
||||||
int binmode () const
|
int binmode () const
|
||||||
{
|
{
|
||||||
if (path_flags & PATH_BINARY)
|
if (path_flags & PATH_BINARY)
|
||||||
|
|
Loading…
Reference in New Issue