>From bf6e48c71803f2c7dfab10196ef43ca1d8f2146f Mon Sep 17 00:00:00 2001 From: Chris Mason Date: Tue, 15 Jan 2008 10:05:46 +0100 Subject: [PATCH] ext2: add support for extent_map API Signed-off-by: Jens Axboe --- fs/ext2/ext2.h | 3 +++ fs/ext2/ialloc.c | 1 + fs/ext2/inode.c | 15 +++++++++++++++ fs/ext2/super.c | 2 ++ 4 files changed, 21 insertions(+), 0 deletions(-) diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h index c87ae29..13c0f77 100644 --- a/fs/ext2/ext2.h +++ b/fs/ext2/ext2.h @@ -1,5 +1,6 @@ #include #include +#include /* * 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; }; /* diff --git a/fs/ext2/ialloc.c b/fs/ext2/ialloc.c index 5deb8b7..d3fe368 100644 --- a/fs/ext2/ialloc.c +++ b/fs/ext2/ialloc.c @@ -584,6 +584,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); diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index b1ab32a..c3555a3 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -31,6 +31,7 @@ #include #include #include +#include #include "ext2.h" #include "acl.h" #include "xip.h" @@ -70,9 +71,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... */ } @@ -709,6 +712,16 @@ int ext2_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_ } +static struct extent_map *ext2_map_extent(struct address_space *mapping, + struct page *page, + size_t page_offset, u64 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); @@ -796,6 +809,7 @@ const struct address_space_operations ext2_aops = { .direct_IO = ext2_direct_IO, .writepages = ext2_writepages, .migratepage = buffer_migrate_page, + .map_extent = ext2_map_extent, }; const struct address_space_operations ext2_aops_xip = { @@ -1242,6 +1256,7 @@ void ext2_read_inode (struct inode * inode) 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 diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 154e25f..d3bcdc1 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c @@ -156,6 +156,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)); } @@ -168,6 +169,7 @@ static void init_once(struct kmem_cache * cachep, 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); } -- 1.5.4.rc2.84.gf85fd