Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2023-12-01 00:13:49 +0300
committerCorinna Vinschen <corinna@vinschen.de>2023-12-01 00:37:35 +0300
commit8b01c5d6903fbcbb14c52db45c12494b53493c5a (patch)
tree6b3a4cd5a541e77231f5b241f408f410c103a3c7 /winsup
parent61f49ada90b2541925d56183e91e7d57aad1547a (diff)
Cygwin: fs_info: check for SSD
During fs_info::update, check for the file being on an SSD. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/local_includes/mount.h4
-rw-r--r--winsup/cygwin/mount.cc14
2 files changed, 18 insertions, 0 deletions
diff --git a/winsup/cygwin/local_includes/mount.h b/winsup/cygwin/local_includes/mount.h
index 5bb84b976..57c89e010 100644
--- a/winsup/cygwin/local_includes/mount.h
+++ b/winsup/cygwin/local_includes/mount.h
@@ -69,6 +69,7 @@ class fs_info
ULONG name_len; /* MaximumComponentNameLength */
fs_info_type fs_type; /* Filesystem type */
unsigned is_remote_drive : 1;
+ unsigned is_ssd : 1;
unsigned has_acls : 1;
unsigned hasgood_inode : 1;
unsigned caseinsensitive : 1;
@@ -80,6 +81,8 @@ class fs_info
ULONG sernum; /* Volume Serial Number */
char fsn[80]; /* Windows filesystem name */
+ void check_ssd (HANDLE);
+
public:
void clear ()
{
@@ -93,6 +96,7 @@ class fs_info
IMPLEMENT_STATUS_FLAG (ULONG, samba_version)
IMPLEMENT_STATUS_FLAG (ULONG, name_len)
IMPLEMENT_STATUS_FLAG (bool, is_remote_drive)
+ IMPLEMENT_STATUS_FLAG (bool, is_ssd)
IMPLEMENT_STATUS_FLAG (bool, has_acls)
IMPLEMENT_STATUS_FLAG (bool, hasgood_inode)
IMPLEMENT_STATUS_FLAG (bool, caseinsensitive)
diff --git a/winsup/cygwin/mount.cc b/winsup/cygwin/mount.cc
index 13ace6250..9545d22e0 100644
--- a/winsup/cygwin/mount.cc
+++ b/winsup/cygwin/mount.cc
@@ -523,8 +523,22 @@ fs_info::update (PUNICODE_STRING upath, HANDLE in_vol)
caseinsensitive ((!(flags () & FILE_CASE_SENSITIVE_SEARCH) || is_samba ())
&& !is_nfs ());
+ /* Check for being an SSD */
+ if (!is_remote_drive () && !is_cdrom ())
+ {
+ /* Theoretically FileFsVolumeFlagsInformation would be sufficient,
+ but apparently it's not exposed into userspace. */
+ FILE_FS_SECTOR_SIZE_INFORMATION ffssi;
+
+ status = NtQueryVolumeInformationFile (vol, &io, &ffssi, sizeof ffssi,
+ FileFsSectorSizeInformation);
+ if (NT_SUCCESS (status))
+ is_ssd (!!(ffssi.Flags & SSINFO_FLAGS_NO_SEEK_PENALTY));
+ }
+
if (!in_vol)
NtClose (vol);
+
fsi_cache.add (hash, this);
return true;
}