Merge tag 'pcmcia-6.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 8 Nov 2023 00:40:42 +0000 (16:40 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 8 Nov 2023 00:40:42 +0000 (16:40 -0800)
Pull PCMCIA updates from Dominik Brodowski:
 "Cleanups and fixes.

  Yang Yingliang has fixed a number of resource leaks and Dongliang Mu
  contributed a spelling fix for the PCMCIA core. Also included is a
  tiny clenaup to the tcic PCMCIA socket driver provided by lizhe"

* tag 'pcmcia-6.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/linux:
  pcmcia: tcic: remove unneeded "&" in call to setup_timer()
  pcmcia: typo fix
  pcmcia: ds: fix possible name leak in error path in pcmcia_device_add()
  pcmcia: ds: fix refcount leak in pcmcia_device_add()
  pcmcia: cs: fix possible hung task and memory leak pccardd()

drivers/pcmcia/cs.c
drivers/pcmcia/ds.c
drivers/pcmcia/pcmcia_resource.c
drivers/pcmcia/tcic.c

index 5658745..b33be1e 100644 (file)
@@ -605,6 +605,7 @@ static int pccardd(void *__skt)
                dev_warn(&skt->dev, "PCMCIA: unable to register socket\n");
                skt->thread = NULL;
                complete(&skt->thread_done);
+               put_device(&skt->dev);
                return 0;
        }
        ret = pccard_sysfs_add_socket(&skt->dev);
index d500e5d..b4b8363 100644 (file)
@@ -513,9 +513,6 @@ static struct pcmcia_device *pcmcia_device_add(struct pcmcia_socket *s,
        /* by default don't allow DMA */
        p_dev->dma_mask = 0;
        p_dev->dev.dma_mask = &p_dev->dma_mask;
-       dev_set_name(&p_dev->dev, "%d.%d", p_dev->socket->sock, p_dev->device_no);
-       if (!dev_name(&p_dev->dev))
-               goto err_free;
        p_dev->devname = kasprintf(GFP_KERNEL, "pcmcia%s", dev_name(&p_dev->dev));
        if (!p_dev->devname)
                goto err_free;
@@ -573,8 +570,15 @@ static struct pcmcia_device *pcmcia_device_add(struct pcmcia_socket *s,
 
        pcmcia_device_query(p_dev);
 
-       if (device_register(&p_dev->dev))
-               goto err_unreg;
+       dev_set_name(&p_dev->dev, "%d.%d", p_dev->socket->sock, p_dev->device_no);
+       if (device_register(&p_dev->dev)) {
+               mutex_lock(&s->ops_mutex);
+               list_del(&p_dev->socket_device_list);
+               s->device_count--;
+               mutex_unlock(&s->ops_mutex);
+               put_device(&p_dev->dev);
+               return NULL;
+       }
 
        return p_dev;
 
index d78091e..e9e31c6 100644 (file)
@@ -684,7 +684,7 @@ EXPORT_SYMBOL(pcmcia_request_io);
  * pcmcia_request_irq() is a wrapper around request_irq() which allows
  * the PCMCIA core to clean up the registration in pcmcia_disable_device().
  * Drivers are free to use request_irq() directly, but then they need to
- * call free_irq() themselfves, too. Also, only %IRQF_SHARED capable IRQ
+ * call free_irq() themselves, too. Also, only %IRQF_SHARED capable IRQ
  * handlers are allowed.
  */
 int __must_check pcmcia_request_irq(struct pcmcia_device *p_dev,
index 1a0e3f0..5ef8886 100644 (file)
@@ -435,7 +435,7 @@ static int __init init_tcic(void)
     }
     
     /* Set up polling */
-    timer_setup(&poll_timer, &tcic_timer, 0);
+    timer_setup(&poll_timer, tcic_timer, 0);
 
     /* Build interrupt mask */
     printk(KERN_CONT ", %d sockets\n", sockets);