scsi: pmcraid: use __iomem pointers for ioctl argument
kernelci.org reports a new compile warning for old code in the pmcraid
driver:
arch/mips/include/asm/uaccess.h:138:21: warning: passing argument 1 of '__access_ok' makes pointer from integer without a cast [-Wint-conversion]
The warning got introduced by a cleanup to the access_ok() helper that
requires the argument to be a pointer, where the old version silently
accepts 'unsigned long' arguments as it still does on most other
architectures.
The new behavior in MIPS however seems absolutely sensible, and so far I
could only find one other file with the same issue, so the best solution
seems to be to clean up the pmcraid driver.
This makes the driver consistently use 'void __iomem *' pointers for
passing around the address of the user space ioctl arguments, which gets
rid of the kernelci warning as well as several sparse warnings.
Fixes: f0a955f4ee
("mips: sanitize __access_ok()")
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
9140260864
commit
3397623b37
|
@ -3322,7 +3322,7 @@ static struct pmcraid_sglist *pmcraid_alloc_sglist(int buflen)
|
||||||
*/
|
*/
|
||||||
static int pmcraid_copy_sglist(
|
static int pmcraid_copy_sglist(
|
||||||
struct pmcraid_sglist *sglist,
|
struct pmcraid_sglist *sglist,
|
||||||
unsigned long buffer,
|
void __user *buffer,
|
||||||
u32 len,
|
u32 len,
|
||||||
int direction
|
int direction
|
||||||
)
|
)
|
||||||
|
@ -3343,11 +3343,9 @@ static int pmcraid_copy_sglist(
|
||||||
|
|
||||||
kaddr = kmap(page);
|
kaddr = kmap(page);
|
||||||
if (direction == DMA_TO_DEVICE)
|
if (direction == DMA_TO_DEVICE)
|
||||||
rc = __copy_from_user(kaddr,
|
rc = __copy_from_user(kaddr, buffer, bsize_elem);
|
||||||
(void *)buffer,
|
|
||||||
bsize_elem);
|
|
||||||
else
|
else
|
||||||
rc = __copy_to_user((void *)buffer, kaddr, bsize_elem);
|
rc = __copy_to_user(buffer, kaddr, bsize_elem);
|
||||||
|
|
||||||
kunmap(page);
|
kunmap(page);
|
||||||
|
|
||||||
|
@ -3365,13 +3363,9 @@ static int pmcraid_copy_sglist(
|
||||||
kaddr = kmap(page);
|
kaddr = kmap(page);
|
||||||
|
|
||||||
if (direction == DMA_TO_DEVICE)
|
if (direction == DMA_TO_DEVICE)
|
||||||
rc = __copy_from_user(kaddr,
|
rc = __copy_from_user(kaddr, buffer, len % bsize_elem);
|
||||||
(void *)buffer,
|
|
||||||
len % bsize_elem);
|
|
||||||
else
|
else
|
||||||
rc = __copy_to_user((void *)buffer,
|
rc = __copy_to_user(buffer, kaddr, len % bsize_elem);
|
||||||
kaddr,
|
|
||||||
len % bsize_elem);
|
|
||||||
|
|
||||||
kunmap(page);
|
kunmap(page);
|
||||||
|
|
||||||
|
@ -3649,17 +3643,17 @@ static long pmcraid_ioctl_passthrough(
|
||||||
struct pmcraid_instance *pinstance,
|
struct pmcraid_instance *pinstance,
|
||||||
unsigned int ioctl_cmd,
|
unsigned int ioctl_cmd,
|
||||||
unsigned int buflen,
|
unsigned int buflen,
|
||||||
unsigned long arg
|
void __user *arg
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
struct pmcraid_passthrough_ioctl_buffer *buffer;
|
struct pmcraid_passthrough_ioctl_buffer *buffer;
|
||||||
struct pmcraid_ioarcb *ioarcb;
|
struct pmcraid_ioarcb *ioarcb;
|
||||||
struct pmcraid_cmd *cmd;
|
struct pmcraid_cmd *cmd;
|
||||||
struct pmcraid_cmd *cancel_cmd;
|
struct pmcraid_cmd *cancel_cmd;
|
||||||
unsigned long request_buffer;
|
void __user *request_buffer;
|
||||||
unsigned long request_offset;
|
unsigned long request_offset;
|
||||||
unsigned long lock_flags;
|
unsigned long lock_flags;
|
||||||
void *ioasa;
|
void __user *ioasa;
|
||||||
u32 ioasc;
|
u32 ioasc;
|
||||||
int request_size;
|
int request_size;
|
||||||
int buffer_size;
|
int buffer_size;
|
||||||
|
@ -3698,13 +3692,10 @@ static long pmcraid_ioctl_passthrough(
|
||||||
|
|
||||||
request_buffer = arg + request_offset;
|
request_buffer = arg + request_offset;
|
||||||
|
|
||||||
rc = __copy_from_user(buffer,
|
rc = __copy_from_user(buffer, arg,
|
||||||
(struct pmcraid_passthrough_ioctl_buffer *) arg,
|
|
||||||
sizeof(struct pmcraid_passthrough_ioctl_buffer));
|
sizeof(struct pmcraid_passthrough_ioctl_buffer));
|
||||||
|
|
||||||
ioasa =
|
ioasa = arg + offsetof(struct pmcraid_passthrough_ioctl_buffer, ioasa);
|
||||||
(void *)(arg +
|
|
||||||
offsetof(struct pmcraid_passthrough_ioctl_buffer, ioasa));
|
|
||||||
|
|
||||||
if (rc) {
|
if (rc) {
|
||||||
pmcraid_err("ioctl: can't copy passthrough buffer\n");
|
pmcraid_err("ioctl: can't copy passthrough buffer\n");
|
||||||
|
@ -4018,6 +4009,7 @@ static long pmcraid_chr_ioctl(
|
||||||
{
|
{
|
||||||
struct pmcraid_instance *pinstance = NULL;
|
struct pmcraid_instance *pinstance = NULL;
|
||||||
struct pmcraid_ioctl_header *hdr = NULL;
|
struct pmcraid_ioctl_header *hdr = NULL;
|
||||||
|
void __user *argp = (void __user *)arg;
|
||||||
int retval = -ENOTTY;
|
int retval = -ENOTTY;
|
||||||
|
|
||||||
hdr = kmalloc(sizeof(struct pmcraid_ioctl_header), GFP_KERNEL);
|
hdr = kmalloc(sizeof(struct pmcraid_ioctl_header), GFP_KERNEL);
|
||||||
|
@ -4027,7 +4019,7 @@ static long pmcraid_chr_ioctl(
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = pmcraid_check_ioctl_buffer(cmd, (void *)arg, hdr);
|
retval = pmcraid_check_ioctl_buffer(cmd, argp, hdr);
|
||||||
|
|
||||||
if (retval) {
|
if (retval) {
|
||||||
pmcraid_info("chr_ioctl: header check failed\n");
|
pmcraid_info("chr_ioctl: header check failed\n");
|
||||||
|
@ -4052,10 +4044,8 @@ static long pmcraid_chr_ioctl(
|
||||||
if (cmd == PMCRAID_IOCTL_DOWNLOAD_MICROCODE)
|
if (cmd == PMCRAID_IOCTL_DOWNLOAD_MICROCODE)
|
||||||
scsi_block_requests(pinstance->host);
|
scsi_block_requests(pinstance->host);
|
||||||
|
|
||||||
retval = pmcraid_ioctl_passthrough(pinstance,
|
retval = pmcraid_ioctl_passthrough(pinstance, cmd,
|
||||||
cmd,
|
hdr->buffer_length, argp);
|
||||||
hdr->buffer_length,
|
|
||||||
arg);
|
|
||||||
|
|
||||||
if (cmd == PMCRAID_IOCTL_DOWNLOAD_MICROCODE)
|
if (cmd == PMCRAID_IOCTL_DOWNLOAD_MICROCODE)
|
||||||
scsi_unblock_requests(pinstance->host);
|
scsi_unblock_requests(pinstance->host);
|
||||||
|
@ -4063,10 +4053,8 @@ static long pmcraid_chr_ioctl(
|
||||||
|
|
||||||
case PMCRAID_DRIVER_IOCTL:
|
case PMCRAID_DRIVER_IOCTL:
|
||||||
arg += sizeof(struct pmcraid_ioctl_header);
|
arg += sizeof(struct pmcraid_ioctl_header);
|
||||||
retval = pmcraid_ioctl_driver(pinstance,
|
retval = pmcraid_ioctl_driver(pinstance, cmd,
|
||||||
cmd,
|
hdr->buffer_length, argp);
|
||||||
hdr->buffer_length,
|
|
||||||
(void __user *)arg);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue