ext2: add support for extent_map library
authorJens Axboe <jens.axboe@oracle.com>
Tue, 3 Mar 2009 11:12:52 +0000 (12:12 +0100)
committerJens Axboe <jens.axboe@oracle.com>
Tue, 3 Mar 2009 11:12:52 +0000 (12:12 +0100)
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
fs/ext2/ext2.h
fs/ext2/ialloc.c
fs/ext2/inode.c
fs/ext2/super.c

index 3203042b36efa055e456d2c45a37e968ad58034f..912ddfadc33d2e53507a49b751fe7753b4b1968d 100644 (file)
@@ -1,5 +1,6 @@
 #include <linux/fs.h>
 #include <linux/ext2_fs.h>
+#include <linux/extent_map.h>
 
 /*
  * ext2 mount options
@@ -62,6 +63,8 @@ struct ext2_inode_info {
        struct mutex truncate_mutex;
        struct inode    vfs_inode;
        struct list_head i_orphan;      /* unlinked but open inodes */
+
+       struct extent_map_tree extent_tree;
 };
 
 /*
index 66321a877e7458795616e0568c58fac83e0437fd..6045ca8787414898c60323dce7927ec21819780b 100644 (file)
@@ -576,6 +576,7 @@ got:
        ei->i_block_alloc_info = NULL;
        ei->i_block_group = group;
        ei->i_dir_start_lookup = 0;
+       extent_map_tree_init(&ei->extent_tree);
        ei->i_state = EXT2_STATE_NEW;
        ext2_set_inode_flags(inode);
        spin_lock(&sbi->s_next_gen_lock);
index 23fff2f87783f7e8856a6ba3679e2e0057d94767..9c74b729c90c09e6b34e9ecd49e2ae99364feac6 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/module.h>
 #include <linux/writeback.h>
 #include <linux/buffer_head.h>
+#include <linux/extent_map.h>
 #include <linux/mpage.h>
 #include <linux/fiemap.h>
 #include <linux/namei.h>
@@ -72,9 +73,11 @@ void ext2_delete_inode (struct inode * inode)
        if (inode->i_blocks)
                ext2_truncate (inode);
        ext2_free_inode (inode);
+       remove_extent_mappings(&EXT2_I(inode)->extent_tree, 0, (u64)-1);
 
        return;
 no_delete:
+       remove_extent_mappings(&EXT2_I(inode)->extent_tree, 0, (u64)-1);
        clear_inode(inode);     /* We must guarantee clearing of inode... */
 }
 
@@ -711,6 +714,16 @@ int ext2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
                                    ext2_get_block);
 }
 
+static struct extent_map *ext2_map_extent(struct address_space *mapping,
+                                         struct page *page,
+                                         size_t page_offset, loff_t start,
+                                         u64 len, int create, gfp_t gfp_mask)
+{
+       return map_extent_get_block(&EXT2_I(mapping->host)->extent_tree,
+                                   mapping, start, len, create, gfp_mask,
+                                   ext2_get_block);
+}
+
 static int ext2_writepage(struct page *page, struct writeback_control *wbc)
 {
        return block_write_full_page(page, ext2_get_block, wbc);
@@ -817,6 +830,7 @@ const struct address_space_operations ext2_nobh_aops = {
        .direct_IO              = ext2_direct_IO,
        .writepages             = ext2_writepages,
        .migratepage            = buffer_migrate_page,
+       .map_extent             = ext2_map_extent,
 };
 
 /*
@@ -1257,6 +1271,7 @@ struct inode *ext2_iget (struct super_block *sb, unsigned long ino)
        ei->i_state = 0;
        ei->i_block_group = (ino - 1) / EXT2_INODES_PER_GROUP(inode->i_sb);
        ei->i_dir_start_lookup = 0;
+       extent_map_tree_init(&ei->extent_tree);
 
        /*
         * NOTE! The in-memory inode i_data array is in little-endian order
index 7c6e3606f0ecd0d4c4efc64d262b0184b392deaa..5395327a623e8ecb9d6b8f3b0f798400caf1f2c7 100644 (file)
@@ -157,6 +157,7 @@ static struct inode *ext2_alloc_inode(struct super_block *sb)
 
 static void ext2_destroy_inode(struct inode *inode)
 {
+       remove_extent_mappings(&EXT2_I(inode)->extent_tree, 0, (u64)-1);
        kmem_cache_free(ext2_inode_cachep, EXT2_I(inode));
 }
 
@@ -169,6 +170,7 @@ static void init_once(void *foo)
        init_rwsem(&ei->xattr_sem);
 #endif
        mutex_init(&ei->truncate_mutex);
+       extent_map_tree_init(&ei->extent_tree);
        inode_init_once(&ei->vfs_inode);
 }