Re: My Usual Confusion
"Ingo Weinhold" <bonefish-CFLBMwTPW48UNGrzBIF7/[email protected]>
| Newsgroups | gmane.os.openbeos.storage |
|---|---|
| Message-ID | <10755132386-BeMail@graete> |
On Sun, 15 Jun 2003 14:41:43 -0700 Tyler Dauwalder <tyler-cyCl/[email protected] > wrote: [...] > > So, it is indeed a not > > completely trivial task to pick the right type given a child disk > > system. Since, as I believe, more or less all partitioning systems > > provide an identifier for the content type of a partition, > > something > > similar has to be done for all partitioning system modules. > > Well, we'll need a way to map DiskDeviceType.h types to partition > types, anyway, correct? I mean, shouldn't there be a one to one > mapping > of DiskDeviceType.h types to partition types? Yes, that's what I think, too. > Either the partitioning > systems need to know how to map their types given a DiskDeviceType.h > type, or the file systems need to know their correct partition types > for each partitioning system... The latter sounds very scary. Then we would lose the nice independence of partitioning and file systems. Given a DiskDeviceType.h type, the partitioning system should try its best to map it to an actual representation. > > [...] > > > > To fix the problems, basically the concerned partition needs to > > > > be > > > > supplied as well: > > > > > > > > bool SupportsChildSystem(KPartition *child, const char > > > > *system) > > > > const; > > > > bool SupportsParentSystem(KPartition *child, const char * > > > > system) > > > > const; > > > > > > > > `child' would be the partition, which shall be initialized with > > > > a > > > > disk > > > > system, `system' the respectively other disk system. Instead we > > > > could > > > > as well drop both methods, since BPartition::CanInitialize() > > > > can > > > > as > > > > well have both conditions checked in the kernel. Or we also > > > > introduce > > > > a > > > > BDiskSystem::CanInitialize(BPartition*). > > > > > > > > IsSubSystemFor() should still be OK, I think. > > > > > > > > Thoughts? > > > > > > Well, the question intended to be answered by the the > > > SupportsXYZSystem() functions is not whether one can create a > > > partition > > > of a given type, but whether one can initialize an already > > > existing > > > child partition with the given disk system. The two functions > > > together > > > would be used to implement BPartition::CanInitialize(). I suppose > > > the > > > extra KPartition argument could still be useful, though. > > > > > > Btw, shouldn't it be `bool SupportsChildSystem(KPartition * > > > parent, > > > const char *system) const;' instead?. > > > > Then the important information, which child partition is meant, is > > not > > provided. Suppose we want to allow only one extended partition > > (which > > isn't an uncommon constraint), (re-)initializing the already > > existing > > extended partition should succeed, while it should fail for all > > other > > partitions. > > Okay, and you can get the parent via Parent()... I'm up to speed now. > :-) Exactly. :-) > > > Given my original intention to support empty child creation only, > > > what > > > then is really missing is something like: > > > > > > bool SupportsCreateChild(KPartition *parent); > > > > Well, ValidateCreateChild() could be used, but maybe a dedicated > > function would be better. > > If we went with that, I think I would prefer a dedicated function, > since we have them for other ops. OK. [...] > > > and > > > also a way to pass Type() values around. > > > > We pass so many things around, I don't think one more does matter > > that > > much. :-) > > I am just resistive to parameter/function count increases, that's > all. > :-) Hehe. :-) Sure, if things get too worse we should think about refactoring, but currently it's still OK, I think. > > > I don't like that idea, unless > > > you have some compelling arguments otherwise. I don't really > > > think > > > we > > > need it, and don't currently think we'd gain anything by going > > > that > > > route. > > > > I have at least some arguments to be evaluated. > > > > 1) As mentioned above, the parent disk system will be involved (and > > the > > parent partition modified), when a child is being initialized. The > > parent system must known all possible child types. Not only child > > disk > > systems, but child types. The different flavors of FAT for instance > > result in different intel partition types, while there's probably > > only > > one FAT file system module. I'm afraid, that means analyzing the > > initialization parameters for the child disk system, which I don't > > like > > that much. KDiskSystem::ValidateInitialize() could get an optional > > parameter, through which the corresponding type is returned. Then > > this > > type could be passed to the parent system instead. > > By `corresponding type', are you meaning the DiskDeviceTypes.h type? Yes. > > 2) Implementation-wise things would be less uniform, since the > > partitioning system would have to apply changes to the parent > > shadow > > partition on an initialization request from userland. > > Okay. > > > 3) Wouldn't DriveSetup be less convenient and/or powerful? I > > suspect, > > it won't be possible to e.g. create a ReiserFS partition, but don't > > initialize it (the add-on may be read-only anyway). This is even a > > bit > > inconsistent, since in the intel case the newly created partition > > will > > have a certain type (unless there's a value for `undefined', which > > I > > haven't seen till now). > > How about 0xo0? Linux treats it as unformatted, Windows ignores it, > and > partition magic treats it as unpartitioned space. 0x00 indicates an empty partition descriptor. All other values should be set to 0 by writing systems and ignored by reading systems (according to the specification I read). I wouldn't want to use it as a vehicle in our case. [...] > > > As to Type() and ContentType() specifically, I'm also no longer > > > convinced that Type() is all that necessary. I'd just as soon get > > > rid > > > of it and rename ContentType() back to Type(). > > > > I see no problem with that. > > Hooray. :-) I'll remove it. > > > > PS: How about a BPartition::GetDiskSystem(BDiskSystem*)? Then > > > > BPartition::ContentType() wouldn't even need to have any strong > > > > relationship with the disk system's (pretty) name. > > > > > > Having seen the way types would need to laid down using the > > > Type()/ContentType() system, I'd actually much rather just go > > > back > > > to > > > using Type() only (semantically like our current ContentType()) > > > than > > > do > > > this. Though a GetDiskSystem() call could still be useful. > > > > I think, there is a difference between the disk system's pretty > > name > > and the partition's type. E.g. we have several flavors of FAT, but > > only > > one FS module handling all. > > Okay, I see what you're saying now. I also was working under the > assumption that type names could be mapped functionally to disk > system > names, but I finally see why they can't. So yes, we definitely need > GetDiskSystem(). :-) OK, will be added. CU, Ingo