Re: DiskDevice API v2.1

Ingo Weinhold <bonefish-CFLBMwTPW48UNGrzBIF7/[email protected]>
Newsgroups gmane.os.openbeos.storage
Message-ID <Pine.SOL.4.53.0304021450000.1994@pepita>
On Tue, 1 Apr 2003, Tyler Dauwalder wrote:

> I had the time, so here are some proposed changes for better
> partition management support. BPartitions would maintain lists of
> BEmptySpace objects, each of which represents the largest contiguous
> space between child BPartitions that could be filled with a new
> BPartition.

Mmh, I don't know, if I see the benefits of this. I even think, it is a
bit confusing to use the BEmptySpace objects to create partitions. At
least to my intuition empty space is a `non-thing', so encapsulating it in
a class is somehow... er... strange. I know that it is not uncommon to
manage free resources (e.g. `free' lists in memory management), but that
is just to manage information. Just imagine, you have BDiskSpace object,
call a method on it (CreatePartition()) and suddenly the object is gone.
If at all, I'd only provide getter methods by BEmptySpace.

> The ValidateXYZ() functions would be used to bounds/error check
> modifications before actually solidifying said modification with the
> corresponding XYZ() function. The BDiskDevice::CommitUpdates()
> function would then actually perform the device's batched physical
> updates.

Maybe it would be better to have CommitUpdates() in BPartition rather than
in BDiskDevice. If we provided a partition locking, the siblings of the
affected partition wouldn't need to be locked. Not sure though.

> The BDiskSystem class provides info about supported child and parent
> systems for each disk system (i.e. intel extended would require an
> intel parent).

When introducing such a class, I would make it more complete. Actually,
those objects could be returned by the add-ons. The class should then have
ValidateXYZ(BPartition*,...) (implemented by derived classes), which are
invoked by their BPartition::ValidateXYZ() counterparts. This means, that
the add-ons for the used systems must be kept loaded while the API is
used, but that shouldn't harm that much, I think.

An alternative -- I guess, you envisioned it like that -- is to not make
the BDiskSystem methods virtual, but let them call into the kernel, where
the repective module is asked. I don't think, I like that better.

> class BEmptySpace {
> public:
> 	off_t Offset() const;
> 	off_t Size() const;
> 	int32 Index() const;
>
> 	BPartition* Parent() const;
>
> 	bool CanCreatePartition() const;
> 	status_t ValidateCreatePartition(
> 	           off_t *start,
> 	           off_t *size) const;
> 	BPartition* CreatePartition(off_t start, off_t size);
> 		// Partition creation this way would always create an
> 		// unformatted partition. Does this seem reasonable?
> };

As written above, I would drop the *CreatePartition() methods.

> class BPartition {
> public:
> 	BEmptySpace* EmptySpaceAt(int32 index) const;
>
> // I have resize and move separated because move could be filesystem
> // independent, whereas resize could not

I hope, you're right regarding move. The absolute addressing you found in
ISO9660 disk scares me a bit. Maybe we can ignore that.

> 	bool CanResize() const;
> 	bool CanMove() const;
> 	status_t ValidateResize(off_t*) const;
> 	status_t ValidateMove(off_t*) const;
> 	status_t Resize(off_t);
> 	status_t Move(off_t);
>
> 	bool CanEditParameters() const;
> 	status_t GetParameterEditor(
>            BDiskScannerParameterEditor **editor,
>            BDiskScannerParameterEditor **parentEditor);
>
> // Perhaps we should have something for checking a partition is
> // large/small enough for initialization with a given system? The
> // parameter editor could alternately check for this.

I would just add another method in BDiskSystem.

> 	bool CanInitialize() const;
> 	status_t GetInitializationParameterEditor(const char *system,
>                BDiskScannerParameterEditor **editor) const;
> 	status_t Initialize(const char *diskSystem,
> 	                 const char *parameters);
>
> 	bool CanDelete() const;
> 	status_t Delete();
> };
>
> class BDiskDevice {
> public:
> 	int32 CommitUpdates(BMessenger progressMessenger);
> };

status_t CommitUpdates(bool synchronously = true,
	BMessenger progressMessenger = BMessenger(),
	BMessage *template = NULL);

:-)

> class BDiskSystem {
> public:
> 	bool SupportsParentSystem(const char *system) const;
> 		// True in most cases. NULL == raw device.
> 	bool SupportsChildSystem(const char *system) const;
> 		// False for most file systems, true for most partitioning
> 		// systems.
>
> 	bool IsPartitioningSystem() const;
> 	bool IsFileSystem() const;
> };

As said above, I would make them virtual. Moreover, the Supports*System()
should also have a BPartition* parameter. Otherwise partitioning systems
that allow only a limited number of levels can't give an authoritative
answer here. The BPartition* parameter could optionally be NULL to ask
whether it is supported in general.

Furthermore there should be:

  virtual const char *Name() const;

  virtual bool SupportsResizing(BPartition *partition) const;
  virtual bool SupportsResizingChild(BPartition *child) const;
  virtual bool SupportsMoving(BPartition *partition) const;
  virtual bool SupportsMovingChild(BPartition *child) const;

  virtual bool ValidateResize(BPartition*, off_t*) const;
  virtual bool ValidateMove(BPartition*, off_t*) const;
  virtual bool ValidateResizeChild(BPartition*, off_t*) const;
  virtual bool ValidateMoveChild(BPartition*, off_t*) const;

  virtual bool ValidateCreateChild(BPartition*, off_t*, off_t*) const;

  virtual bool ValidateInitialize(BPartition*) const;

> class BDiskSystemList {
> public:
> 	// To be similar to BDiskDeviceList, offering updates as
> 	// systems are added and removed.
> };
>
> class BDiskDeviceRoster {
> public:
> 	status_t GetDiskSystems(BDiskSystemList *list) const;
> };

I think, I would prefer iteration methods instead (GetNext*(), Rewind*()).
Otherwise all add-ons would need to be in memory.

CU, Ingo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.