Commit 3397623b authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Martin K. Petersen

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: f0a955f4 ("mips: sanitize __access_ok()")
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 91402608
...@@ -3322,7 +3322,7 @@ static struct pmcraid_sglist *pmcraid_alloc_sglist(int buflen) ...@@ -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( ...@@ -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( ...@@ -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( ...@@ -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( ...@@ -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( ...@@ -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( ...@@ -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( ...@@ -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( ...@@ -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:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment