Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(116)

Unified Diff: chromeos/disks/disk_mount_manager.cc

Issue 12537016: Add callback to DiskMountManager::UnmountPath (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chromeos/disks/disk_mount_manager.cc
diff --git a/chromeos/disks/disk_mount_manager.cc b/chromeos/disks/disk_mount_manager.cc
index 1d018b56b8f63c93643ba4a9662f0bd3d9557f0d..8f0223a84b18c102d365df873c6f2c273f6cabf6 100644
--- a/chromeos/disks/disk_mount_manager.cc
+++ b/chromeos/disks/disk_mount_manager.cc
@@ -83,14 +83,17 @@ class DiskMountManagerImpl : public DiskMountManager {
// DiskMountManager override.
virtual void UnmountPath(const std::string& mount_path,
- UnmountOptions options) OVERRIDE {
+ UnmountOptions options,
+ const UnmountPathCallback& callback) OVERRIDE {
UnmountChildMounts(mount_path);
cros_disks_client_->Unmount(mount_path, options,
base::Bind(&DiskMountManagerImpl::OnUnmountPath,
weak_ptr_factory_.GetWeakPtr(),
+ callback,
true),
base::Bind(&DiskMountManagerImpl::OnUnmountPath,
weak_ptr_factory_.GetWeakPtr(),
+ callback,
false));
}
@@ -111,15 +114,11 @@ class DiskMountManagerImpl : public DiskMountManager {
return;
}
- if (formatting_pending_.find(device_path) != formatting_pending_.end()) {
- LOG(ERROR) << "Formatting is already pending: " << mount_path;
- OnFormatDevice(device_path, false);
- return;
- }
-
- // Formatting process continues, after unmounting.
- formatting_pending_.insert(device_path);
- UnmountPath(disk->second->mount_path(), UNMOUNT_OPTIONS_NONE);
+ UnmountPath(disk->second->mount_path(),
+ UNMOUNT_OPTIONS_NONE,
+ base::Bind(&DiskMountManagerImpl::OnUnmountPathForFormat,
+ weak_ptr_factory_.GetWeakPtr(),
+ device_path));
}
// DiskMountManager override.
@@ -258,7 +257,10 @@ class DiskMountManagerImpl : public DiskMountManager {
++it) {
if (StartsWithASCII(it->second.source_path, mount_path,
true /*case sensitive*/)) {
- UnmountPath(it->second.mount_path, UNMOUNT_OPTIONS_NONE);
+ // TODO(tbarzic): Handle the case where this fails.
+ UnmountPath(it->second.mount_path,
+ UNMOUNT_OPTIONS_NONE,
+ UnmountPathCallback());
}
}
}
@@ -270,7 +272,7 @@ class DiskMountManagerImpl : public DiskMountManager {
const std::string& mount_path) {
if (success) {
// Do standard processing for Unmount event.
- OnUnmountPath(true, mount_path);
+ OnUnmountPath(UnmountPathCallback(), true, mount_path);
LOG(INFO) << mount_path << " unmounted.";
}
// This is safe as long as all callbacks are called on the same thread as
@@ -328,11 +330,16 @@ class DiskMountManagerImpl : public DiskMountManager {
}
// Callback for UnmountPath.
- void OnUnmountPath(bool success, const std::string& mount_path) {
+ void OnUnmountPath(const UnmountPathCallback& callback,
+ bool success,
+ const std::string& mount_path) {
MountPointMap::iterator mount_points_it = mount_points_.find(mount_path);
if (mount_points_it == mount_points_.end())
return;
+ if (!callback.is_null())
+ callback.Run(success ? MOUNT_ERROR_NONE : MOUNT_ERROR_INTERNAL);
+
NotifyMountStatusUpdate(
UNMOUNTING,
success ? MOUNT_ERROR_NONE : MOUNT_ERROR_INTERNAL,
@@ -351,16 +358,15 @@ class DiskMountManagerImpl : public DiskMountManager {
if (success)
disk_iter->second->clear_mount_path();
}
+ }
- FormatTaskSet::iterator format_iter = formatting_pending_.find(path);
- // Check if there is a formatting scheduled.
- if (format_iter != formatting_pending_.end()) {
- formatting_pending_.erase(format_iter);
- if (success && disk_iter != disks_.end()) {
- FormatUnmountedDevice(path);
- } else {
- OnFormatDevice(path, false);
- }
+ void OnUnmountPathForFormat(const std::string& device_path,
+ MountError error_code) {
+ if (error_code == MOUNT_ERROR_NONE &&
+ disks_.find(device_path) != disks_.end()) {
+ FormatUnmountedDevice(device_path);
+ } else {
+ OnFormatDevice(device_path, false);
}
}
@@ -594,14 +600,6 @@ class DiskMountManagerImpl : public DiskMountManager {
typedef std::set<std::string> SystemPathPrefixSet;
SystemPathPrefixSet system_path_prefixes_;
- // A map from device path (e.g. /sys/devices/pci0000:00/.../sdb/sdb1)) to file
- // path (e.g. /dev/sdb).
- // Devices in this map are supposed to be formatted, but are currently waiting
- // to be unmounted. When device is in this map, the formatting process HAVEN'T
- // started yet.
- typedef std::set<std::string> FormatTaskSet;
- FormatTaskSet formatting_pending_;
-
base::WeakPtrFactory<DiskMountManagerImpl> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(DiskMountManagerImpl);

Powered by Google App Engine
This is Rietveld 408576698