Re: [RFC] lazy allocation of struct block_device

From: Jamie Lokier (lk@tantalophile.demon.co.uk)
Date: Sat Sep 01 2001 - 16:26:59 EST


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/



This archive was generated by hypermail 2b29 : Fri Sep 07 2001 - 21:00:13 EST