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

Side by Side Diff: chromeos/disks/disk_mount_manager.cc

Issue 2230713003: Store correct read-only flag of mounted disks. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromeos/disks/disk_mount_manager.h" 5 #include "chromeos/disks/disk_mount_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <set> 10 #include <set>
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 } 80 }
81 } 81 }
82 cros_disks_client_->Mount( 82 cros_disks_client_->Mount(
83 source_path, source_format, mount_label, access_mode, 83 source_path, source_format, mount_label, access_mode,
84 // When succeeds, OnMountCompleted will be called by 84 // When succeeds, OnMountCompleted will be called by
85 // "MountCompleted" signal instead. 85 // "MountCompleted" signal instead.
86 base::Bind(&base::DoNothing), 86 base::Bind(&base::DoNothing),
87 base::Bind(&DiskMountManagerImpl::OnMountCompleted, 87 base::Bind(&DiskMountManagerImpl::OnMountCompleted,
88 weak_ptr_factory_.GetWeakPtr(), 88 weak_ptr_factory_.GetWeakPtr(),
89 MountEntry(MOUNT_ERROR_INTERNAL, source_path, type, ""))); 89 MountEntry(MOUNT_ERROR_INTERNAL, source_path, type, "")));
90
91 // Record the access mode option passed to CrosDisks.
92 // This is needed because CrosDisks service methods doesn't return the info
93 // via DBus.
94 access_modes_.insert(std::make_pair(mount_label, access_mode));
satorux1 2016/08/12 02:47:51 At this point, mount isn't complete yet. How about
yamaguchi 2016/08/15 15:32:48 OnMountCompleted is invoked by the signal from DBu
90 } 95 }
91 96
92 // DiskMountManager override. 97 // DiskMountManager override.
93 void UnmountPath(const std::string& mount_path, 98 void UnmountPath(const std::string& mount_path,
94 UnmountOptions options, 99 UnmountOptions options,
95 const UnmountPathCallback& callback) override { 100 const UnmountPathCallback& callback) override {
96 UnmountChildMounts(mount_path); 101 UnmountChildMounts(mount_path);
97 cros_disks_client_->Unmount(mount_path, options, 102 cros_disks_client_->Unmount(mount_path, options,
98 base::Bind(&DiskMountManagerImpl::OnUnmountPath, 103 base::Bind(&DiskMountManagerImpl::OnUnmountPath,
99 weak_ptr_factory_.GetWeakPtr(), 104 weak_ptr_factory_.GetWeakPtr(),
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 mount_info.mount_type == MOUNT_TYPE_DEVICE && 349 mount_info.mount_type == MOUNT_TYPE_DEVICE &&
345 !mount_info.source_path.empty() && 350 !mount_info.source_path.empty() &&
346 !mount_info.mount_path.empty()) { 351 !mount_info.mount_path.empty()) {
347 DiskMap::iterator iter = disks_.find(mount_info.source_path); 352 DiskMap::iterator iter = disks_.find(mount_info.source_path);
348 if (iter == disks_.end()) { 353 if (iter == disks_.end()) {
349 // disk might have been removed by now? 354 // disk might have been removed by now?
350 return; 355 return;
351 } 356 }
352 Disk* disk = iter->second; 357 Disk* disk = iter->second;
353 DCHECK(disk); 358 DCHECK(disk);
359 // The is_read_only field in *disk may be incorrect when this is called
360 // from CrosDisksClientImpl::OnMountCompleted.
361 // Overwrite based on the access mode option that was passed when issuing
362 // mount command to the same mount path last time.
363 AccessModeMap::iterator it = access_modes_.find(disk->mount_path());
satorux1 2016/08/12 02:47:51 access_modes_'s keys are mount labels, but here, i
yamaguchi 2016/08/15 15:32:48 Good catch. We need to use device path instead of
364 if (it != access_modes_.end()) {
365 disk->set_read_only(it->second ==
366 chromeos::MOUNT_ACCESS_MODE_READ_ONLY);
367 }
satorux1 2016/08/12 02:47:52 If 'access_mode' is passed to OnMountCompleted(),
354 disk->set_mount_path(mount_info.mount_path); 368 disk->set_mount_path(mount_info.mount_path);
355 } 369 }
356 } 370 }
357 371
358 // Callback for UnmountPath. 372 // Callback for UnmountPath.
359 void OnUnmountPath(const UnmountPathCallback& callback, 373 void OnUnmountPath(const UnmountPathCallback& callback,
360 bool success, 374 bool success,
361 const std::string& mount_path) { 375 const std::string& mount_path) {
362 MountPointMap::iterator mount_points_it = mount_points_.find(mount_path); 376 MountPointMap::iterator mount_points_it = mount_points_.find(mount_path);
363 if (mount_points_it == mount_points_.end()) { 377 if (mount_points_it == mount_points_.end()) {
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 disk_info.uuid(), 474 disk_info.uuid(),
461 FindSystemPathPrefix(disk_info.system_path()), 475 FindSystemPathPrefix(disk_info.system_path()),
462 disk_info.device_type(), 476 disk_info.device_type(),
463 disk_info.total_size_in_bytes(), 477 disk_info.total_size_in_bytes(),
464 disk_info.is_drive(), 478 disk_info.is_drive(),
465 disk_info.is_read_only(), 479 disk_info.is_read_only(),
466 disk_info.has_media(), 480 disk_info.has_media(),
467 disk_info.on_boot_device(), 481 disk_info.on_boot_device(),
468 disk_info.on_removable_device(), 482 disk_info.on_removable_device(),
469 disk_info.is_hidden()); 483 disk_info.is_hidden());
484 // If the device was mounted by the instance, apply recorded parameter.
485 AccessModeMap::iterator mount_option =
satorux1 2016/08/12 02:47:52 mount_option -> access_mode?
yamaguchi 2016/08/15 15:32:48 Done.
486 access_modes_.find(disk->mount_path());
487 if (mount_option != access_modes_.end()) {
488 disk->set_read_only(mount_option->second ==
489 chromeos::MOUNT_ACCESS_MODE_READ_ONLY);
490 }
satorux1 2016/08/12 02:47:52 another approach: instead of introducing access_mo
yamaguchi 2016/08/15 15:32:48 The previous disk will be available only when this
470 disks_.insert(std::make_pair(disk_info.device_path(), disk)); 491 disks_.insert(std::make_pair(disk_info.device_path(), disk));
471 NotifyDiskStatusUpdate(is_new ? DISK_ADDED : DISK_CHANGED, disk); 492 NotifyDiskStatusUpdate(is_new ? DISK_ADDED : DISK_CHANGED, disk);
472 } 493 }
473 494
474 // Part of EnsureMountInfoRefreshed(). Called after the list of devices are 495 // Part of EnsureMountInfoRefreshed(). Called after the list of devices are
475 // enumerated. 496 // enumerated.
476 void RefreshAfterEnumerateDevices(const std::vector<std::string>& devices) { 497 void RefreshAfterEnumerateDevices(const std::vector<std::string>& devices) {
477 std::set<std::string> current_device_set(devices.begin(), devices.end()); 498 std::set<std::string> current_device_set(devices.begin(), devices.end());
478 for (DiskMap::iterator iter = disks_.begin(); iter != disks_.end(); ) { 499 for (DiskMap::iterator iter = disks_.begin(); iter != disks_.end(); ) {
479 if (current_device_set.find(iter->first) == current_device_set.end()) { 500 if (current_device_set.find(iter->first) == current_device_set.end()) {
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 DiskMountManager::MountPointMap mount_points_; 648 DiskMountManager::MountPointMap mount_points_;
628 649
629 typedef std::set<std::string> SystemPathPrefixSet; 650 typedef std::set<std::string> SystemPathPrefixSet;
630 SystemPathPrefixSet system_path_prefixes_; 651 SystemPathPrefixSet system_path_prefixes_;
631 652
632 bool already_refreshed_; 653 bool already_refreshed_;
633 std::vector<EnsureMountInfoRefreshedCallback> refresh_callbacks_; 654 std::vector<EnsureMountInfoRefreshedCallback> refresh_callbacks_;
634 655
635 std::unique_ptr<SuspendUnmountManager> suspend_unmount_manager_; 656 std::unique_ptr<SuspendUnmountManager> suspend_unmount_manager_;
636 657
658 // Whether the instance attempted to mount a device in read-only mode for
659 // each mount label (not mount source).
660 typedef std::map<std::string, chromeos::MountAccessMode> AccessModeMap;
661 AccessModeMap access_modes_;
662
637 base::WeakPtrFactory<DiskMountManagerImpl> weak_ptr_factory_; 663 base::WeakPtrFactory<DiskMountManagerImpl> weak_ptr_factory_;
638 664
639 DISALLOW_COPY_AND_ASSIGN(DiskMountManagerImpl); 665 DISALLOW_COPY_AND_ASSIGN(DiskMountManagerImpl);
640 }; 666 };
641 667
642 } // namespace 668 } // namespace
643 669
644 DiskMountManager::Disk::Disk(const std::string& device_path, 670 DiskMountManager::Disk::Disk(const std::string& device_path,
645 const std::string& mount_path, 671 const std::string& mount_path,
646 const std::string& system_path, 672 const std::string& system_path,
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
757 VLOG(1) << "DiskMountManager Shutdown completed"; 783 VLOG(1) << "DiskMountManager Shutdown completed";
758 } 784 }
759 785
760 // static 786 // static
761 DiskMountManager* DiskMountManager::GetInstance() { 787 DiskMountManager* DiskMountManager::GetInstance() {
762 return g_disk_mount_manager; 788 return g_disk_mount_manager;
763 } 789 }
764 790
765 } // namespace disks 791 } // namespace disks
766 } // namespace chromeos 792 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698