]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/alpha/kernel/srm_env.c
Merge branch 'vfree' into for-next
[karo-tx-linux.git] / arch / alpha / kernel / srm_env.c
index e64559f0a82dfd1599f803742ba6f474e0c665ba..ffe996a54fadb3db9e0ed8b10dd0f0f1deb6bea5 100644 (file)
@@ -51,13 +51,11 @@ MODULE_LICENSE("GPL");
 typedef struct _srm_env {
        char                    *name;
        unsigned long           id;
-       struct proc_dir_entry   *proc_entry;
 } srm_env_t;
 
 static struct proc_dir_entry   *base_dir;
 static struct proc_dir_entry   *named_dir;
 static struct proc_dir_entry   *numbered_dir;
-static char                    number[256][4];
 
 static srm_env_t       srm_named_entries[] = {
        { "auto_action",        ENV_AUTO_ACTION         },
@@ -77,21 +75,18 @@ static srm_env_t    srm_named_entries[] = {
        { "tty_dev",            ENV_TTY_DEV             },
        { NULL,                 0                       },
 };
-static srm_env_t       srm_numbered_entries[256];
-
 
 static int srm_env_proc_show(struct seq_file *m, void *v)
 {
        unsigned long   ret;
-       srm_env_t       *entry;
+       unsigned long   id = (unsigned long)m->private;
        char            *page;
 
-       entry = m->private;
        page = (char *)__get_free_page(GFP_USER);
        if (!page)
                return -ENOMEM;
 
-       ret = callback_getenv(entry->id, page, PAGE_SIZE);
+       ret = callback_getenv(id, page, PAGE_SIZE);
 
        if ((ret >> 61) == 0) {
                seq_write(m, page, ret);
@@ -104,14 +99,14 @@ static int srm_env_proc_show(struct seq_file *m, void *v)
 
 static int srm_env_proc_open(struct inode *inode, struct file *file)
 {
-       return single_open(file, srm_env_proc_show, PDE(inode)->data);
+       return single_open(file, srm_env_proc_show, PDE_DATA(inode));
 }
 
 static ssize_t srm_env_proc_write(struct file *file, const char __user *buffer,
                                  size_t count, loff_t *pos)
 {
        int res;
-       srm_env_t       *entry = PDE(file_inode(file))->data;
+       unsigned long   id = (unsigned long)PDE_DATA(file_inode(file));
        char            *buf = (char *) __get_free_page(GFP_USER);
        unsigned long   ret1, ret2;
 
@@ -127,7 +122,7 @@ static ssize_t srm_env_proc_write(struct file *file, const char __user *buffer,
                goto out;
        buf[count] = '\0';
 
-       ret1 = callback_setenv(entry->id, buf, count);
+       ret1 = callback_setenv(id, buf, count);
        if ((ret1 >> 61) == 0) {
                do
                        ret2 = callback_save_env();
@@ -149,52 +144,6 @@ static const struct file_operations srm_env_proc_fops = {
        .write          = srm_env_proc_write,
 };
 
-static void
-srm_env_cleanup(void)
-{
-       srm_env_t       *entry;
-       unsigned long   var_num;
-
-       if (base_dir) {
-               /*
-                * Remove named entries
-                */
-               if (named_dir) {
-                       entry = srm_named_entries;
-                       while (entry->name != NULL && entry->id != 0) {
-                               if (entry->proc_entry) {
-                                       remove_proc_entry(entry->name,
-                                                       named_dir);
-                                       entry->proc_entry = NULL;
-                               }
-                               entry++;
-                       }
-                       remove_proc_entry(NAMED_DIR, base_dir);
-               }
-
-               /*
-                * Remove numbered entries
-                */
-               if (numbered_dir) {
-                       for (var_num = 0; var_num <= 255; var_num++) {
-                               entry = &srm_numbered_entries[var_num];
-
-                               if (entry->proc_entry) {
-                                       remove_proc_entry(entry->name,
-                                                       numbered_dir);
-                                       entry->proc_entry       = NULL;
-                                       entry->name             = NULL;
-                               }
-                       }
-                       remove_proc_entry(NUMBERED_DIR, base_dir);
-               }
-
-               remove_proc_entry(BASE_DIR, NULL);
-       }
-
-       return;
-}
-
 static int __init
 srm_env_init(void)
 {
@@ -212,12 +161,6 @@ srm_env_init(void)
                return -ENODEV;
        }
 
-       /*
-        * Init numbers
-        */
-       for (var_num = 0; var_num <= 255; var_num++)
-               sprintf(number[var_num], "%ld", var_num);
-
        /*
         * Create base directory
         */
@@ -225,7 +168,7 @@ srm_env_init(void)
        if (!base_dir) {
                printk(KERN_ERR "Couldn't create base dir /proc/%s\n",
                                BASE_DIR);
-               goto cleanup;
+               return -ENOMEM;
        }
 
        /*
@@ -254,9 +197,8 @@ srm_env_init(void)
         */
        entry = srm_named_entries;
        while (entry->name && entry->id) {
-               entry->proc_entry = proc_create_data(entry->name, 0644, named_dir,
-                                                    &srm_env_proc_fops, entry);
-               if (!entry->proc_entry)
+               if (!proc_create_data(entry->name, 0644, named_dir,
+                            &srm_env_proc_fops, (void *)entry->id))
                        goto cleanup;
                entry++;
        }
@@ -265,15 +207,11 @@ srm_env_init(void)
         * Create all numbered nodes
         */
        for (var_num = 0; var_num <= 255; var_num++) {
-               entry = &srm_numbered_entries[var_num];
-               entry->name = number[var_num];
-
-               entry->proc_entry = proc_create_data(entry->name, 0644, numbered_dir,
-                                                    &srm_env_proc_fops, entry);
-               if (!entry->proc_entry)
+               char name[4];
+               sprintf(name, "%ld", var_num);
+               if (!proc_create_data(name, 0644, numbered_dir,
+                            &srm_env_proc_fops, (void *)var_num))
                        goto cleanup;
-
-               entry->id                       = var_num;
        }
 
        printk(KERN_INFO "%s: version %s loaded successfully\n", NAME,
@@ -282,18 +220,15 @@ srm_env_init(void)
        return 0;
 
 cleanup:
-       srm_env_cleanup();
-
+       remove_proc_subtree(BASE_DIR, NULL);
        return -ENOMEM;
 }
 
 static void __exit
 srm_env_exit(void)
 {
-       srm_env_cleanup();
+       remove_proc_subtree(BASE_DIR, NULL);
        printk(KERN_INFO "%s: unloaded successfully\n", NAME);
-
-       return;
 }
 
 module_init(srm_env_init);