On Jan 14, 4:27pm, M.Drochner%fz-juelich.de@localhost (Matthias Drochner)
wrote:
-- Subject: Re: HEADS UP: I will be merging christos-time_t by the end of the
|
| dholland-current%netbsd.org@localhost said:
| > What conclusions did we come to regarding PR 39215? I got behind on
| > the discussion there at the time and haven't caught up on it yet.
|
| It has taken a while for me too to catch up -- I've just dug
| out my old patches introducing devmajor_t/devminor_t and
| built a -current kernel.
| I'll append just the basic kernel patches, didn't look at
| the rest yet. In any case there are no binary compatibility
| issues.
|
| > I think your(?) argument that minor numbers are used for array
| > indexing and whatnot and shouldn't be bigger than machine words was
| > fairly persuasive.
|
| I had to notice that something leaked into device drivers which
| shouldn't: Many drivers use macros like
| #define XXXUNIT(dev) (minor(dev) & 0x0f)
| This even lead to printf format changes to print out 64-bit
| device unit numbers. With minor() returning an "int" as before
| this wouldn't happen, and we'd avoid mixing types at other
| places.
|
| I'd say we should at least change major/minor to return ints
| again. Whether new names are introduced is a matter of
| taste, imo it helps clarity.
I think it is best to ask in tech-kern. Now is the good time to do
it, because we can change the format of the dev_t without killing
binary compatibility (because all the dev_t bearing syscalls have
been versioned and we can ride on the version bump). For example
I think that we can use:
/* Major, minor numbers, dev_t's. */
#define omajor(x) ((uint32_t)((((x) & 0x000fff00) >> 8)))
#define ominor(x) ((uint32_t)((((x) & 0xfff00000) >> 12) | \
(((x) & 0x000000ff) >> 0)))
#define omakedev(x,y) ((dev_t)((((x) << 8) & 0x000fff00) | \
(((y) << 12) & 0xfff00000) | \
(((y) << 0) & 0x000000ff)))
#define major(x) (uint32_t)(((x) >> 32) & 0xffffffffULL)
#define minor(x) (uint32_t)(((x) >> 0) & 0xffffffffULL)
#define makedev(x,y) (((dev_t)(x) << 32) | (y))
and then to convert from old style dev to new we can use:
stat_to_stat50(st50, st) {
st50->st_dev = omakedev(major(st->st_dev), minor(st->st_dev));
}
stat50_to_stat(st, st50) {
st->st_dev = makedev(omajor(st50->st_dev),
ominor(st50->st_dev));
}
Same goes for old on disk formats. We check the version of the fs,
and then we do the conversion depending on the version. I think it
makes sense to keep major and minor 32 bits, I don't see a reason
to split otherwise, like major be 24 and minor be 40.
christos