Merge branch 'master' of /home/trondmy/kernel/linux-2.6/
[powerpc.git] / fs / jfs / jfs_metapage.c
index 5fbaeaa..e1e0a6e 100644 (file)
@@ -220,8 +220,8 @@ int __init metapage_init(void)
        if (metapage_cache == NULL)
                return -ENOMEM;
 
-       metapage_mempool = mempool_create(METAPOOL_MIN_PAGES, mempool_alloc_slab,
-                                         mempool_free_slab, metapage_cache);
+       metapage_mempool = mempool_create_slab_pool(METAPOOL_MIN_PAGES,
+                                                   metapage_cache);
 
        if (metapage_mempool == NULL) {
                kmem_cache_destroy(metapage_cache);
@@ -542,7 +542,7 @@ add_failed:
 static int metapage_releasepage(struct page *page, gfp_t gfp_mask)
 {
        struct metapage *mp;
-       int busy = 0;
+       int ret = 1;
        unsigned int offset;
 
        for (offset = 0; offset < PAGE_CACHE_SIZE; offset += PSIZE) {
@@ -552,43 +552,32 @@ static int metapage_releasepage(struct page *page, gfp_t gfp_mask)
                        continue;
 
                jfs_info("metapage_releasepage: mp = 0x%p", mp);
-               if (mp->count || mp->nohomeok) {
+               if (mp->count || mp->nohomeok ||
+                   test_bit(META_dirty, &mp->flag)) {
                        jfs_info("count = %ld, nohomeok = %d", mp->count,
                                 mp->nohomeok);
-                       busy = 1;
+                       ret = 0;
                        continue;
                }
-               wait_on_page_writeback(page);
-               //WARN_ON(test_bit(META_dirty, &mp->flag));
-               if (test_bit(META_dirty, &mp->flag)) {
-                       dump_mem("dirty mp in metapage_releasepage", mp,
-                                sizeof(struct metapage));
-                       dump_mem("page", page, sizeof(struct page));
-                       dump_stack();
-               }
                if (mp->lsn)
                        remove_from_logsync(mp);
                remove_metapage(page, mp);
                INCREMENT(mpStat.pagefree);
                free_metapage(mp);
        }
-       if (busy)
-               return -1;
-
-       return 0;
+       return ret;
 }
 
-static int metapage_invalidatepage(struct page *page, unsigned long offset)
+static void metapage_invalidatepage(struct page *page, unsigned long offset)
 {
        BUG_ON(offset);
 
-       if (PageWriteback(page))
-               return 0;
+       BUG_ON(PageWriteback(page));
 
-       return metapage_releasepage(page, 0);
+       metapage_releasepage(page, 0);
 }
 
-struct address_space_operations jfs_metapage_aops = {
+const struct address_space_operations jfs_metapage_aops = {
        .readpage       = metapage_readpage,
        .writepage      = metapage_writepage,
        .sync_page      = block_sync_page,
@@ -643,10 +632,9 @@ struct metapage *__get_metapage(struct inode *inode, unsigned long lblock,
                }
                SetPageUptodate(page);
        } else {
-               page = read_cache_page(mapping, page_index,
-                           (filler_t *)mapping->a_ops->readpage, NULL);
+               page = read_mapping_page(mapping, page_index, NULL);
                if (IS_ERR(page) || !PageUptodate(page)) {
-                       jfs_err("read_cache_page failed!");
+                       jfs_err("read_mapping_page failed!");
                        return NULL;
                }
                lock_page(page);