mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 13:41:51 +00:00
staging: pi433: fix memory leak with using debugfs_lookup()
When calling debugfs_lookup() the result must have dput() called on it, otherwise the memory will leak over time. To make things simpler, just call debugfs_lookup_and_remove() instead which handles all of the logic at once. This requires saving off the root directory dentry to make creation of individual device subdirectories easier. Cc: Paulo Miguel Almeida <paulo.miguel.almeida.rodenas@gmail.com> Cc: Dan Carpenter <error27@gmail.com> Cc: Sidong Yang <realwakka@gmail.com> Cc: Liu Shixin <liushixin2@huawei.com> Cc: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de> Link: https://lore.kernel.org/r/20230202141138.2291946-1-gregkh@linuxfoundation.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
eef4e616e7
commit
2f36e789e5
@ -55,6 +55,7 @@
|
||||
static dev_t pi433_dev;
|
||||
static DEFINE_IDR(pi433_idr);
|
||||
static DEFINE_MUTEX(minor_lock); /* Protect idr accesses */
|
||||
static struct dentry *root_dir; /* debugfs root directory for the driver */
|
||||
|
||||
static struct class *pi433_class; /* mainly for udev to create /dev/pi433 */
|
||||
|
||||
@ -1306,8 +1307,7 @@ static int pi433_probe(struct spi_device *spi)
|
||||
/* spi setup */
|
||||
spi_set_drvdata(spi, device);
|
||||
|
||||
entry = debugfs_create_dir(dev_name(device->dev),
|
||||
debugfs_lookup(KBUILD_MODNAME, NULL));
|
||||
entry = debugfs_create_dir(dev_name(device->dev), root_dir);
|
||||
debugfs_create_file("regs", 0400, entry, device, &pi433_debugfs_regs_fops);
|
||||
|
||||
return 0;
|
||||
@ -1333,9 +1333,8 @@ RX_failed:
|
||||
static void pi433_remove(struct spi_device *spi)
|
||||
{
|
||||
struct pi433_device *device = spi_get_drvdata(spi);
|
||||
struct dentry *mod_entry = debugfs_lookup(KBUILD_MODNAME, NULL);
|
||||
|
||||
debugfs_remove(debugfs_lookup(dev_name(device->dev), mod_entry));
|
||||
debugfs_lookup_and_remove(dev_name(device->dev), root_dir);
|
||||
|
||||
/* free GPIOs */
|
||||
free_gpio(device);
|
||||
@ -1408,7 +1407,7 @@ static int __init pi433_init(void)
|
||||
return PTR_ERR(pi433_class);
|
||||
}
|
||||
|
||||
debugfs_create_dir(KBUILD_MODNAME, NULL);
|
||||
root_dir = debugfs_create_dir(KBUILD_MODNAME, NULL);
|
||||
|
||||
status = spi_register_driver(&pi433_spi_driver);
|
||||
if (status < 0) {
|
||||
@ -1427,7 +1426,7 @@ static void __exit pi433_exit(void)
|
||||
spi_unregister_driver(&pi433_spi_driver);
|
||||
class_destroy(pi433_class);
|
||||
unregister_chrdev(MAJOR(pi433_dev), pi433_spi_driver.driver.name);
|
||||
debugfs_remove_recursive(debugfs_lookup(KBUILD_MODNAME, NULL));
|
||||
debugfs_remove(root_dir);
|
||||
}
|
||||
module_exit(pi433_exit);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user