summaryrefslogtreecommitdiff
path: root/drivers/scsi/pmcraid.c
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2017-04-20 19:54:45 +0200
committerMartin K. Petersen <martin.petersen@oracle.com>2017-04-24 18:11:02 -0400
commit3397623b370494fd7e0bca62b7578051482d058d (patch)
tree149c5d54f6a8d244781460dab4c9bf47ffd43e42 /drivers/scsi/pmcraid.c
parent91402608641823fdfd8e18042f20c1a449108514 (diff)
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: f0a955f4eeec ("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>
Diffstat (limited to 'drivers/scsi/pmcraid.c')
-rw-r--r--drivers/scsi/pmcraid.c44
1 files changed, 16 insertions, 28 deletions
diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c
index 3cc858f45838..6ed1bc09f1c1 100644
--- a/drivers/scsi/pmcraid.c
+++ b/drivers/scsi/pmcraid.c
@@ -3322,7 +3322,7 @@ static struct pmcraid_sglist *pmcraid_alloc_sglist(int buflen)
*/
static int pmcraid_copy_sglist(
struct pmcraid_sglist *sglist,
- unsigned long buffer,
+ void __user *buffer,
u32 len,
int direction
)
@@ -3343,11 +3343,9 @@ static int pmcraid_copy_sglist(
kaddr = kmap(page);
if (direction == DMA_TO_DEVICE)
- rc = __copy_from_user(kaddr,
- (void *)buffer,
- bsize_elem);
+ rc = __copy_from_user(kaddr, buffer, bsize_elem);
else
- rc = __copy_to_user((void *)buffer, kaddr, bsize_elem);
+ rc = __copy_to_user(buffer, kaddr, bsize_elem);
kunmap(page);
@@ -3365,13 +3363,9 @@ static int pmcraid_copy_sglist(
kaddr = kmap(page);
if (direction == DMA_TO_DEVICE)
- rc = __copy_from_user(kaddr,
- (void *)buffer,
- len % bsize_elem);
+ rc = __copy_from_user(kaddr, buffer, len % bsize_elem);
else
- rc = __copy_to_user((void *)buffer,
- kaddr,
- len % bsize_elem);
+ rc = __copy_to_user(buffer, kaddr, len % bsize_elem);
kunmap(page);
@@ -3649,17 +3643,17 @@ static long pmcraid_ioctl_passthrough(
struct pmcraid_instance *pinstance,
unsigned int ioctl_cmd,
unsigned int buflen,
- unsigned long arg
+ void __user *arg
)
{
struct pmcraid_passthrough_ioctl_buffer *buffer;
struct pmcraid_ioarcb *ioarcb;
struct pmcraid_cmd *cmd;
struct pmcraid_cmd *cancel_cmd;
- unsigned long request_buffer;
+ void __user *request_buffer;
unsigned long request_offset;
unsigned long lock_flags;
- void *ioasa;
+ void __user *ioasa;
u32 ioasc;
int request_size;
int buffer_size;
@@ -3698,13 +3692,10 @@ static long pmcraid_ioctl_passthrough(
request_buffer = arg + request_offset;
- rc = __copy_from_user(buffer,
- (struct pmcraid_passthrough_ioctl_buffer *) arg,
+ rc = __copy_from_user(buffer, arg,
sizeof(struct pmcraid_passthrough_ioctl_buffer));
- ioasa =
- (void *)(arg +
- offsetof(struct pmcraid_passthrough_ioctl_buffer, ioasa));
+ ioasa = arg + offsetof(struct pmcraid_passthrough_ioctl_buffer, ioasa);
if (rc) {
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_ioctl_header *hdr = NULL;
+ void __user *argp = (void __user *)arg;
int retval = -ENOTTY;
hdr = kmalloc(sizeof(struct pmcraid_ioctl_header), GFP_KERNEL);
@@ -4027,7 +4019,7 @@ static long pmcraid_chr_ioctl(
return -ENOMEM;
}
- retval = pmcraid_check_ioctl_buffer(cmd, (void *)arg, hdr);
+ retval = pmcraid_check_ioctl_buffer(cmd, argp, hdr);
if (retval) {
pmcraid_info("chr_ioctl: header check failed\n");
@@ -4052,10 +4044,8 @@ static long pmcraid_chr_ioctl(
if (cmd == PMCRAID_IOCTL_DOWNLOAD_MICROCODE)
scsi_block_requests(pinstance->host);
- retval = pmcraid_ioctl_passthrough(pinstance,
- cmd,
- hdr->buffer_length,
- arg);
+ retval = pmcraid_ioctl_passthrough(pinstance, cmd,
+ hdr->buffer_length, argp);
if (cmd == PMCRAID_IOCTL_DOWNLOAD_MICROCODE)
scsi_unblock_requests(pinstance->host);
@@ -4063,10 +4053,8 @@ static long pmcraid_chr_ioctl(
case PMCRAID_DRIVER_IOCTL:
arg += sizeof(struct pmcraid_ioctl_header);
- retval = pmcraid_ioctl_driver(pinstance,
- cmd,
- hdr->buffer_length,
- (void __user *)arg);
+ retval = pmcraid_ioctl_driver(pinstance, cmd,
+ hdr->buffer_length, argp);
break;
default: