diff options
-rw-r--r-- | drivers/block/cpqarray.c | 32 |
1 files changed, 10 insertions, 22 deletions
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index 28937b661564..9473215956f9 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c | |||
@@ -1255,17 +1255,11 @@ static int ida_ctlr_ioctl(ctlr_info_t *h, int dsk, ida_ioctl_t *io) | |||
1255 | /* Pre submit processing */ | 1255 | /* Pre submit processing */ |
1256 | switch(io->cmd) { | 1256 | switch(io->cmd) { |
1257 | case PASSTHRU_A: | 1257 | case PASSTHRU_A: |
1258 | p = kmalloc(io->sg[0].size, GFP_KERNEL); | 1258 | p = memdup_user(io->sg[0].addr, io->sg[0].size); |
1259 | if (!p) | 1259 | if (IS_ERR(p)) { |
1260 | { | 1260 | error = PTR_ERR(p); |
1261 | error = -ENOMEM; | 1261 | cmd_free(h, c, 0); |
1262 | cmd_free(h, c, 0); | 1262 | return error; |
1263 | return(error); | ||
1264 | } | ||
1265 | if (copy_from_user(p, io->sg[0].addr, io->sg[0].size)) { | ||
1266 | kfree(p); | ||
1267 | cmd_free(h, c, 0); | ||
1268 | return -EFAULT; | ||
1269 | } | 1263 | } |
1270 | c->req.hdr.blk = pci_map_single(h->pci_dev, &(io->c), | 1264 | c->req.hdr.blk = pci_map_single(h->pci_dev, &(io->c), |
1271 | sizeof(ida_ioctl_t), | 1265 | sizeof(ida_ioctl_t), |
@@ -1296,18 +1290,12 @@ static int ida_ctlr_ioctl(ctlr_info_t *h, int dsk, ida_ioctl_t *io) | |||
1296 | case DIAG_PASS_THRU: | 1290 | case DIAG_PASS_THRU: |
1297 | case COLLECT_BUFFER: | 1291 | case COLLECT_BUFFER: |
1298 | case WRITE_FLASH_ROM: | 1292 | case WRITE_FLASH_ROM: |
1299 | p = kmalloc(io->sg[0].size, GFP_KERNEL); | 1293 | p = memdup_user(io->sg[0].addr, io->sg[0].size); |
1300 | if (!p) | 1294 | if (IS_ERR(p)) { |
1301 | { | 1295 | error = PTR_ERR(p); |
1302 | error = -ENOMEM; | 1296 | cmd_free(h, c, 0); |
1303 | cmd_free(h, c, 0); | 1297 | return error; |
1304 | return(error); | ||
1305 | } | 1298 | } |
1306 | if (copy_from_user(p, io->sg[0].addr, io->sg[0].size)) { | ||
1307 | kfree(p); | ||
1308 | cmd_free(h, c, 0); | ||
1309 | return -EFAULT; | ||
1310 | } | ||
1311 | c->req.sg[0].size = io->sg[0].size; | 1299 | c->req.sg[0].size = io->sg[0].size; |
1312 | c->req.sg[0].addr = pci_map_single(h->pci_dev, p, | 1300 | c->req.sg[0].addr = pci_map_single(h->pci_dev, p, |
1313 | c->req.sg[0].size, PCI_DMA_BIDIRECTIONAL); | 1301 | c->req.sg[0].size, PCI_DMA_BIDIRECTIONAL); |