OSDN Git Service

* fhandler_disk_file.cc (fhandler_disk_file::opendir): Don't try to
authorcorinna <corinna>
Fri, 23 May 2008 17:22:17 +0000 (17:22 +0000)
committercorinna <corinna>
Fri, 23 May 2008 17:22:17 +0000 (17:22 +0000)
use FileIdBothDirectoryInformation on NFS shares.  Fix comment to
explain why.
* path.cc (symlink_info::check): Reinstantiate no_ea.  Use in
erroneously changed condition.

winsup/cygwin/ChangeLog
winsup/cygwin/fhandler_disk_file.cc
winsup/cygwin/path.cc

index b8519de..b6e1b0a 100644 (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>
 
        * mount.cc (find_root_from_cygwin_dll): New function factored from
@@ -19,7 +27,7 @@
 
        * 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
        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.
        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
        compiler warning.
index 6fa6e53..66f1fcc 100644 (file)
@@ -1569,19 +1569,21 @@ fhandler_disk_file::opendir (int fd)
             FileIdBothDirectoryInformation only on filesystems supporting
             persistent ACLs, FileDirectoryInformation otherwise.
 
-            On older NFS clients (up to SFU 3.5), dangling symlinks
-            are hidden from directory queries, unless you use the
-            FileNamesInformation info class.  Nevertheless, we try
-            FileIdBothDirectoryInformation first.  On newer NFS clients
-            it works fine, on the older ones it returns "invalid info
-            class".  So we can stick to the above explained mechanism. */
+            NFS clients hide dangling symlinks from directory queries,
+            unless you use the FileNamesInformation info class.  
+            On newer NFS clients (>=Vista) FileIdBothDirectoryInformation
+            works fine, but only if the NFS share is mounted to a drive
+            letter.  TODO: We don't test that here for now, but it might
+            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 ())
            {
              dir->__flags |= dirent_set_d_ino;
-             if (wincap.has_fileid_dirinfo ())
-               dir->__flags |= dirent_get_d_ino;
              if (pc.fs_is_nfs ())
                dir->__flags |= dirent_nfs_d_ino;
+             else if (wincap.has_fileid_dirinfo ())
+               dir->__flags |= dirent_get_d_ino;
            }
        }
       if (fd >= 0)
index dd7ba44..30688a8 100644 (file)
@@ -2342,7 +2342,7 @@ symlink_info::check (char *path, const suffix_info *suffixes, unsigned opt,
   tp.u_get (&upath);
   InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE, NULL, NULL);
 
-  void *eabuf = &nfs_aol_ffei;
+  PVOID eabuf = &nfs_aol_ffei;
   ULONG easize = sizeof nfs_aol_ffei;
 
   while (suffix.next ())
@@ -2350,6 +2350,7 @@ symlink_info::check (char *path, const suffix_info *suffixes, unsigned opt,
       FILE_BASIC_INFORMATION fbi;
       NTSTATUS status;
       IO_STATUS_BLOCK io;
+      bool no_ea = false;
 
       error = 0;
       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? */
       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
             whith suffixes attached.  So we set eabuf/easize to 0 here once. */
          if (status == STATUS_EAS_NOT_SUPPORTED)
@@ -2380,8 +2382,7 @@ symlink_info::check (char *path, const suffix_info *suffixes, unsigned opt,
              eabuf = NULL;
              easize = 0;
            }
-         status = NtCreateFile (&h,
-                                READ_CONTROL | FILE_READ_ATTRIBUTES,
+         status = NtCreateFile (&h, READ_CONTROL | FILE_READ_ATTRIBUTES,
                                 &attr, &io, NULL, FILE_ATTRIBUTE_NORMAL,
                                 FILE_SHARE_VALID_FLAGS, FILE_OPEN,
                                 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
         NFS share, check if it's a symlink.  Only files can be symlinks
         (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);
          if (!res)