[openbeosstorage] Re: API Extensions
- From: "Ingo Weinhold" <bonefish@xxxxxxxxxxxxxxx>
- To: openbeosstorage@xxxxxxxxxxxxx
- Date: Sun, 29 Dec 2002 01:05:27 CET (+0100)
>
> "Ingo Weinhold" <bonefish@xxxxxxxxxxxxxxx> wrote:
>
> > typedef bool (*partition=5Fidentify=5Fmodule=5Fhook)(const char *
> > identifier,
> > uint32 version);
> > typedef status=5Ft (*partition=5Fpartition=5Fhook)(int deviceFD,
> > const
> > struct
> > session=5Finfo *session, void *parameters, size=5Ft paramLen);
>
> The information should be queryable through an ioctl - so you can ask
> the device which partition system it is using.
I guess, one would make devfs intercept this ioctl and ask the
disk_scanner and friends?
> > For FS initialization the FS modules would need similar functions:
> >
> > typedef bool (*fs=5Fidentify=5Fmodule=5Fhook)(const char *
> > identifier,
> > uint32
> > version);
> > typedef status=5Ft (*fs=5Finitialize=5Fhook)(int deviceFD, const
> > struct
> > partition=5Finfo *partitionInfo, const char *volumeName, void *
> > parameters, size=5Ft paramLen);
>
> I don't think the fs initialization should be part of that module, I
> think it should be part of the file system driver. Initializing a
> file
> system might not be as easy as it is in FAT :-)
> Especially for BFS, it would require to copy big parts of the code.
Yep, see my other mail.
> But of course, there should be a simple way to check if a particular
> file system supports initialization - the current DS doesn't do that,
> so it presents all file systems to the user at that point, which we
> should be able to avoid.
Agreed. There are also other properties of a FS that are of interest
(not for initialization, but for a complete device API), e.g. if it is
read-only, supports attributes/queries/...
> > typedef status=5Ft (*disk=5Fscanner=5Fpartition=5Fhook)(int
> > deviceFD, const
> > struct session=5Finfo *session, const char *identifier, uint32
> > version,
> > void *parameters, size=5Ft paramLen);
> > typedef status=5Ft (*disk=5Fscanner=5Finitialize=5Fhook)(int
> > deviceFD, const
> > struct partition=5Finfo *partitionInfo, const char *identifier,
> > uint32
> > version, char *volumeName, void *parameters, size=5Ft paramLen);
>
> What exactly is the "identifier" doing in the partition hook=3F
A copy'n'paste leftover. :-)
Just wanted to know, how carefully you're reading. ;-)
> > And the user functions:
> > status=5Ft partition=5Fsession(int deviceFD, int32 sessionIndex,
> > const
> > char
> > *identifier, uint32 version, void *parameters, size=5Ft paramLen);
> > status=5Ft initialize=5Fpartition(int deviceFD, int32 sessionIndex,
> > int32
> > partitionIndex, const char *identifier, uint32 version, char *
> > volumeName, void *parameters, size=5Ft paramLen);
>
> I would replace the second with:
> status=5Ft initialize=5Fvolume(const char *where, const char *
> fileSystem,
> const char *volumeName, const char *parameters);
>
> Or something similar, probably in unistd.h (accompanying mount()).
Mmh, I could live with that, though it doesn't fit with the rest of the
functions.
Perhaps it's also better to drop that `version' stuff. I thought, it
could help to deal better with situations when different versions of a
FS exist, but probably that's a bit too esoteric.
> > class BDiskScannerParameterEditor {
> > public:
> > virtual ~BDiskScannerParameterEditor();
> >
> > virtual BView *View() =3D 0;
> > virtual status=5Ft GetParameters(void **parameters, size=5Ft *
> > paramLen)
> > =3D 0;
> > };
> >
> > How does that sound=3F
>
> Looks very nice! There also should be a default parameter editor for
> file systems, where you can just enter the name of the volume (in the
> case there is no dedicated add-on for it).
I actually thought to have these editors edit only the FS specific
parameters while the volume name would always be editable with the
presented GUI. In case there were no add-on/editor only the volume name
could be entered.
> I also have some other notes:
> 1) All partitioning systems I know (Intel & Amiga RDB) have special
> identifiers for the file system which is installed on a particular
> partition - for example 0xeb/0xbe for BFS in either little or big
> endian in intel partitions.
> The current approach seem to ignore those completely, which we have
> to
> do in a way, because they aren't compatible between different
> partitioning systems. But is this valid=3F It would make it possible
> to
> initialize a partition marked as BFS with the FAT driver
I've done this more than once, accidentially mostly. :-)
> - that's not
> nice, but I don't think we can do anything about it.
Me neither.
> OTOH we can use this information to display names for partitions with
> unknown or initialized file systems - so that Tracker displays "Be
> volume" or "QNX volume" if the recognizes a BFS/QNX partition but it
> cannot read the file system for whatever reason.
The extended_partition_info features both the type code
(`partition_code') and a human readable interpretation
(`partition_type'). partition_code is uint8 currently -- maybe it
should be resized to uint32.
> That functionality is already part of the current BeOS in some way
> (i.e. it shows "IDE Master 1:Partition 0" or something like this for
> unknown partitions).
The Device class has a function DisplayName() that returns something
like that (`IDE master bus:1') for devices it knows (IDE and SCSI), for
others the device name (after `/dev/disk') is returned (`virtual/0').
> 2) Is there support for hidden partitions=3F
> We might also have special driver settings for the partition modules,
> although I am not yet sure where we can use it (to hide intel
> partitions for example).
The extended_partition_info structure has a fields `flags' which can
have the bit B_HIDDEN_PARTITION set (it was a `bool hidden' in the DS
add-on partition_data structure, IIRC). The partition add-ons are
supposed to set that bit, if the partition is a non-data partition
(e.g. an extended one). But I suspect, I are driving at something else,
aren't you?
> 3) Almost all file systems need to have a look in the first 1024
> bytes
> of a partition - it's not very efficient to let every file system
> have
> to allocate a buffer and read that data in.
That's right. I decided to stick close to the DS add-on in this
respect, since I realized, that it would at least not be sufficient to
read only the first logical block and that FSs store their super block
at different location (ReiserFS after 64 KB).
> This access is not cached -
In fact I didn't know that. :-P
> if we have 10 different file systems (which might happen very fast),
> and the last one happen to be the one who says "this is my volume",
> we
> would most probably have to allocate and read this data 10 times
> physically from the disk.
> It would be much nicer if the sniffer function would pass a buffer
> and
> a position/size like this:
> sniff(..., void **buffer, size=5Ft *=5FbufferSize, off=5Ft *=
> 5Foffset, ...);
>
> Or have it pass a pointer to a function which the sniffer can use to
> get data from the partition - it could directly return a buffer.
> That way, we wouldn't need to read that data over and over again, and
> we also wouldn't need to allocate/deallocate the buffer over and over
> again.
That sounds good! I definitely favor this solution.
CU, Ingo
Other related posts: