Re: [RFC] lazy allocation of struct block_device

Jamie Lokier (lk@tantalophile.demon.co.uk)
Sat, 1 Sep 2001 22:26:59 +0100


Andries.Brouwer@cwi.nl wrote:
> From viro@math.psu.edu Sat Sep 1 18:26:53 2001
> > A kdev_t is a pointer to a struct that has the info now found in
> > the arrays (and major, minor fields, and a name function..).
> > This struct is allocated by the driver.
>
> Umm... Apply the arguments from the char_device thread - pointers to
> unions are rather bad idea. IOW, kdev_t must die - kernel always
> knows which kind we are dealing with.
>[...]
> However, a union is not so bad. It seems a pity to avoid unions
> and waste 4 bytes for every inode with separate i_bdev and i_cdev
> instead of a single i_bcdev.

Please, a union of different pointer types is much nicer. You can have
i_bdev and i_cdev without wasting any bytes.

This form works with GCC 2.96:

union {
struct char_device * i_cdev;
struct block_device * i_bdev;
};

If you're using a really old compiler that doesn't support anonymous unions,
(GCC 2.95 might be in this category, I'm not sure), then you'll need this:

#define i_bdev __i_bcdev_union.i_bdev
#define i_cdev __i_bcdev_union.i_cdev
union {
struct char_device * i_cdev;
struct block_device * i_bdev;
} __i_bcdev_union;

Either way, you avoid pointers to unions and you also avoid having a
named union type which contains pointers.

-- Jamie
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/