* More shadow partition support.

* Writing disk device/partition data into userland buffer added.
* Migration of some definitions into <DiskDeviceDefs.h> header.
* Small bug fixes.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3882 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2003-07-06 23:01:22 +00:00
parent 64cf9ebc08
commit c0455c33b8
10 changed files with 120 additions and 48 deletions
@@ -8,16 +8,11 @@
#include "KPhysicalPartition.h" #include "KPhysicalPartition.h"
#include "RWLocker.h" #include "RWLocker.h"
// disk device flags
// TODO: move to another header (must be accessible from userland API impl.)
enum {
B_DISK_DEVICE_REMOVABLE = 0x01,
B_DISK_DEVICE_HAS_MEDIA = 0x02,
};
namespace BPrivate { namespace BPrivate {
namespace DiskDevice { namespace DiskDevice {
class UserDataWriter;
class KDiskDevice : public KPhysicalPartition { class KDiskDevice : public KPhysicalPartition {
public: public:
KDiskDevice(partition_id id = -1); KDiskDevice(partition_id id = -1);
@@ -69,6 +64,8 @@ public:
void SetShadowOwner(team_id team); void SetShadowOwner(team_id team);
team_id ShadowOwner() const; team_id ShadowOwner() const;
void WriteUserData(UserDataWriter &writer, bool shadow);
virtual void Dump(bool deep = true, int32 level = 0); virtual void Dump(bool deep = true, int32 level = 0);
protected: protected:
@@ -7,21 +7,13 @@
#include "disk_device_manager.h" #include "disk_device_manager.h"
// partition flags struct user_partition_data;
// TODO: move to another header (must be accessible from userland API impl.)
enum {
B_PARTITION_IS_DEVICE = 0x01,
B_PARTITION_MOUNTABLE = 0x02,
B_PARTITION_PARTITIONABLE = 0x04,
B_PARTITION_READ_ONLY = 0x08,
B_PARTITION_MOUNTED = 0x10, // needed?
B_PARTITION_BUSY = 0x20,
B_PARTITION_DESCENDANT_BUSY = 0x40,
};
namespace BPrivate { namespace BPrivate {
namespace DiskDevice { namespace DiskDevice {
class UserDataWriter;
class KDiskDevice; class KDiskDevice;
class KDiskSystem; class KDiskSystem;
class KPhysicalPartition; class KPhysicalPartition;
@@ -142,9 +134,9 @@ public:
virtual status_t CreateShadowPartition(); // creates a complete tree virtual status_t CreateShadowPartition(); // creates a complete tree
virtual void DeleteShadowPartition(); // deletes ... virtual void DeleteShadowPartition(); // deletes ...
virtual KShadowPartition *ShadowPartition() = 0; virtual KShadowPartition *ShadowPartition() const = 0;
virtual bool IsShadowPartition() const = 0; virtual bool IsShadowPartition() const = 0;
virtual KPhysicalPartition *PhysicalPartition() = 0; virtual KPhysicalPartition *PhysicalPartition() const = 0;
// DiskSystem // DiskSystem
@@ -161,6 +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 Dump(bool deep, int32 level); virtual void Dump(bool deep, int32 level);
private: private:
@@ -35,9 +35,9 @@ public:
virtual status_t CreateShadowPartition(); // creates a complete tree virtual status_t CreateShadowPartition(); // creates a complete tree
virtual void DeleteShadowPartition(); // deletes ... virtual void DeleteShadowPartition(); // deletes ...
virtual KShadowPartition *ShadowPartition(); virtual KShadowPartition *ShadowPartition() const;
virtual bool IsShadowPartition() const; virtual bool IsShadowPartition() const;
virtual KPhysicalPartition *PhysicalPartition(); virtual KPhysicalPartition *PhysicalPartition() const;
// DiskSystem // DiskSystem
@@ -22,10 +22,12 @@ public:
// Shadow Partition // Shadow Partition
virtual KShadowPartition *ShadowPartition(); virtual KShadowPartition *ShadowPartition() const;
virtual bool IsShadowPartition() const; virtual bool IsShadowPartition() const;
void SetPhysicalPartition(KPhysicalPartition *partition); void UnsetPhysicalPartition();
virtual KPhysicalPartition *PhysicalPartition(); virtual KPhysicalPartition *PhysicalPartition() const;
void SyncWithPhysicalPartition();
virtual void Dump(bool deep, int32 level); virtual void Dump(bool deep, int32 level);
@@ -7,20 +7,13 @@
#ifndef _DISK_DEVICE_MANAGER_H #ifndef _DISK_DEVICE_MANAGER_H
#define _DISK_DEVICE_MANAGER_H #define _DISK_DEVICE_MANAGER_H
#include <DiskDeviceDefs.h>
#include <Drivers.h> #include <Drivers.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
// TODO: These don't belong here. partition_id and disk_job_id are
// public (exposed by the userland API), while disk_system_id is at least
// known to the userland API, but probably exposed as well, as type of a
// private member variable of BDiskSystem.
typedef int32 partition_id;
typedef int32 disk_system_id;
typedef int32 disk_job_id;
// C API partition representation // C API partition representation
typedef struct partition_data { typedef struct partition_data {
partition_id id; partition_id id;
+4 -2
View File
@@ -6,11 +6,12 @@ SEARCH_SOURCE += [ FDirName $(OBOS_TOP) src kits storage ] ;
UsePrivateHeaders [ FDirName kernel disk_device_manager ] ; UsePrivateHeaders [ FDirName kernel disk_device_manager ] ;
UsePrivateHeaders [ FDirName kernel util ] ; UsePrivateHeaders [ FDirName kernel util ] ;
UsePrivateHeaders [ FDirName shared ] ; UsePrivateHeaders shared ;
UsePrivateHeaders [ FDirName storage ] ; UsePrivateHeaders storage ;
UseHeaders [ FDirName $(OBOS_TOP) src tests kits storage virtualdrive ] ; UseHeaders [ FDirName $(OBOS_TOP) src tests kits storage virtualdrive ] ;
SharedLibrary disk_device_manager : SharedLibrary disk_device_manager :
ddm_user_interface.cpp
disk_device_manager.cpp disk_device_manager.cpp
KDiskDevice.cpp KDiskDevice.cpp
KDiskDeviceJob.cpp KDiskDeviceJob.cpp
@@ -24,6 +25,7 @@ SharedLibrary disk_device_manager :
KPartitioningSystem.cpp KPartitioningSystem.cpp
KPhysicalPartition.cpp KPhysicalPartition.cpp
KShadowPartition.cpp KShadowPartition.cpp
UserDataWriter.cpp
# jobs # jobs
KCreateChildJob.cpp KCreateChildJob.cpp
@@ -7,8 +7,11 @@
#include <Drivers.h> #include <Drivers.h>
#include "ddm_userland_interface.h"
#include "KDiskDevice.h" #include "KDiskDevice.h"
#include "KDiskDeviceUtils.h" #include "KDiskDeviceUtils.h"
#include "KShadowPartition.h"
#include "UserDataWriter.h"
// debugging // debugging
//#define DBG(x) //#define DBG(x)
@@ -262,6 +265,24 @@ KDiskDevice::ShadowOwner() const
return fShadowOwner; return fShadowOwner;
} }
// WriteUserData
void
KDiskDevice::WriteUserData(UserDataWriter &writer, bool shadow)
{
KPartition *partition = (shadow ? ShadowPartition() : this);
if (!partition)
partition = this;
user_disk_device_data *data
= writer.AllocateDeviceData(partition->CountChildren());
char *path = writer.PlaceString(Path());
if (data) {
data->device_flags = DeviceFlags();
data->path = path;
partition->WriteUserData(writer, &data->device_partition_data);
} else
partition->WriteUserData(writer, NULL);
}
// Dump // Dump
void void
KDiskDevice::Dump(bool deep, int32 level) KDiskDevice::Dump(bool deep, int32 level)
@@ -302,5 +323,6 @@ KDiskDevice::_InitPartitionData()
* fDeviceData.geometry.sectors_per_track * fDeviceData.geometry.sectors_per_track
* fDeviceData.geometry.cylinder_count * fDeviceData.geometry.cylinder_count
* fDeviceData.geometry.head_count; * fDeviceData.geometry.head_count;
fPartitionData.flags |= B_PARTITION_IS_DEVICE;
} }
@@ -10,11 +10,13 @@
#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"
#include "KDiskSystem.h" #include "KDiskSystem.h"
#include "KPartition.h" #include "KPartition.h"
#include "UserDataWriter.h"
using namespace std; using namespace std;
@@ -714,6 +716,47 @@ KPartition::ContentCookie() const
return fPartitionData.content_cookie; return fPartitionData.content_cookie;
} }
// WriteUserData
void
KPartition::WriteUserData(UserDataWriter &writer, user_partition_data *data)
{
// allocate
char *name = writer.PlaceString(Name());
char *contentName = writer.PlaceString(ContentName());
char *type = writer.PlaceString(Type());
char *contentType = writer.PlaceString(ContentType());
char *parameters = writer.PlaceString(Parameters());
char *contentParameters = writer.PlaceString(ContentParameters());
// fill in data
if (data) {
data->id = ID();
data->offset = Offset();
data->size = Size();
data->block_size = BlockSize();
data->status = Status();
data->flags = Flags();
data->volume = VolumeID();
data->index = Index();
data->change_counter = ChangeCounter();
data->disk_system = (DiskSystem() ? DiskSystem()->ID() : -1);
data->name = name;
data->content_name = contentName;
data->type = type;
data->content_type = contentType;
data->parameters = parameters;
data->content_parameters = contentParameters;
data->child_count = CountChildren();
}
// children
for (int32 i = 0; KPartition *child = ChildAt(i); i++) {
user_partition_data *childData
= writer.AllocatePartitionData(child->CountChildren());
if (data)
data->children[i] = childData;
child->WriteUserData(writer, childData);
}
}
// Dump // Dump
void void
KPartition::Dump(bool deep, int32 level) KPartition::Dump(bool deep, int32 level)
@@ -199,7 +199,7 @@ KPhysicalPartition::DeleteShadowPartition()
// delete the thing // delete the thing
KDiskDeviceManager *manager = KDiskDeviceManager::Default(); KDiskDeviceManager *manager = KDiskDeviceManager::Default();
if (ManagerLocker locker = manager) { if (ManagerLocker locker = manager) {
fShadowPartition->SetPhysicalPartition(NULL); fShadowPartition->UnsetPhysicalPartition();
PartitionRegistrar _(fShadowPartition); PartitionRegistrar _(fShadowPartition);
manager->PartitionRemoved(fShadowPartition); manager->PartitionRemoved(fShadowPartition);
fShadowPartition = NULL; fShadowPartition = NULL;
@@ -208,7 +208,7 @@ KPhysicalPartition::DeleteShadowPartition()
// ShadowPartition // ShadowPartition
KShadowPartition * KShadowPartition *
KPhysicalPartition::ShadowPartition() KPhysicalPartition::ShadowPartition() const
{ {
return fShadowPartition; return fShadowPartition;
} }
@@ -222,9 +222,9 @@ KPhysicalPartition::IsShadowPartition() const
// PhysicalPartition // PhysicalPartition
KPhysicalPartition * KPhysicalPartition *
KPhysicalPartition::PhysicalPartition() KPhysicalPartition::PhysicalPartition() const
{ {
return this; return NULL;
} }
// Dump // Dump
@@ -25,9 +25,9 @@ using namespace std;
// constructor // constructor
KShadowPartition::KShadowPartition(KPhysicalPartition *partition) KShadowPartition::KShadowPartition(KPhysicalPartition *partition)
: KPartition(), : KPartition(),
fPhysicalPartition(NULL) fPhysicalPartition(partition)
{ {
SetPhysicalPartition(partition); SyncWithPhysicalPartition();
} }
// destructor // destructor
@@ -68,26 +68,45 @@ KShadowPartition::IsShadowPartition() const
// ShadowPartition // ShadowPartition
KShadowPartition* KShadowPartition*
KShadowPartition::ShadowPartition() KShadowPartition::ShadowPartition() const
{ {
return this; return NULL;
} }
// SetPhysicalPartition // UnsetPhysicalPartition
void void
KShadowPartition::SetPhysicalPartition(KPhysicalPartition *partition) KShadowPartition::UnsetPhysicalPartition()
{ {
fPhysicalPartition = partition; fPhysicalPartition = NULL;
// TODO: clone the data of the physical partition.
} }
// PhysicalPartition // PhysicalPartition
KPhysicalPartition* KPhysicalPartition*
KShadowPartition::PhysicalPartition() KShadowPartition::PhysicalPartition() const
{ {
return fPhysicalPartition; return fPhysicalPartition;
} }
// SyncWithPhysicalPartition
void
KShadowPartition::SyncWithPhysicalPartition()
{
if (!fPhysicalPartition)
return;
SetDevice(fPhysicalPartition->Device());
SetDiskSystem(fPhysicalPartition->DiskSystem());
SetOffset(fPhysicalPartition->Offset());
SetSize(fPhysicalPartition->Size());
SetBlockSize(fPhysicalPartition->BlockSize());
SetStatus(fPhysicalPartition->Status());
SetFlags(fPhysicalPartition->Flags());
SetVolumeID(fPhysicalPartition->VolumeID());
SetName(fPhysicalPartition->Name());
SetContentName(fPhysicalPartition->ContentName());
SetParameters(fPhysicalPartition->Parameters());
SetContentParameters(fPhysicalPartition->ContentParameters());
}
// Dump // Dump
void void
KShadowPartition::Dump(bool deep, int32 level) KShadowPartition::Dump(bool deep, int32 level)