hwrng: Avoid manual device_create_file() calls
authorTakashi Iwai <tiwai@suse.de>
Mon, 2 Feb 2015 14:44:55 +0000 (15:44 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 25 Mar 2015 10:44:53 +0000 (11:44 +0100)
Use the new group field of struct miscdevice for managing the sysfs
entries instead of manually adding/removing via device_create_file()
and device_remove_file().  This simplifies the code a lot and fixes
the possible races.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/char/hw_random/core.c

index 32a8a867f7f80823c0a9646ab563adf7bb9d0c5d..0a8194525bafa73aa994ac404e44ad9d7d806b9d 100644 (file)
@@ -299,11 +299,14 @@ static const struct file_operations rng_chrdev_ops = {
        .llseek         = noop_llseek,
 };
 
+static const struct attribute_group *rng_dev_groups[];
+
 static struct miscdevice rng_miscdev = {
        .minor          = RNG_MISCDEV_MINOR,
        .name           = RNG_MODULE_NAME,
        .nodename       = "hwrng",
        .fops           = &rng_chrdev_ops,
+       .groups         = rng_dev_groups,
 };
 
 
@@ -376,37 +379,22 @@ static DEVICE_ATTR(rng_available, S_IRUGO,
                   hwrng_attr_available_show,
                   NULL);
 
+static struct attribute *rng_dev_attrs[] = {
+       &dev_attr_rng_current.attr,
+       &dev_attr_rng_available.attr,
+       NULL
+};
+
+ATTRIBUTE_GROUPS(rng_dev);
 
 static void __exit unregister_miscdev(void)
 {
-       device_remove_file(rng_miscdev.this_device, &dev_attr_rng_available);
-       device_remove_file(rng_miscdev.this_device, &dev_attr_rng_current);
        misc_deregister(&rng_miscdev);
 }
 
 static int __init register_miscdev(void)
 {
-       int err;
-
-       err = misc_register(&rng_miscdev);
-       if (err)
-               goto out;
-       err = device_create_file(rng_miscdev.this_device,
-                                &dev_attr_rng_current);
-       if (err)
-               goto err_misc_dereg;
-       err = device_create_file(rng_miscdev.this_device,
-                                &dev_attr_rng_available);
-       if (err)
-               goto err_remove_current;
-out:
-       return err;
-
-err_remove_current:
-       device_remove_file(rng_miscdev.this_device, &dev_attr_rng_current);
-err_misc_dereg:
-       misc_deregister(&rng_miscdev);
-       goto out;
+       return misc_register(&rng_miscdev);
 }
 
 static int hwrng_fillfn(void *unused)