]> err.no Git - linux-2.6/commitdiff
clean up atags exporting code
authorUwe Kleine-König <Uwe.Kleine-Koenig@digi.com>
Thu, 21 Feb 2008 14:04:40 +0000 (15:04 +0100)
committerUwe Kleine-König <Uwe.Kleine-Koenig@digi.com>
Fri, 30 May 2008 08:33:49 +0000 (10:33 +0200)
This gets rid of two static variables (one of them being __initdata)
and a static function.

Signed-off-by: Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com>
Acked-by: Uli Luckas <u.luckas@road.de>
arch/arm/kernel/atags.c

index 56fef9a055042166d35a291ca7b3b08b4d8780b2..42a1a1415fa6c37ee96b742d4bb3c1bdc9a6542d 100644 (file)
@@ -6,9 +6,8 @@
 
 struct buffer {
        size_t size;
-       char *data;
+       char data[];
 };
-static struct buffer tags_buffer;
 
 static int
 read_buffer(char* page, char** start, off_t off, int count,
@@ -28,58 +27,57 @@ read_buffer(char* page, char** start, off_t off, int count,
        return count;
 }
 
-
-static int
-create_proc_entries(void)
-{
-       struct proc_dir_entry* tags_entry;
-
-       tags_entry = create_proc_read_entry("atags", 0400, NULL, read_buffer, &tags_buffer);
-       if (!tags_entry)
-               return -ENOMEM;
-
-       return 0;
-}
-
 #define BOOT_PARAMS_SIZE 1536
-static char __initdata atags_copy_buf[BOOT_PARAMS_SIZE];
-static char __initdata *atags_copy;
+static char __initdata atags_copy[BOOT_PARAMS_SIZE];
 
 void __init save_atags(const struct tag *tags)
 {
-       atags_copy = atags_copy_buf;
-       memcpy(atags_copy, tags, sizeof(atags_copy_buf));
+       memcpy(atags_copy, tags, sizeof(atags_copy));
 }
 
-
 static int __init init_atags_procfs(void)
 {
-       struct tag *tag;
-       int error;
+       /*
+        * This cannot go into save_atags() because kmalloc and proc don't work
+        * yet when it is called.
+        */
+       struct proc_dir_entry *tags_entry;
+       struct tag *tag = (struct tag *)atags_copy;
+       struct buffer *b;
+       size_t size;
 
-       if (!atags_copy) {
-               printk(KERN_WARNING "Exporting ATAGs: No saved tags found\n");
-               return -EIO;
+       if (tag->hdr.tag != ATAG_CORE) {
+               printk(KERN_INFO "No ATAGs?");
+               return -EINVAL;
        }
 
-       for (tag = (struct tag *) atags_copy; tag->hdr.size; tag = tag_next(tag))
+       for (; tag->hdr.size; tag = tag_next(tag))
                ;
 
-       tags_buffer.size = ((char *) tag - atags_copy) + sizeof(tag->hdr);
-       tags_buffer.data = kmalloc(tags_buffer.size, GFP_KERNEL);
-       if (tags_buffer.data == NULL)
-               return -ENOMEM;
-       memcpy(tags_buffer.data, atags_copy, tags_buffer.size);
-
-       error = create_proc_entries();
-       if (error) {
-               printk(KERN_ERR "Exporting ATAGs: not enough memory\n");
-               kfree(tags_buffer.data);
-               tags_buffer.size = 0;
-               tags_buffer.data = NULL;
-       }
+       /* include the terminating ATAG_NONE */
+       size = (char *)tag - atags_copy + sizeof(struct tag_header);
 
-       return error;
-}
+       WARN_ON(tag->hdr.tag != ATAG_NONE);
+
+       b = kmalloc(sizeof(*b) + size, GFP_KERNEL);
+       if (!b)
+               goto nomem;
 
+       b->size = size;
+       memcpy(b->data, atags_copy, size);
+
+       tags_entry = create_proc_read_entry("atags", 0400,
+                       NULL, read_buffer, b);
+
+       if (!tags_entry)
+               goto nomem;
+
+       return 0;
+
+nomem:
+       kfree(b);
+       printk(KERN_ERR "Exporting ATAGs: not enough memory\n");
+
+       return -ENOMEM;
+}
 arch_initcall(init_atags_procfs);