summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2014-08-28 12:29:42 +0000
committerCorinna Vinschen <corinna@vinschen.de>2014-08-28 12:29:42 +0000
commitc51ce2447a7cce971500131011711fb499f5bbde (patch)
tree85054cc596020a037192fea1c46540e8877fc3a5
parentdd48219ba9f75b807d0e968e3545a764cabfe688 (diff)
downloadcygnal-c51ce2447a7cce971500131011711fb499f5bbde.tar.gz
cygnal-c51ce2447a7cce971500131011711fb499f5bbde.tar.bz2
cygnal-c51ce2447a7cce971500131011711fb499f5bbde.zip
* fhandler_disk_file.cc (fhandler_disk_file::fstatvfs): Try the
FileFsSizeInformation information class on filesystems choking on FileFsFullSizeInformation (I see you Netapp!)
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/fhandler_disk_file.cc20
2 files changed, 26 insertions, 0 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 913738861..2ff511b98 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,9 @@
+2014-08-28 Corinna Vinschen <corinna@vinschen.de>
+
+ * fhandler_disk_file.cc (fhandler_disk_file::fstatvfs): Try the
+ FileFsSizeInformation information class on filesystems choking on
+ FileFsFullSizeInformation (I see you Netapp!)
+
2014-08-27 Corinna Vinschen <corinna@vinschen.de>
* fhandler.h (fhandler_pty_slave::fch_open_handles): Add bool parameter
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc
index d71300268..a2ed1cfd1 100644
--- a/winsup/cygwin/fhandler_disk_file.cc
+++ b/winsup/cygwin/fhandler_disk_file.cc
@@ -800,6 +800,26 @@ fhandler_disk_file::fstatvfs (struct statvfs *sfs)
}
ret = 0;
}
+ else if (status == STATUS_INVALID_PARAMETER /* Netapp */
+ || status == STATUS_INVALID_INFO_CLASS)
+ {
+ FILE_FS_SIZE_INFORMATION fsi;
+ status = NtQueryVolumeInformationFile (fh, &io, &fsi, sizeof fsi,
+ FileFsSizeInformation);
+ if (NT_SUCCESS (status))
+ {
+ sfs->f_bsize = fsi.BytesPerSector * fsi.SectorsPerAllocationUnit;
+ sfs->f_frsize = sfs->f_bsize;
+ sfs->f_blocks = (fsblkcnt_t) fsi.TotalAllocationUnits.QuadPart;
+ sfs->f_bfree = sfs->f_bavail =
+ (fsblkcnt_t) fsi.AvailableAllocationUnits.QuadPart;
+ ret = 0;
+ }
+ else
+ debug_printf ("%y = NtQueryVolumeInformationFile"
+ "(%S, FileFsSizeInformation)",
+ status, pc.get_nt_native_path ());
+ }
else
debug_printf ("%y = NtQueryVolumeInformationFile"
"(%S, FileFsFullSizeInformation)",