History

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

Linus Torvalds committed 11 years ago

Commit e433b652 parents 763e326 4e5a74f3 files · +12 −16Browse files

Unified · Split

3 files
  1. drivers/misc/mei/main.c +1 −1
  2. drivers/misc/mic/scif/scif_nodeqp.c +5 −10
  3. drivers/parport/share.c +6 −5
drivers/misc/mei/main.c+1−1
@@ -682,7 +682,7 @@ int mei_register(struct mei_device *dev, struct device *parent) · 681 unmodified lines
682682 /* Fill in the data structures */
683683 devno = MKDEV(MAJOR(mei_devt), dev->minor);
684684 cdev_init(&dev->cdev, &mei_fops);
685− dev->cdev.owner = mei_fops.owner;
685+ dev->cdev.owner = parent->driver->owner;
686686
687687 /* Add the device */
688688 ret = cdev_add(&dev->cdev, devno, 1);
drivers/misc/mic/scif/scif_nodeqp.c+5−10
@@ -357,7 +357,7 @@ static void scif_p2p_freesg(struct scatterlist *sg) · 356 unmodified lines
357357 }
358358
359359 static struct scatterlist *
360−scif_p2p_setsg(void __iomem *va, int page_size, int page_cnt)
360+scif_p2p_setsg(phys_addr_t pa, int page_size, int page_cnt)
361361 {
362362 struct scatterlist *sg;
363363 struct page *page;
@@ -368,16 +368,11 @@ scif_p2p_setsg(void __iomem *va, int page_size, int page_cnt) · 4 unmodified lines
368368 return NULL;
369369 sg_init_table(sg, page_cnt);
370370 for (i = 0; i < page_cnt; i++) {
371− page = vmalloc_to_page((void __force *)va);
372− if (!page)
373− goto p2p_sg_err;
371+ page = pfn_to_page(pa >> PAGE_SHIFT);
374372 sg_set_page(&sg[i], page, page_size, 0);
375− va += page_size;
373+ pa += page_size;
376374 }
377375 return sg;
378−p2p_sg_err:
379− kfree(sg);
380− return NULL;
381376 }
382377
383378 /* 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) · 11 unmodified lines
395390 p2p = kzalloc(sizeof(*p2p), GFP_KERNEL);
396391 if (!p2p)
397392 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,
399394 PAGE_SIZE, num_mmio_pages);
400395 if (!p2p->ppi_sg[SCIF_PPI_MMIO])
401396 goto free_p2p;
402397 p2p->sg_nentries[SCIF_PPI_MMIO] = num_mmio_pages;
403398 sg_page_shift = get_order(min(psdev->aper->len, (u64)(1 << 30)));
404399 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,
406401 1 << sg_page_shift,
407402 num_aper_chunks);
408403 p2p->sg_nentries[SCIF_PPI_APER] = num_aper_chunks;
drivers/parport/share.c+6−5
@@ -891,8 +891,10 @@ parport_register_dev_model(struct parport *port, const char *name, · 890 unmodified lines
891891 par_dev->dev.release = free_pardevice;
892892 par_dev->devmodel = true;
893893 ret = device_register(&par_dev->dev);
894− if (ret)
895− goto err_put_dev;
894+ if (ret) {
895+ put_device(&par_dev->dev);
896+ goto err_put_port;
897+ }
896898
897899 /* Chain this onto the list */
898900 par_dev->prev = NULL;
@@ -907,7 +909,8 @@ parport_register_dev_model(struct parport *port, const char *name, · 8 unmodified lines
907909 spin_unlock(&port->physport->pardevice_lock);
908910 pr_debug("%s: cannot grant exclusive access for device %s\n",
909911 port->name, name);
910− goto err_put_dev;
912+ device_unregister(&par_dev->dev);
913+ goto err_put_port;
911914 }
912915 port->flags |= PARPORT_FLAG_EXCL;
913916 }
@@ -938,8 +941,6 @@ parport_register_dev_model(struct parport *port, const char *name, · 24 unmodified lines
938941
939942 return par_dev;
940943
941−err_put_dev:
942− put_device(&par_dev->dev);
943944 err_free_devname:
944945 kfree(devname);
945946 err_free_par_dev: