On Fri, 2013-06-28 at 17:39 +0100, David Howells wrote:
> The MN10300 arch is throwing up an error in the SCSI driver and I'm not sure
> whether it needs fixing in the arch - in get_user() - or in the SCSI code.
> 
> The problem is this line in sg_scsi_ioctl():
> 
>       if (get_user(opcode, sic->data))
> 
> sic points to the following struct:
> 
>       typedef struct scsi_ioctl_command {
>               unsigned int inlen;
>               unsigned int outlen;
>               unsigned char data[0];
>       } Scsi_Ioctl_Command;
> 
> However, __get_user_check() on MN10300 does this:
> 
>       const __typeof__(ptr) __guc_ptr = (ptr);
> 
> which fails with:
> 
>       block/scsi_ioctl.c:450: error: invalid initializer
> 
> The question is what is SCSI actually asking get_user() to do?  As far as I
> can tell, gcc thinks that it's being askied to declare some sort of array
> here.

I'm surprised you need to ask this.  by convention, an array of char is
usable as a pointer to char *.  The compiler therefore thinks this is a
legitimate conversion which doesn't need a cast:

        unsigned char *d = sic->data;

Therefore, sic->data should be usable as a char * pointer everywhere.

> Should the SCSI driver be changed to:
> 
>       if (get_user(opcode, (unsigned char *)sic->data))

can we visit reality for a minute?  That proposal would require us to do
an explicit (unsigned char *) conversion everywhere we use an array as a
pointer value ... good grief, no!

> or should the MN10300 arch be changed to morph the array into a pointer,
> perhaps with:
> 
>       const __typeof__(ptr[0])* __guc_ptr = (ptr);

Neither.  It should do what every other architecture does, which is:

        const __typeof__(*(ptr)) *__guc_ptr = (ptr);

James


--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to