diff options
Diffstat (limited to '0001-misc-convert-to-guards.patch')
| -rw-r--r-- | 0001-misc-convert-to-guards.patch | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/0001-misc-convert-to-guards.patch b/0001-misc-convert-to-guards.patch new file mode 100644 index 00000000000000..be8763cca4551d --- /dev/null +++ b/0001-misc-convert-to-guards.patch @@ -0,0 +1,166 @@ +From 997e41f41926711ef96e0e0f6cc43321ebbd6e65 Mon Sep 17 00:00:00 2001 +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Date: Mon, 12 Jun 2023 17:34:02 +0200 +Subject: [PATCH] misc: convert to guards + +--- + drivers/char/misc.c | 69 +++++++++++++++++---------------------------- + 1 file changed, 26 insertions(+), 43 deletions(-) + +diff --git a/drivers/char/misc.c b/drivers/char/misc.c +index 1c44c29a666e..9b0418a3dc0d 100644 +--- a/drivers/char/misc.c ++++ b/drivers/char/misc.c +@@ -123,10 +123,9 @@ static int misc_open(struct inode *inode, struct file *file) + { + int minor = iminor(inode); + struct miscdevice *c = NULL, *iter; +- int err = -ENODEV; + const struct file_operations *new_fops = NULL; + +- mutex_lock(&misc_mtx); ++ guard(mutex)(&misc_mtx); + + list_for_each_entry(iter, &misc_list, list) { + if (iter->minor != minor) +@@ -149,7 +148,7 @@ static int misc_open(struct inode *inode, struct file *file) + break; + } + if (!new_fops) +- goto fail; ++ return -ENODEV; + } + + /* +@@ -159,13 +158,11 @@ static int misc_open(struct inode *inode, struct file *file) + */ + file->private_data = c; + +- err = 0; + replace_fops(file, new_fops); + if (file->f_op->open) +- err = file->f_op->open(inode, file); +-fail: +- mutex_unlock(&misc_mtx); +- return err; ++ return file->f_op->open(inode, file); ++ ++ return 0; + } + + static struct class *misc_class; +@@ -197,29 +194,24 @@ static const struct file_operations misc_fops = { + int misc_register(struct miscdevice *misc) + { + dev_t dev; +- int err = 0; + bool is_dynamic = (misc->minor == MISC_DYNAMIC_MINOR); + + INIT_LIST_HEAD(&misc->list); + +- mutex_lock(&misc_mtx); ++ guard(mutex)(&misc_mtx); + + if (is_dynamic) { + int i = misc_minor_alloc(); + +- if (i < 0) { +- err = -EBUSY; +- goto out; +- } ++ if (i < 0) ++ return -EBUSY; + misc->minor = i; + } else { + struct miscdevice *c; + + list_for_each_entry(c, &misc_list, list) { +- if (c->minor == misc->minor) { +- err = -EBUSY; +- goto out; +- } ++ if (c->minor == misc->minor) ++ return -EBUSY; + } + } + +@@ -233,8 +225,7 @@ int misc_register(struct miscdevice *misc) + misc_minor_free(misc->minor); + misc->minor = MISC_DYNAMIC_MINOR; + } +- err = PTR_ERR(misc->this_device); +- goto out; ++ return PTR_ERR(misc->this_device); + } + + /* +@@ -242,9 +233,7 @@ int misc_register(struct miscdevice *misc) + * earlier defaults + */ + list_add(&misc->list, &misc_list); +- out: +- mutex_unlock(&misc_mtx); +- return err; ++ return 0; + } + EXPORT_SYMBOL(misc_register); + +@@ -261,11 +250,10 @@ void misc_deregister(struct miscdevice *misc) + if (WARN_ON(list_empty(&misc->list))) + return; + +- mutex_lock(&misc_mtx); ++ guard(mutex)(&misc_mtx); + list_del(&misc->list); + device_destroy(misc_class, MKDEV(MISC_MAJOR, misc->minor)); + misc_minor_free(misc->minor); +- mutex_unlock(&misc_mtx); + } + EXPORT_SYMBOL(misc_deregister); + +@@ -280,29 +268,24 @@ static char *misc_devnode(const struct device *dev, umode_t *mode) + return NULL; + } + ++DEFINE_FREE(class_destroy, struct class *, if (_T) class_destroy(_T)); ++DEFINE_FREE(remove_misc_proc, struct proc_dir_entry *, if (_T) remove_proc_entry("misc", NULL)); + static int __init misc_init(void) + { +- int err; +- struct proc_dir_entry *ret; ++ struct proc_dir_entry *ret __free(remove_misc_proc) = proc_create_seq("misc", 0, NULL, &misc_seq_ops); ++ struct class *c __free(class_destroy) = class_create("misc"); + +- ret = proc_create_seq("misc", 0, NULL, &misc_seq_ops); +- misc_class = class_create("misc"); +- err = PTR_ERR(misc_class); +- if (IS_ERR(misc_class)) +- goto fail_remove; ++ if (IS_ERR(c)) ++ return PTR_ERR(c); + +- err = -EIO; + if (register_chrdev(MISC_MAJOR, "misc", &misc_fops)) +- goto fail_printk; +- misc_class->devnode = misc_devnode; +- return 0; ++ return -EIO; + +-fail_printk: +- pr_err("unable to get major %d for misc devices\n", MISC_MAJOR); +- class_destroy(misc_class); +-fail_remove: +- if (ret) +- remove_proc_entry("misc", NULL); +- return err; ++ c->devnode = misc_devnode; ++ ++ misc_class = no_free_ptr(c); ++ no_free_ptr(ret); ++ ++ return 0; + } + subsys_initcall(misc_init); +-- +2.44.0 + |
