hrev48138 adds 2 changesets to branch 'master' old head: 33d3467372491ddfcb8844ef4dd83defd7ee2a8a new head: 4ed39e6a62d82721004656c5a1ecf19cb8e73e75 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=4ed39e6+%5E33d3467 ---------------------------------------------------------------------------- 04dbe5b: safemode.h: make it usable from C code. 4ed39e6: 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. [ Adrien Destugues <pulkomandy@xxxxxxxxx> ] ---------------------------------------------------------------------------- 4 files changed, 21 insertions(+), 5 deletions(-) .../private/kernel/disk_device_manager/KPartition.h | 1 + headers/private/kernel/safemode.h | 8 ++++---- src/system/kernel/disk_device_manager/KPartition.cpp | 14 ++++++++++++++ .../disk_device_manager/ddm_userland_interface.cpp | 3 ++- ############################################################################ Commit: 04dbe5b1c5241d34cca45b27d4c7cefc6639505f URL: http://cgit.haiku-os.org/haiku/commit/?id=04dbe5b Author: Adrien Destugues <pulkomandy@xxxxxxxxx> Date: Tue Oct 28 22:52:22 2014 UTC safemode.h: make it usable from C code. ---------------------------------------------------------------------------- diff --git a/headers/private/kernel/safemode.h b/headers/private/kernel/safemode.h index bcf5751..461f1b0 100644 --- a/headers/private/kernel/safemode.h +++ b/headers/private/kernel/safemode.h @@ -24,10 +24,10 @@ status_t get_safemode_option(const char* parameter, char* buffer, bool get_safemode_boolean(const char* parameter, bool defaultValue); // before driver_settings_init() has been called (limited parsing support) -status_t get_safemode_option_early(kernel_args* args, const char* parameter, - char* buffer, size_t* _bufferSize); -bool get_safemode_boolean_early(kernel_args* args, const char* parameter, - bool defaultValue); +status_t get_safemode_option_early(struct kernel_args* args, + const char* parameter, char* buffer, size_t* _bufferSize); +bool get_safemode_boolean_early(struct kernel_args* args, + const char* parameter, bool defaultValue); status_t _user_get_safemode_option(const char* parameter, char* buffer, size_t* _bufferSize); ############################################################################ Revision: hrev48138 Commit: 4ed39e6a62d82721004656c5a1ecf19cb8e73e75 URL: http://cgit.haiku-os.org/haiku/commit/?id=4ed39e6 Author: Adrien Destugues <pulkomandy@xxxxxxxxx> Date: Tue Oct 28 22:52:57 2014 UTC Ticket: https://dev.haiku-os.org/ticket/8827 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. ---------------------------------------------------------------------------- diff --git a/headers/private/kernel/disk_device_manager/KPartition.h b/headers/private/kernel/disk_device_manager/KPartition.h index 7ff04da..577d23a 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 878ab99..cfe4263 100644 --- a/src/system/kernel/disk_device_manager/KPartition.cpp +++ b/src/system/kernel/disk_device_manager/KPartition.cpp @@ -560,6 +560,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 { return (fPartitionData.flags & B_PARTITION_IS_DEVICE) != 0; 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 cadb0bd..c445ea8 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();