diff options
author | dbeam <dbeam@chromium.org> | 2015-04-07 19:27:25 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-08 02:27:58 +0000 |
commit | 250544bb29f1ce99448f55814800ae1d1059774c (patch) | |
tree | 73c87fa32954a1acd003eee683bd098dd0b956dc | |
parent | 940af5f4f4c4226d68ca7e35905329c47a07ba54 (diff) | |
download | chromium_src-250544bb29f1ce99448f55814800ae1d1059774c.zip chromium_src-250544bb29f1ce99448f55814800ae1d1059774c.tar.gz chromium_src-250544bb29f1ce99448f55814800ae1d1059774c.tar.bz2 |
Detect seek penalties on Linux/ChromeOS.
This wont work any time some fancy /dev setup is going on.
R=thestig@chromium.org
BUG=463209
NOTRY=true
Review URL: https://codereview.chromium.org/1057093003
Cr-Commit-Position: refs/heads/master@{#323865}
(cherry picked from commit 022b19cb4b2f4e7a0f56ad92198b050b76e4415f)
Review URL: https://codereview.chromium.org/1065793002
Cr-Commit-Position: refs/branch-heads/2357@{#14}
Cr-Branched-From: 59d4494849b405682265ed5d3f5164573b9a939b-refs/heads/master@{#323860}
-rw-r--r-- | chrome/browser/metrics/drive_metrics_provider.cc | 9 | ||||
-rw-r--r-- | chrome/browser/metrics/drive_metrics_provider_linux.cc | 60 | ||||
-rw-r--r-- | chrome/browser/metrics/drive_metrics_provider_mac.mm | 12 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 |
4 files changed, 74 insertions, 9 deletions
diff --git a/chrome/browser/metrics/drive_metrics_provider.cc b/chrome/browser/metrics/drive_metrics_provider.cc index 5873583..4b88849 100644 --- a/chrome/browser/metrics/drive_metrics_provider.cc +++ b/chrome/browser/metrics/drive_metrics_provider.cc @@ -40,15 +40,6 @@ void DriveMetricsProvider::GetDriveMetrics(const base::Closure& done) { DriveMetricsProvider::SeekPenaltyResponse::SeekPenaltyResponse() : success(false) {} -#if !(defined(OS_WIN) || defined(OS_ANDROID) || defined(OS_IOS)) -// static -bool DriveMetricsProvider::HasSeekPenalty(const base::FilePath& path, - bool* has_seek_penalty) { - // TODO(dbeam): implement on more platforms. - return false; -} -#endif - // static DriveMetricsProvider::DriveMetrics DriveMetricsProvider::GetDriveMetricsOnFileThread() { diff --git a/chrome/browser/metrics/drive_metrics_provider_linux.cc b/chrome/browser/metrics/drive_metrics_provider_linux.cc new file mode 100644 index 0000000..93c37a0 --- /dev/null +++ b/chrome/browser/metrics/drive_metrics_provider_linux.cc @@ -0,0 +1,60 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/metrics/drive_metrics_provider.h" + +#include <linux/kdev_t.h> // For MAJOR()/MINOR(). +#include <sys/stat.h> +#include <string> + +#include "base/files/file.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/strings/stringprintf.h" + +#if defined(OS_CHROMEOS) +#include "base/sys_info.h" +#endif + +namespace { + +// See http://www.kernel.org/doc/Documentation/devices.txt for more info. +const int kFirstScsiMajorNumber = 8; +const int kPartitionsPerScsiDevice = 16; +const char kRotationalFormat[] = "/sys/block/sd%c/queue/rotational"; + +} // namespace + +// static +bool DriveMetricsProvider::HasSeekPenalty(const base::FilePath& path, + bool* has_seek_penalty) { +#if defined(OS_CHROMEOS) + std::string board = base::SysInfo::GetLsbReleaseBoard(); + if (board != "unknown" && board != "parrot") { + // All ChromeOS devices have SSDs. Except some parrots. + *has_seek_penalty = false; + return true; + } +#endif + + base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_READ); + if (!file.IsValid()) + return false; + + struct stat path_stat; + int error = fstat(file.GetPlatformFile(), &path_stat); + if (error < 0 || MAJOR(path_stat.st_dev) != kFirstScsiMajorNumber) { + // TODO(dbeam): support more SCSI major numbers (e.g. /dev/sdq+) and LVM? + return false; + } + + char sdX = 'a' + MINOR(path_stat.st_dev) / kPartitionsPerScsiDevice; + std::string rotational_path = base::StringPrintf(kRotationalFormat, sdX); + std::string rotates; + if (!base::ReadFileToString(base::FilePath(rotational_path), &rotates)) + return false; + + *has_seek_penalty = rotates.substr(0, 1) == "1"; + return true; +} diff --git a/chrome/browser/metrics/drive_metrics_provider_mac.mm b/chrome/browser/metrics/drive_metrics_provider_mac.mm new file mode 100644 index 0000000..ff98485 --- /dev/null +++ b/chrome/browser/metrics/drive_metrics_provider_mac.mm @@ -0,0 +1,12 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/metrics/drive_metrics_provider.h" + +// static +bool DriveMetricsProvider::HasSeekPenalty(const base::FilePath& path, + bool* has_seek_penalty) { + // TODO(dbeam): implement. + return false; +} diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index e3fa309..7b4811d 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -1735,6 +1735,8 @@ 'browser/metrics/drive_metrics_provider.cc', 'browser/metrics/drive_metrics_provider_android.cc', 'browser/metrics/drive_metrics_provider_ios.mm', + 'browser/metrics/drive_metrics_provider_linux.cc', + 'browser/metrics/drive_metrics_provider_mac.mm', 'browser/metrics/drive_metrics_provider_win.cc', 'browser/metrics/drive_metrics_provider.h', 'browser/metrics/field_trial_synchronizer.cc', |