Re: Kernelland Draft Headers

Tyler Dauwalder <tyler-cyCl/[email protected]>
Newsgroups gmane.os.openbeos.storage
Message-ID <[email protected]>
On 2003-06-07 at 10:14:10 [-0700], Ingo Weinhold wrote:
> On Fri, 06 Jun 2003 18:03:40 -0700 Tyler Dauwalder 
> <tyler-cyCl/[email protected]
> > wrote:
> > Here are my header comment/question comments. I skipped over things
> > we're already discussing in the other thread, but otherwise I think 
> > I
> > hit everything.
> > 
> > userland_interface.h
> > --------------------
> > 
> > #ifndef _DISK_DEVICE_MANAGER_USERLAND_INTERFACE_H
> > #define _DISK_DEVICE_MANAGER_USERLAND_INTERFACE_H
> > 
> > // userland partition representation
> > struct user_partition_data {
> >     int32                id;
> >     off_t                offset;
> >     off_t                size;
> >     int32                block_size;
> >     uint32                status;
> >     uint32                flags;
> >     int32                change_counter;    // needed? (1)
> >     char                *name;
> >     char                *type;
> >     char                *content_type;
> >     char                *parameters;
> >     char                *content_parameters;
> >     void                *user_data;        
> >                           // Maybe. Depends on BPartition. (2)
> >     int32                child_count;
> >     user_partition_data    *children[1];
> > };
> > 
> > status_t get_partition_data(int32 partitionID, bool shadow,
> >                             user_partition_data *buffer,
> >                             size_t bufferSize, size_t *neededSize);
> >     // Dangerous?! (3)
> > status_t get_partitionable_spaces(int32 partitionID, bool shadow,
> >                                   user_partitionable_space_data *
> > buffer,
> >                                   size_t bufferSize, size_t *
> > neededSize);
> >     // Pass the partition change counter? If GetPartitionInfo() is
> >     // only allowed, when the device is locked, then we wouldn't 
> >     need
> >     // it. (4)
> > 
> > status_t initialize_partition(int32 partition, const char *
> > diskSystem,
> >                               const char *parameters);
> >     // Note: There is also fs_initialize_volume()... (5)
> > 
> > (1) Probably not needed now we have locking.
> 
> This locking -- the term doesn't actually fit that well, I think, 
> since
> it's only a mechanism to ensure the exclusive use of the modification
> methods of the API -- doesn't prevent the kernel structures from being
> changed. E.g. a device might be unplugged or a media ejected at any
> time, and also formerly scheduled jobs might (and probably will) 
> change
> structures (although only those being marked busy). Now, none of these
> changes will interfere with the modification operations, and they are
> not immediately destructive anyway (as they change the shadow
> partitions only), so at least in this context the change counters are
> not needed.
> 
> On the other hand, I think, change counters will simplify
> BDiskDevice::Update(), e.g. to find out, if something has changed
> (needed for the `updated' return value). Though in this case it would
> be sufficient to have only one for the disk device.

Okay, then leave them in. :-)

> > KDiskSystem.h
> > -------------
> > class KDiskSystem {
> >     const char *Name() const;
> > // We might want to introduce another name -- a more user           
> >   
> > // friendly one. This one is the name of the partition module/FS 
> > add-
> > // on, e.g. "intel/extended", "bfs". (1)
> > 
> > 
> >     virtual status_t CreateChild(KPartition *partition, off_t 
> >     offset,
> >                                  off_t size, const char *parameters,
> >                                  KDiskDeviceJob *job, KPartition **
> > child);
> >     // optional childID parameter or allow setting the ID later? (2)
> > 
> > (1) Yes, I think it'd be nice to have something like this available.
> > const char*FriendlyName() const; or something to that degree
> > (DescriptiveName() maybe?).
> 
> Ah, wait a second. I may have confused myself. :-) BPartition::Type()/
> ContentType() returns a type defined in DiskDeviceTypes.h, and
> BDiskSystem::Name() certainly does as well. So, KDiskSystem::Name()
> would be for kernel-internal use only, while only
> KDiskSystem::DescriptiveName() (I'd prefer that one) is passed to the
> userland API.
> 
> Does that sound OK, or do we want to have the internal name available
> in the userland API as well? If we don't, I already hear the command
> line fans shouting, because they would need to pass `BFS Filesystem'
> instead of `bfs' to mkfs.

That's a tough call... You're right that the DiskDeviceTypes.h names 
are going to be no fun to type... I guess it'd be all right to have 
them both. But do we want Name() + DescriptiveName() or ShortName() + 
Name() or ModuleName() + Name(), or...?

> > If so, I think that makes sense. We'll need
> > to give it an id before it percolates up to 
> > BPartition::CreateChild()
> > anyway; it may as well have a valid id upon construction.
> 
> OK. It may even be necessary, since the create_child_partition()
> exported by the disk device manager will also register the partition
> with that ID, so that changing the ID of the partition may be a bit
> painful later.

Okay.

> 
> > KDiskDeviceJob.h
> > ----------------
> > 
> > class KDiskDeviceJob {
> > public:
> >     void SetID(int32 id);
> > // The base class might simply generate IDs on construction only. 
> > (1)
> > 
> >     void SetDescription(const char *description);
> >     const char *Description() const;
> >         // Maybe better just a virtual void GetDescription(char*)? 
> >         (2)
> > 
> >     void SetPartitionID(int32 partitionID);
> >         // Probably not needed, since passed to the constructor. (3)
> > 
> >     virtual void UpdateProgress(float progress);
> > // may trigger a notification
> > // virtual, since some jobs are composed of several tasks (e.g.
> > Move).
> > // We might want to explicitly support subtasks in the base class, 
> > or
> > // even in the userland API. (4)
> > 
> > };
> > 
> > (2) Well, if the main use of the Description() function is going to
> > be to help fill up a user_disk_device_job_info struct, and assuming
> > user_disk_device_job_info::description is to remain a static array 
> > as
> > it currently is, it would allow the KDiskDeviceJob subclass to just
> > printf() into the argument passed to GetDescription().
> 
> On the other hand, a SetDescription()/Description() combination can be
> implemented in the base class, while a virtual GetDescription() would
> need to be added to each subclass. Moreover I think the job 
> description
> shouldn't change after the job is constructed and it may even be, that
> the information to compose the description is not longer available
> after the respective shadow partition has been destroyed.

Sounds like SetDescription()/Description() it is. Although, one could 
argue for eliminating SetDescription() and moving the parameter into 
the constructor, particularly since we're already generating a fresh id 
then anyway.

> 
> > Maybe a
> > KDiskDeviceJob::GetInfo(user_disk_device_job_info*) would be handy?
> 
> Certainly not a bad idea. :-)

Let's add it then. :-)

> > (3) Agreed. :-)
> > 
> > (4) This is kind what I invisioned the extra progress info updates
> > being used for, but perhaps more simply so, i.e. a way to notify the
> > user at what stage of a given task the process was at.
> 
> Well, there shouldn't be a problem to use the extra progress info for
> that.
> 
> > We could also
> > add progress updates per subtask, I suppose, to allow two status 
> > bars
> > to be shown. Is this what you're thinking?
> 
> Something like this. What I don't find so nice, if we have only a
> progress value for the complete task, is that the subtasks may be very
> differently fast. E.g. for resizing a partition, where setting the new
> partition will probably be very quick, while resizing the FS may take
> quite some time. So, if a simple progress bar is shown, it appears 
> like
> half the progress is made in a second, whereas the other half takes an
> hour.
> 
> It may be nice to have a more a more detailed progress info, like a
> BDiskDeviceJob::GetProgressInfo(disk_devive_progress_info *info) with:
> 
> struct disk_device_progress_info {
>     int32    subtask_count;
>     int32    done_subtasks;

How about "completed_subtasks"? That sounds better to me, even though 
it's a little longer.

>     float    current_subtask_progress;
>     char    current_subtask_description[256];
> };

Okay, that's probably a good idea. Let's do that.

> > disk_device_manager.h
> > ---------------------
> > 
> > // C API partition representation
> > typedef struct partition_data {
> >     int32    index;            // needed? (1)
> >     uint32    status;
> >     uint32    flags;
> >     char    name[B_FILE_NAME_LENGTH];            // better char* ? 
> >     (2)
> >     char    type[B_FILE_NAME_LENGTH];            //
> >     char    content_type[B_FILE_NAME_LENGTH];    //
> > } partition_data;
> > 
> > // C API disk device representation
> > typedef struct disk_device_data {
> >     char    *path;            // a char[] ? (3)
> > } disk_device_data;
> > 
> > (1) Probably not. Should be easy to resurrect if we take it out now
> > and need it later. :-)
> 
> Or the other way around: Keep it and drop it, if it won't be used. :-)
> Meanwhile I think, it could be nice for the modules to have it, since
> otherwise they had to iterate through all partitions of the parent
> partition to learn about the index.

Okay, either way. :-)

> > (2) Well, it does seem like a lot of the 256 characters in each of
> > those fields is going to go wasted. On the other hand, it would
> > complicate things slightly. I'm pretty much indifferent, at this
> > point...
> 
> So am I. :-)
> 
> > (3) Well, a char[B_PATH_NAME_LENGTH] would certainly be fair, but I
> > think it falls under the same argument as above.
> 
> Even worse, it uses 1024 bytes. :-)
> 
> > Unless anyone else
> > has some convincing arguments otherwise, I think I'd vote for making
> > all the character string parameters either char* or char[], leaning
> > towards char*.
> 
> Agreed. For `parameters' and `content_parameters' can't be fixed size
> array, I tend towards char* for all.

Okay, let's do that then.

-Tyler
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.