Re: [PATCH][2.6.8-rc1-mm1] drivers/scsi/sg.c gcc341 inlining fix

Bartlomiej Zolnierkiewicz
2004-07-14T15:52:12Z

Hi,

On Wednesday 14 of July 2004 14:16, Mikael Pettersson wrote:
> gcc-3.4.1 errors out in 2.6.8-rc1-mm1 at drivers/scsi/sg.c:
>
> drivers/scsi/sg.c: In function `sg_ioctl':
> drivers/scsi/sg.c:209: sorry, unimplemented: inlining failed in call to
> 'sg_jif_to_ms': function body not available drivers/scsi/sg.c:930: sorry,
> unimplemented: called from here
> make[2]: *** [drivers/scsi/sg.o] Error 1
> make[1]: *** [drivers/scsi] Error 2
> make: *** [drivers] Error 2
>
> sg_jif_to_ms() is marked inline but used defore its function
> body is available. Moving it nearer the top of sg.c (together
> with sg_ms_to_jif() for consistency) fixes the problem.

While your patch is perfectly fine I think we can do better.
I think that we may try converting sg.c to use jiffies_to_msecs()
and msecs_to_jiffies() from <linux/time.h>.

> Signed-off-by: Mikael Pettersson <mikpe@csd.uu.se>
>
> --- linux-2.6.8-rc1-mm1/drivers/scsi/sg.c.~1~ 2004-07-14 12:58:34.000000000
> +0200 +++ linux-2.6.8-rc1-mm1/drivers/scsi/sg.c 2004-07-14
> 13:45:26.000000000 +0200 @@ -225,6 +225,30 @@
> #define SZ_SG_REQ_INFO sizeof(sg_req_info_t)
>
> static int
> +sg_ms_to_jif(unsigned int msecs)
> +{
> + if ((UINT_MAX / 2U) < msecs)
> + return INT_MAX; /* special case, set largest possible */

I don't understand what for is this special case.

> + else
> + return ((int) msecs <
> + (INT_MAX / 1000)) ? (((int) msecs * HZ) / 1000)
> + : (((int) msecs / 1000) * HZ);
> +}

jiffies are unsigned long, isn't this buggy on 64-bit archs?

> +static inline unsigned
> +sg_jif_to_ms(int jifs)
> +{

ditto

> + if (jifs <= 0)
> + return 0U;
> + else {
> + unsigned int j = (unsigned int) jifs;
> + return (j <
> + (UINT_MAX / 1000)) ? ((j * 1000) / HZ) : ((j / HZ) *
> + 1000);
> + }
> +}

also rounding up is missing (jiffies_to_msecs()/msecs_to_jiffies() does it)

Bartlomiej