aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-07-25 22:50:59 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-07-25 22:50:59 -0400
commite433b6560dd4e83a4241b702c2890bbf2eac64e7 (patch)
tree56b3a67f4b8b7a1bfdf037b97af12b2fb299e84f
parent763e326c8bcded22460fb25def2ed0e2459dcc8d (diff)
parent4e5a74f1db8d6bea48306126fd445e2720f07a95 (diff)
Merge tag 'char-misc-4.2-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char/misc driver fixes from Greg KH: "Here are some char and misc driver fixes for reported issues. One parport patch is reverted as it was incorrect, thanks to testing by the 0-day bot" * tag 'char-misc-4.2-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: parport: Revert "parport: fix memory leak" mei: prevent unloading mei hw modules while the device is opened. misc: mic: scif bug fix for vmalloc_to_page crash parport: fix freeing freed memory parport: fix memory leak parport: fix error handling
-rw-r--r--drivers/misc/mei/main.c2
-rw-r--r--drivers/misc/mic/scif/scif_nodeqp.c15
-rw-r--r--drivers/parport/share.c11
3 files changed, 12 insertions, 16 deletions
diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c
index 8eb0a9500a90..e9513d651cd3 100644
--- a/drivers/misc/mei/main.c
+++ b/drivers/misc/mei/main.c
@@ -682,7 +682,7 @@ int mei_register(struct mei_device *dev, struct device *parent)
682 /* Fill in the data structures */ 682 /* Fill in the data structures */
683 devno = MKDEV(MAJOR(mei_devt), dev->minor); 683 devno = MKDEV(MAJOR(mei_devt), dev->minor);
684 cdev_init(&dev->cdev, &mei_fops); 684 cdev_init(&dev->cdev, &mei_fops);
685 dev->cdev.owner = mei_fops.owner; 685 dev->cdev.owner = parent->driver->owner;
686 686
687 /* Add the device */ 687 /* Add the device */
688 ret = cdev_add(&dev->cdev, devno, 1); 688 ret = cdev_add(&dev->cdev, devno, 1);
diff --git a/drivers/misc/mic/scif/scif_nodeqp.c b/drivers/misc/mic/scif/scif_nodeqp.c
index 41e3bdb10061..6dfdae3452d6 100644
--- a/drivers/misc/mic/scif/scif_nodeqp.c
+++ b/drivers/misc/mic/scif/scif_nodeqp.c
@@ -357,7 +357,7 @@ static void scif_p2p_freesg(struct scatterlist *sg)
357} 357}
358 358
359static struct scatterlist * 359static struct scatterlist *
360scif_p2p_setsg(void __iomem *va, int page_size, int page_cnt) 360scif_p2p_setsg(phys_addr_t pa, int page_size, int page_cnt)
361{ 361{
362 struct scatterlist *sg; 362 struct scatterlist *sg;
363 struct page *page; 363 struct page *page;
@@ -368,16 +368,11 @@ scif_p2p_setsg(void __iomem *va, int page_size, int page_cnt)
368 return NULL; 368 return NULL;
369 sg_init_table(sg, page_cnt); 369 sg_init_table(sg, page_cnt);
370 for (i = 0; i < page_cnt; i++) { 370 for (i = 0; i < page_cnt; i++) {
371 page = vmalloc_to_page((void __force *)va); 371 page = pfn_to_page(pa >> PAGE_SHIFT);
372 if (!page)
373 goto p2p_sg_err;
374 sg_set_page(&sg[i], page, page_size, 0); 372 sg_set_page(&sg[i], page, page_size, 0);
375 va += page_size; 373 pa += page_size;
376 } 374 }
377 return sg; 375 return sg;
378p2p_sg_err:
379 kfree(sg);
380 return NULL;
381} 376}
382 377
383/* Init p2p mappings required to access peerdev from scifdev */ 378/* Init p2p mappings required to access peerdev from scifdev */
@@ -395,14 +390,14 @@ scif_init_p2p_info(struct scif_dev *scifdev, struct scif_dev *peerdev)
395 p2p = kzalloc(sizeof(*p2p), GFP_KERNEL); 390 p2p = kzalloc(sizeof(*p2p), GFP_KERNEL);
396 if (!p2p) 391 if (!p2p)
397 return NULL; 392 return NULL;
398 p2p->ppi_sg[SCIF_PPI_MMIO] = scif_p2p_setsg(psdev->mmio->va, 393 p2p->ppi_sg[SCIF_PPI_MMIO] = scif_p2p_setsg(psdev->mmio->pa,
399 PAGE_SIZE, num_mmio_pages); 394 PAGE_SIZE, num_mmio_pages);
400 if (!p2p->ppi_sg[SCIF_PPI_MMIO]) 395 if (!p2p->ppi_sg[SCIF_PPI_MMIO])
401 goto free_p2p; 396 goto free_p2p;
402 p2p->sg_nentries[SCIF_PPI_MMIO] = num_mmio_pages; 397 p2p->sg_nentries[SCIF_PPI_MMIO] = num_mmio_pages;
403 sg_page_shift = get_order(min(psdev->aper->len, (u64)(1 << 30))); 398 sg_page_shift = get_order(min(psdev->aper->len, (u64)(1 << 30)));
404 num_aper_chunks = num_aper_pages >> (sg_page_shift - PAGE_SHIFT); 399 num_aper_chunks = num_aper_pages >> (sg_page_shift - PAGE_SHIFT);
405 p2p->ppi_sg[SCIF_PPI_APER] = scif_p2p_setsg(psdev->aper->va, 400 p2p->ppi_sg[SCIF_PPI_APER] = scif_p2p_setsg(psdev->aper->pa,
406 1 << sg_page_shift, 401 1 << sg_page_shift,
407 num_aper_chunks); 402 num_aper_chunks);
408 p2p->sg_nentries[SCIF_PPI_APER] = num_aper_chunks; 403 p2p->sg_nentries[SCIF_PPI_APER] = num_aper_chunks;
diff --git a/drivers/parport/share.c b/drivers/parport/share.c
index 8067f54ce050..5ce5ef211bdb 100644
--- a/drivers/parport/share.c
+++ b/drivers/parport/share.c
@@ -891,8 +891,10 @@ parport_register_dev_model(struct parport *port, const char *name,
891 par_dev->dev.release = free_pardevice; 891 par_dev->dev.release = free_pardevice;
892 par_dev->devmodel = true; 892 par_dev->devmodel = true;
893 ret = device_register(&par_dev->dev); 893 ret = device_register(&par_dev->dev);
894 if (ret) 894 if (ret) {
895 goto err_put_dev; 895 put_device(&par_dev->dev);
896 goto err_put_port;
897 }
896 898
897 /* Chain this onto the list */ 899 /* Chain this onto the list */
898 par_dev->prev = NULL; 900 par_dev->prev = NULL;
@@ -907,7 +909,8 @@ parport_register_dev_model(struct parport *port, const char *name,
907 spin_unlock(&port->physport->pardevice_lock); 909 spin_unlock(&port->physport->pardevice_lock);
908 pr_debug("%s: cannot grant exclusive access for device %s\n", 910 pr_debug("%s: cannot grant exclusive access for device %s\n",
909 port->name, name); 911 port->name, name);
910 goto err_put_dev; 912 device_unregister(&par_dev->dev);
913 goto err_put_port;
911 } 914 }
912 port->flags |= PARPORT_FLAG_EXCL; 915 port->flags |= PARPORT_FLAG_EXCL;
913 } 916 }
@@ -938,8 +941,6 @@ parport_register_dev_model(struct parport *port, const char *name,
938 941
939 return par_dev; 942 return par_dev;
940 943
941err_put_dev:
942 put_device(&par_dev->dev);
943err_free_devname: 944err_free_devname:
944 kfree(devname); 945 kfree(devname);
945err_free_par_dev: 946err_free_par_dev: