Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1b502217 authored by Denis V. Lunev's avatar Denis V. Lunev Committed by Linus Torvalds
Browse files

drivers: use non-racy method for proc entries creation



Use proc_create()/proc_create_data() to make sure that ->proc_fops and ->data
be setup before gluing PDE to main tree.

Signed-off-by: default avatarDenis V. Lunev <den@openvz.org>
Acked-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Acked-by: default avatarDmitry Torokhov <dtor@mail.ru>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 0fd68946
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ static int i8k_ioctl(struct inode *, struct file *, unsigned int,
		     unsigned long);

static const struct file_operations i8k_fops = {
	.owner		= THIS_MODULE,
	.open		= i8k_open_fs,
	.read		= seq_read,
	.llseek		= seq_lseek,
@@ -554,13 +555,10 @@ static int __init i8k_init(void)
		return -ENODEV;

	/* Register the proc entry */
	proc_i8k = create_proc_entry("i8k", 0, NULL);
	proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops);
	if (!proc_i8k)
		return -ENOENT;

	proc_i8k->proc_fops = &i8k_fops;
	proc_i8k->owner = THIS_MODULE;

	printk(KERN_INFO
	       "Dell laptop SMM driver v%s Massimo Dal Zotto (dz@debian.org)\n",
	       I8K_VERSION);
+15 −12
Original line number Diff line number Diff line
@@ -263,23 +263,26 @@ EXPORT_SYMBOL(misc_deregister);

static int __init misc_init(void)
{
#ifdef CONFIG_PROC_FS
	struct proc_dir_entry *ent;
	int err;

	ent = create_proc_entry("misc", 0, NULL);
	if (ent)
		ent->proc_fops = &misc_proc_fops;
#ifdef CONFIG_PROC_FS
	proc_create("misc", 0, NULL, &misc_proc_fops);
#endif
	misc_class = class_create(THIS_MODULE, "misc");
	err = PTR_ERR(misc_class);
	if (IS_ERR(misc_class))
		return PTR_ERR(misc_class);
		goto fail_remove;

	if (register_chrdev(MISC_MAJOR,"misc",&misc_fops)) {
		printk("unable to get major %d for misc devices\n",
		       MISC_MAJOR);
		class_destroy(misc_class);
		return -EIO;
	}
	err = -EIO;
	if (register_chrdev(MISC_MAJOR,"misc",&misc_fops))
		goto fail_printk;
	return 0;

fail_printk:
	printk("unable to get major %d for misc devices\n", MISC_MAJOR);
	class_destroy(misc_class);
fail_remove:
	remove_proc_entry("misc", NULL);
	return err;
}
subsys_initcall(misc_init);
+2 −4
Original line number Diff line number Diff line
@@ -1069,10 +1069,8 @@ static int __init rtc_init(void)
	}

#ifdef CONFIG_PROC_FS
	ent = create_proc_entry("driver/rtc", 0, NULL);
	if (ent)
		ent->proc_fops = &rtc_proc_fops;
	else
	ent = proc_create("driver/rtc", 0, NULL, &rtc_proc_fops);
	if (!ent)
		printk(KERN_WARNING "rtc: Failed to register with procfs.\n");
#endif

+1 −2
Original line number Diff line number Diff line
@@ -520,12 +520,11 @@ static int __init toshiba_init(void)
	{
		struct proc_dir_entry *pde;

		pde = create_proc_entry("toshiba", 0, NULL);
		pde = proc_create("toshiba", 0, NULL, &proc_toshiba_fops);
		if (!pde) {
			misc_deregister(&tosh_device);
			return -ENOMEM;
		}
		pde->proc_fops = &proc_toshiba_fops;
	}
#endif

+3 −6
Original line number Diff line number Diff line
@@ -249,6 +249,7 @@ static int proc_viotape_open(struct inode *inode, struct file *file)
}

static const struct file_operations proc_viotape_operations = {
	.owner		= THIS_MODULE,
	.open		= proc_viotape_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
@@ -915,7 +916,6 @@ static struct vio_driver viotape_driver = {
int __init viotap_init(void)
{
	int ret;
	struct proc_dir_entry *e;

	if (!firmware_has_feature(FW_FEATURE_ISERIES))
		return -ENODEV;
@@ -968,11 +968,8 @@ int __init viotap_init(void)
	if (ret)
		goto unreg_class;

	e = create_proc_entry("iSeries/viotape", S_IFREG|S_IRUGO, NULL);
	if (e) {
		e->owner = THIS_MODULE;
		e->proc_fops = &proc_viotape_operations;
	}
	proc_create("iSeries/viotape", S_IFREG|S_IRUGO, NULL,
		    &proc_viotape_operations);

	return 0;