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:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user