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:
parent
3928ef46fd
commit
5d22fa967a
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -29,6 +29,9 @@ public:
|
||||
|
||||
void SyncWithPhysicalPartition();
|
||||
|
||||
virtual void WriteUserData(UserDataWriter &writer,
|
||||
user_partition_data *data);
|
||||
|
||||
virtual void Dump(bool deep, int32 level);
|
||||
|
||||
protected:
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user