Shadow partition related changes:

* Fixed handling of the deletion (removal) of shadow partitions. Formerly
  the shadow partition corresponding to the disk device wasn't removed
  properly.
* Added a shadow_id field to the user_partition_data structure which
  contains the ID of the shadow partition, if it is one. The id field
  will hold the ID of the physical partition.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3974 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2003-07-15 01:00:24 +00:00
parent 3928ef46fd
commit 5d22fa967a
8 changed files with 74 additions and 15 deletions
@@ -36,6 +36,8 @@ public:
void WriteUnlock(); void WriteUnlock();
bool IsWriteLocked(); bool IsWriteLocked();
virtual bool PrepareForRemoval();
virtual void SetID(partition_id id); virtual void SetID(partition_id id);
virtual status_t PublishDevice(); virtual status_t PublishDevice();
@@ -63,6 +65,8 @@ public:
disk_device_data *DeviceData(); disk_device_data *DeviceData();
const disk_device_data *DeviceData() const; const disk_device_data *DeviceData() const;
status_t CreateShadowDevice(team_id team);
status_t DeleteShadowDevice();
void SetShadowOwner(team_id team); void SetShadowOwner(team_id team);
team_id ShadowOwner() const; team_id ShadowOwner() const;
@@ -133,7 +133,7 @@ public:
// Shadow Partition // Shadow Partition
virtual status_t CreateShadowPartition(); // creates a complete tree virtual status_t CreateShadowPartition(); // creates a complete tree
virtual void DeleteShadowPartition(); // deletes ... virtual void UnsetShadowPartition(bool doDelete);
virtual KShadowPartition *ShadowPartition() const = 0; virtual KShadowPartition *ShadowPartition() const = 0;
virtual bool IsShadowPartition() const = 0; virtual bool IsShadowPartition() const = 0;
virtual KPhysicalPartition *PhysicalPartition() const = 0; virtual KPhysicalPartition *PhysicalPartition() const = 0;
@@ -153,7 +153,8 @@ public:
void SetContentCookie(void *cookie); void SetContentCookie(void *cookie);
void *ContentCookie() const; void *ContentCookie() const;
void WriteUserData(UserDataWriter &writer, user_partition_data *data); virtual void WriteUserData(UserDataWriter &writer,
user_partition_data *data);
virtual void Dump(bool deep, int32 level); virtual void Dump(bool deep, int32 level);
@@ -34,7 +34,7 @@ public:
// Shadow Partition // Shadow Partition
virtual status_t CreateShadowPartition(); // creates a complete tree virtual status_t CreateShadowPartition(); // creates a complete tree
virtual void DeleteShadowPartition(); // deletes ... virtual void UnsetShadowPartition(bool doDelete);
virtual KShadowPartition *ShadowPartition() const; virtual KShadowPartition *ShadowPartition() const;
virtual bool IsShadowPartition() const; virtual bool IsShadowPartition() const;
virtual KPhysicalPartition *PhysicalPartition() const; virtual KPhysicalPartition *PhysicalPartition() const;
@@ -29,6 +29,9 @@ public:
void SyncWithPhysicalPartition(); void SyncWithPhysicalPartition();
virtual void WriteUserData(UserDataWriter &writer,
user_partition_data *data);
virtual void Dump(bool deep, int32 level); virtual void Dump(bool deep, int32 level);
protected: protected:
@@ -161,6 +161,15 @@ KDiskDevice::IsWriteLocked()
return fLocker.IsWriteLocked(); return fLocker.IsWriteLocked();
} }
// PrepareForRemoval
bool
KDiskDevice::PrepareForRemoval()
{
if (ShadowOwner() >= 0)
DeleteShadowDevice();
return KPhysicalPartition::PrepareForRemoval();
}
// SetID // SetID
void void
KDiskDevice::SetID(partition_id id) KDiskDevice::SetID(partition_id id)
@@ -284,6 +293,30 @@ KDiskDevice::DeviceData() const
return &fDeviceData; return &fDeviceData;
} }
// CreateShadowDevice
status_t
KDiskDevice::CreateShadowDevice(team_id team)
{
if (fShadowOwner >= 0 || team < 0 || !HasMedia())
return B_BAD_VALUE;
// create the shadow partitions
status_t error = CreateShadowPartition();
if (error == B_OK)
SetShadowOwner(team);
return error;
}
// DeleteShadowDevice
status_t
KDiskDevice::DeleteShadowDevice()
{
if (fShadowOwner < 0)
return B_BAD_VALUE;
UnsetShadowPartition(true);
SetShadowOwner(-1);
return B_OK;
}
// SetShadowOwner // SetShadowOwner
void void
KDiskDevice::SetShadowOwner(team_id team) KDiskDevice::SetShadowOwner(team_id team)
@@ -658,9 +658,9 @@ KPartition::CreateShadowPartition()
return B_ERROR; return B_ERROR;
} }
// DeleteShadowPartition // UnsetShadowPartition
void void
KPartition::DeleteShadowPartition() KPartition::UnsetShadowPartition(bool doDelete)
{ {
// implemented by derived classes // implemented by derived classes
} }
@@ -743,6 +743,7 @@ KPartition::WriteUserData(UserDataWriter &writer, user_partition_data *data)
// fill in data // fill in data
if (data) { if (data) {
data->id = ID(); data->id = ID();
data->shadow_id = -1;
data->offset = Offset(); data->offset = Offset();
data->size = Size(); data->size = Size();
data->block_size = BlockSize(); data->block_size = BlockSize();
@@ -42,7 +42,7 @@ KPhysicalPartition::PrepareForRemoval()
{ {
bool result = KPartition::PrepareForRemoval(); bool result = KPartition::PrepareForRemoval();
if (result) { if (result) {
DeleteShadowPartition(); UnsetShadowPartition(false);
UnpublishDevice(); UnpublishDevice();
} }
return result; return result;
@@ -179,29 +179,31 @@ KPhysicalPartition::CreateShadowPartition()
// cleanup on error // cleanup on error
if (error != B_OK) { if (error != B_OK) {
for (int32 k = 0; k <= i; i++) for (int32 k = 0; k <= i; i++)
ChildAt(k)->DeleteShadowPartition(); ChildAt(k)->UnsetShadowPartition(true);
DeleteShadowPartition(); UnsetShadowPartition(true);
return error; return error;
} }
} }
return B_OK; return B_OK;
} }
// DeleteShadowPartition // UnsetShadowPartition
void void
KPhysicalPartition::DeleteShadowPartition() KPhysicalPartition::UnsetShadowPartition(bool doDelete)
{ {
if (!fShadowPartition) if (!fShadowPartition)
return; return;
// delete children's shadows // unset children's shadows
for (int32 i = 0; KPartition *child = ChildAt(i); i++) for (int32 i = 0; KPartition *child = ChildAt(i); i++)
child->DeleteShadowPartition(); child->UnsetShadowPartition(false);
// delete the thing // unset the thing
KDiskDeviceManager *manager = KDiskDeviceManager::Default(); KDiskDeviceManager *manager = KDiskDeviceManager::Default();
if (ManagerLocker locker = manager) { if (ManagerLocker locker = manager) {
fShadowPartition->UnsetPhysicalPartition(); fShadowPartition->UnsetPhysicalPartition();
if (doDelete) {
PartitionRegistrar _(fShadowPartition); PartitionRegistrar _(fShadowPartition);
manager->PartitionRemoved(fShadowPartition); manager->PartitionRemoved(fShadowPartition);
}
fShadowPartition = NULL; fShadowPartition = NULL;
} }
} }
@@ -10,6 +10,7 @@
#include <Drivers.h> #include <Drivers.h>
#include <Errors.h> #include <Errors.h>
#include "ddm_userland_interface.h"
#include "KDiskDevice.h" #include "KDiskDevice.h"
#include "KDiskDeviceManager.h" #include "KDiskDeviceManager.h"
#include "KDiskDeviceUtils.h" #include "KDiskDeviceUtils.h"
@@ -107,6 +108,20 @@ KShadowPartition::SyncWithPhysicalPartition()
SetContentParameters(fPhysicalPartition->ContentParameters()); SetContentParameters(fPhysicalPartition->ContentParameters());
} }
// WriteUserData
void
KShadowPartition::WriteUserData(UserDataWriter &writer,
user_partition_data *data)
{
KPartition::WriteUserData(writer, data);
// fix the ID in the user data
if (data) {
if (fPhysicalPartition)
data->id = fPhysicalPartition->ID();
data->shadow_id = ID();
}
}
// Dump // Dump
void void
KShadowPartition::Dump(bool deep, int32 level) KShadowPartition::Dump(bool deep, int32 level)