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();