|
@@ -1255,17 +1255,11 @@ static int ida_ctlr_ioctl(ctlr_info_t *h, int dsk, ida_ioctl_t *io)
|
|
|
/* Pre submit processing */
|
|
|
switch(io->cmd) {
|
|
|
case PASSTHRU_A:
|
|
|
- p = kmalloc(io->sg[0].size, GFP_KERNEL);
|
|
|
- if (!p)
|
|
|
- {
|
|
|
- error = -ENOMEM;
|
|
|
- cmd_free(h, c, 0);
|
|
|
- return(error);
|
|
|
- }
|
|
|
- if (copy_from_user(p, io->sg[0].addr, io->sg[0].size)) {
|
|
|
- kfree(p);
|
|
|
- cmd_free(h, c, 0);
|
|
|
- return -EFAULT;
|
|
|
+ p = memdup_user(io->sg[0].addr, io->sg[0].size);
|
|
|
+ if (IS_ERR(p)) {
|
|
|
+ error = PTR_ERR(p);
|
|
|
+ cmd_free(h, c, 0);
|
|
|
+ return error;
|
|
|
}
|
|
|
c->req.hdr.blk = pci_map_single(h->pci_dev, &(io->c),
|
|
|
sizeof(ida_ioctl_t),
|
|
@@ -1296,18 +1290,12 @@ static int ida_ctlr_ioctl(ctlr_info_t *h, int dsk, ida_ioctl_t *io)
|
|
|
case DIAG_PASS_THRU:
|
|
|
case COLLECT_BUFFER:
|
|
|
case WRITE_FLASH_ROM:
|
|
|
- p = kmalloc(io->sg[0].size, GFP_KERNEL);
|
|
|
- if (!p)
|
|
|
- {
|
|
|
- error = -ENOMEM;
|
|
|
- cmd_free(h, c, 0);
|
|
|
- return(error);
|
|
|
+ p = memdup_user(io->sg[0].addr, io->sg[0].size);
|
|
|
+ if (IS_ERR(p)) {
|
|
|
+ error = PTR_ERR(p);
|
|
|
+ cmd_free(h, c, 0);
|
|
|
+ return error;
|
|
|
}
|
|
|
- if (copy_from_user(p, io->sg[0].addr, io->sg[0].size)) {
|
|
|
- kfree(p);
|
|
|
- cmd_free(h, c, 0);
|
|
|
- return -EFAULT;
|
|
|
- }
|
|
|
c->req.sg[0].size = io->sg[0].size;
|
|
|
c->req.sg[0].addr = pci_map_single(h->pci_dev, p,
|
|
|
c->req.sg[0].size, PCI_DMA_BIDIRECTIONAL);
|