[haiku-commits] haiku: hrev48138 - headers/private/kernel src/system/kernel/disk_device_manager

  • From: pulkomandy@xxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 28 Oct 2014 23:54:50 +0100 (CET)

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


Other related posts: