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

View File

@ -36,6 +36,8 @@ public:
void WriteUnlock();
bool IsWriteLocked();
virtual bool PrepareForRemoval();
virtual void SetID(partition_id id);
virtual status_t PublishDevice();
@ -63,6 +65,8 @@ public:
disk_device_data *DeviceData();
const disk_device_data *DeviceData() const;
status_t CreateShadowDevice(team_id team);
status_t DeleteShadowDevice();
void SetShadowOwner(team_id team);
team_id ShadowOwner() const;

View File

@ -133,7 +133,7 @@ public:
// Shadow Partition
virtual status_t CreateShadowPartition(); // creates a complete tree
virtual void DeleteShadowPartition(); // deletes ...
virtual void UnsetShadowPartition(bool doDelete);
virtual KShadowPartition *ShadowPartition() const = 0;
virtual bool IsShadowPartition() const = 0;
virtual KPhysicalPartition *PhysicalPartition() const = 0;
@ -153,7 +153,8 @@ public:
void SetContentCookie(void *cookie);
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);

View File

@ -34,7 +34,7 @@ public:
// Shadow Partition
virtual status_t CreateShadowPartition(); // creates a complete tree
virtual void DeleteShadowPartition(); // deletes ...
virtual void UnsetShadowPartition(bool doDelete);
virtual KShadowPartition *ShadowPartition() const;
virtual bool IsShadowPartition() const;
virtual KPhysicalPartition *PhysicalPartition() const;

View File

@ -29,6 +29,9 @@ public:
void SyncWithPhysicalPartition();
virtual void WriteUserData(UserDataWriter &writer,
user_partition_data *data);
virtual void Dump(bool deep, int32 level);
protected:

View File

@ -161,6 +161,15 @@ KDiskDevice::IsWriteLocked()
return fLocker.IsWriteLocked();
}
// PrepareForRemoval
bool
KDiskDevice::PrepareForRemoval()
{
if (ShadowOwner() >= 0)
DeleteShadowDevice();
return KPhysicalPartition::PrepareForRemoval();
}
// SetID
void
KDiskDevice::SetID(partition_id id)
@ -284,6 +293,30 @@ KDiskDevice::DeviceData() const
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
void
KDiskDevice::SetShadowOwner(team_id team)

View File

@ -658,9 +658,9 @@ KPartition::CreateShadowPartition()
return B_ERROR;
}
// DeleteShadowPartition
// UnsetShadowPartition
void
KPartition::DeleteShadowPartition()
KPartition::UnsetShadowPartition(bool doDelete)
{
// implemented by derived classes
}
@ -743,6 +743,7 @@ KPartition::WriteUserData(UserDataWriter &writer, user_partition_data *data)
// fill in data
if (data) {
data->id = ID();
data->shadow_id = -1;
data->offset = Offset();
data->size = Size();
data->block_size = BlockSize();

View File

@ -42,7 +42,7 @@ KPhysicalPartition::PrepareForRemoval()
{
bool result = KPartition::PrepareForRemoval();
if (result) {
DeleteShadowPartition();
UnsetShadowPartition(false);
UnpublishDevice();
}
return result;
@ -179,29 +179,31 @@ KPhysicalPartition::CreateShadowPartition()
// cleanup on error
if (error != B_OK) {
for (int32 k = 0; k <= i; i++)
ChildAt(k)->DeleteShadowPartition();
DeleteShadowPartition();
ChildAt(k)->UnsetShadowPartition(true);
UnsetShadowPartition(true);
return error;
}
}
return B_OK;
}
// DeleteShadowPartition
// UnsetShadowPartition
void
KPhysicalPartition::DeleteShadowPartition()
KPhysicalPartition::UnsetShadowPartition(bool doDelete)
{
if (!fShadowPartition)
return;
// delete children's shadows
// unset children's shadows
for (int32 i = 0; KPartition *child = ChildAt(i); i++)
child->DeleteShadowPartition();
// delete the thing
child->UnsetShadowPartition(false);
// unset the thing
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
if (ManagerLocker locker = manager) {
fShadowPartition->UnsetPhysicalPartition();
PartitionRegistrar _(fShadowPartition);
manager->PartitionRemoved(fShadowPartition);
if (doDelete) {
PartitionRegistrar _(fShadowPartition);
manager->PartitionRemoved(fShadowPartition);
}
fShadowPartition = NULL;
}
}

View File

@ -10,6 +10,7 @@
#include <Drivers.h>
#include <Errors.h>
#include "ddm_userland_interface.h"
#include "KDiskDevice.h"
#include "KDiskDeviceManager.h"
#include "KDiskDeviceUtils.h"
@ -107,6 +108,20 @@ KShadowPartition::SyncWithPhysicalPartition()
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
void
KShadowPartition::Dump(bool deep, int32 level)