From 4ed39e6a62d82721004656c5a1ecf19cb8e73e75 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Tue, 28 Oct 2014 23:52:57 +0100 Subject: [PATCH] disk device manager: check that partitions are unmounted before uninitializing. when uninitializing a partition or a disk (removing the partition table), check that all partitions from that table are unmounted, as they are about to become invalid. Fixes #8827. --- .../kernel/disk_device_manager/KPartition.h | 1 + .../kernel/disk_device_manager/KPartition.cpp | 14 ++++++++++++++ .../disk_device_manager/ddm_userland_interface.cpp | 3 ++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/headers/private/kernel/disk_device_manager/KPartition.h b/headers/private/kernel/disk_device_manager/KPartition.h index 7ff04da774..577d23a893 100644 --- a/headers/private/kernel/disk_device_manager/KPartition.h +++ b/headers/private/kernel/disk_device_manager/KPartition.h @@ -85,6 +85,7 @@ public: bool ContainsPartitioningSystem() const; bool IsReadOnly() const; bool IsMounted() const; + bool IsChildMounted(); bool IsDevice() const; diff --git a/src/system/kernel/disk_device_manager/KPartition.cpp b/src/system/kernel/disk_device_manager/KPartition.cpp index 878ab99a79..cfe4263c3a 100644 --- a/src/system/kernel/disk_device_manager/KPartition.cpp +++ b/src/system/kernel/disk_device_manager/KPartition.cpp @@ -559,6 +559,20 @@ KPartition::IsMounted() const } +bool +KPartition::IsChildMounted() +{ + struct IsMountedVisitor : KPartitionVisitor { + virtual bool VisitPre(KPartition* partition) + { + return partition->IsMounted(); + } + } checkVisitor; + + return VisitEachDescendant(&checkVisitor) != NULL; +} + + bool KPartition::IsDevice() const { diff --git a/src/system/kernel/disk_device_manager/ddm_userland_interface.cpp b/src/system/kernel/disk_device_manager/ddm_userland_interface.cpp index cadb0bd0b4..c445ea8b05 100644 --- a/src/system/kernel/disk_device_manager/ddm_userland_interface.cpp +++ b/src/system/kernel/disk_device_manager/ddm_userland_interface.cpp @@ -1249,7 +1249,8 @@ _user_uninitialize_partition(partition_id partitionID, int32* _changeCounter) if (!partition->CheckAndMarkBusy(true)) return B_BUSY; - // TODO: We should also check, if any partition is mounted! + if (partition->IsMounted() || partition->IsChildMounted()) + return B_BAD_DATA; KDiskSystem* diskSystem = partition->DiskSystem();