]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/mtd/devices/block2mtd.c
MTD: handle pci_name() being const
[linux-2.6-omap-h63xx.git] / drivers / mtd / devices / block2mtd.c
index 3bc92153e2b697450fe7ac1e6cb17eb05388fff5..7b72a1b36115f4b1bf4c581c6d67c1e6f6454566 100644 (file)
@@ -4,7 +4,7 @@
  * block2mtd.c - create an mtd from a block device
  *
  * Copyright (C) 2001,2002     Simon Evans <spse@secret.org.uk>
- * Copyright (C) 2004-2006     Jรถrn Engel <joern@wh.fh-wedel.de>
+ * Copyright (C) 2004-2006     Joern Engel <joern@wh.fh-wedel.de>
  *
  * Licence: GPL
  */
@@ -40,60 +40,11 @@ struct block2mtd_dev {
 static LIST_HEAD(blkmtd_device_list);
 
 
-#define PAGE_READAHEAD 64
-static void cache_readahead(struct address_space *mapping, int index)
+static struct page *page_read(struct address_space *mapping, int index)
 {
-       filler_t *filler = (filler_t*)mapping->a_ops->readpage;
-       int i, pagei;
-       unsigned ret = 0;
-       unsigned long end_index;
-       struct page *page;
-       LIST_HEAD(page_pool);
-       struct inode *inode = mapping->host;
-       loff_t isize = i_size_read(inode);
-
-       if (!isize) {
-               INFO("iSize=0 in cache_readahead\n");
-               return;
-       }
-
-       end_index = ((isize - 1) >> PAGE_CACHE_SHIFT);
-
-       read_lock_irq(&mapping->tree_lock);
-       for (i = 0; i < PAGE_READAHEAD; i++) {
-               pagei = index + i;
-               if (pagei > end_index) {
-                       INFO("Overrun end of disk in cache readahead\n");
-                       break;
-               }
-               page = radix_tree_lookup(&mapping->page_tree, pagei);
-               if (page && (!i))
-                       break;
-               if (page)
-                       continue;
-               read_unlock_irq(&mapping->tree_lock);
-               page = page_cache_alloc_cold(mapping);
-               read_lock_irq(&mapping->tree_lock);
-               if (!page)
-                       break;
-               page->index = pagei;
-               list_add(&page->lru, &page_pool);
-               ret++;
-       }
-       read_unlock_irq(&mapping->tree_lock);
-       if (ret)
-               read_cache_pages(mapping, &page_pool, filler, NULL);
+       return read_mapping_page(mapping, index, NULL);
 }
 
-
-static struct page* page_readahead(struct address_space *mapping, int index)
-{
-       filler_t *filler = (filler_t*)mapping->a_ops->readpage;
-       cache_readahead(mapping, index);
-       return read_cache_page(mapping, index, filler, NULL);
-}
-
-
 /* erase a specified part of the device */
 static int _block2mtd_erase(struct block2mtd_dev *dev, loff_t to, size_t len)
 {
@@ -105,7 +56,7 @@ static int _block2mtd_erase(struct block2mtd_dev *dev, loff_t to, size_t len)
        u_long *max;
 
        while (pages) {
-               page = page_readahead(mapping, index);
+               page = page_read(mapping, index);
                if (!page)
                        return -ENOMEM;
                if (IS_ERR(page))
@@ -174,8 +125,7 @@ static int block2mtd_read(struct mtd_info *mtd, loff_t from, size_t len,
                        cpylen = len;   // this page
                len = len - cpylen;
 
-               //      Get page
-               page = page_readahead(dev->blkdev->bd_inode->i_mapping, index);
+               page = page_read(dev->blkdev->bd_inode->i_mapping, index);
                if (!page)
                        return -ENOMEM;
                if (IS_ERR(page))
@@ -213,8 +163,7 @@ static int _block2mtd_write(struct block2mtd_dev *dev, const u_char *buf,
                        cpylen = len;                   // this page
                len = len - cpylen;
 
-               //      Get page
-               page = page_readahead(mapping, index);
+               page = page_read(mapping, index);
                if (!page)
                        return -ENOMEM;
                if (IS_ERR(page))
@@ -292,6 +241,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size)
 {
        struct block_device *bdev;
        struct block2mtd_dev *dev;
+       char *name;
 
        if (!devname)
                return NULL;
@@ -330,12 +280,13 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size)
 
        /* Setup the MTD structure */
        /* make the name contain the block device in */
-       dev->mtd.name = kmalloc(sizeof("block2mtd: ") + strlen(devname),
+       name = kmalloc(sizeof("block2mtd: ") + strlen(devname) + 1,
                        GFP_KERNEL);
-       if (!dev->mtd.name)
+       if (!name)
                goto devinit_err;
 
-       sprintf(dev->mtd.name, "block2mtd: %s", devname);
+       sprintf(name, "block2mtd: %s", devname);
+       dev->mtd.name = name;
 
        dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK;
        dev->mtd.erasesize = erase_size;
@@ -356,7 +307,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size)
        }
        list_add(&dev->list, &blkmtd_device_list);
        INFO("mtd%d: [%s] erase_size = %dKiB [%d]", dev->mtd.index,
-                       dev->mtd.name + strlen("blkmtd: "),
+                       dev->mtd.name + strlen("block2mtd: "),
                        dev->mtd.erasesize >> 10, dev->mtd.erasesize);
        return dev;
 
@@ -417,14 +368,14 @@ static inline void kill_final_newline(char *str)
 }
 
 
-#define parse_err(fmt, args...) do {           \
-       ERROR("block2mtd: " fmt "\n", ## args); \
-       return 0;                               \
+#define parse_err(fmt, args...) do {   \
+       ERROR(fmt, ## args);            \
+       return 0;                       \
 } while (0)
 
 #ifndef MODULE
 static int block2mtd_init_called = 0;
-static __initdata char block2mtd_paramline[80 + 12]; /* 80 for device, 12 for erase size */
+static char block2mtd_paramline[80 + 12]; /* 80 for device, 12 for erase size */
 #endif
 
 
@@ -459,7 +410,6 @@ static int block2mtd_setup2(const char *val)
        if (token[1]) {
                ret = parse_num(&erase_size, token[1]);
                if (ret) {
-                       kfree(name);
                        parse_err("illegal erase size");
                }
        }
@@ -525,7 +475,7 @@ static void __devexit block2mtd_exit(void)
                block2mtd_sync(&dev->mtd);
                del_mtd_device(&dev->mtd);
                INFO("mtd%d: [%s] removed", dev->mtd.index,
-                               dev->mtd.name + strlen("blkmtd: "));
+                               dev->mtd.name + strlen("block2mtd: "));
                list_del(&dev->list);
                block2mtd_free_device(dev);
        }
@@ -536,5 +486,5 @@ module_init(block2mtd_init);
 module_exit(block2mtd_exit);
 
 MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Simon Evans <spse@secret.org.uk> and others");
+MODULE_AUTHOR("Joern Engel <joern@lazybastard.org>");
 MODULE_DESCRIPTION("Emulate an MTD using a block device");