aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/inode.c
diff options
context:
space:
mode:
authorAlex Tomas <alex@clusterfs.com>2006-10-11 04:21:03 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-10-11 14:14:16 -0400
commita86c61812637c7dd0c57e29880cffd477b62f2e7 (patch)
tree10737307293afde2999a887cfeac32c7d7584aa7 /fs/ext4/inode.c
parentc3fcc8137ce4296ad6ab94f88bd60cbe03d21527 (diff)
[PATCH] ext3: add extent map support
On disk extents format: /* * this is extent on-disk structure * it's used at the bottom of the tree */ struct ext3_extent { __le32 ee_block; /* first logical block extent covers */ __le16 ee_len; /* number of blocks covered by extent */ __le16 ee_start_hi; /* high 16 bits of physical block */ __le32 ee_start; /* low 32 bigs of physical block */ }; Signed-off-by: Alex Tomas <alex@clusterfs.com> Signed-off-by: Dave Kleikamp <shaggy@austin.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r--fs/ext4/inode.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 0d96c7d3bb5b..2b81b1324a6f 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -40,8 +40,6 @@
40#include "xattr.h" 40#include "xattr.h"
41#include "acl.h" 41#include "acl.h"
42 42
43static int ext4_writepage_trans_blocks(struct inode *inode);
44
45/* 43/*
46 * Test whether an inode is a fast symlink. 44 * Test whether an inode is a fast symlink.
47 */ 45 */
@@ -804,6 +802,7 @@ int ext4_get_blocks_handle(handle_t *handle, struct inode *inode,
804 ext4_fsblk_t first_block = 0; 802 ext4_fsblk_t first_block = 0;
805 803
806 804
805 J_ASSERT(!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL));
807 J_ASSERT(handle != NULL || create == 0); 806 J_ASSERT(handle != NULL || create == 0);
808 depth = ext4_block_to_path(inode,iblock,offsets,&blocks_to_boundary); 807 depth = ext4_block_to_path(inode,iblock,offsets,&blocks_to_boundary);
809 808
@@ -984,7 +983,7 @@ static int ext4_get_block(struct inode *inode, sector_t iblock,
984 983
985get_block: 984get_block:
986 if (ret == 0) { 985 if (ret == 0) {
987 ret = ext4_get_blocks_handle(handle, inode, iblock, 986 ret = ext4_get_blocks_wrap(handle, inode, iblock,
988 max_blocks, bh_result, create, 0); 987 max_blocks, bh_result, create, 0);
989 if (ret > 0) { 988 if (ret > 0) {
990 bh_result->b_size = (ret << inode->i_blkbits); 989 bh_result->b_size = (ret << inode->i_blkbits);
@@ -1008,7 +1007,7 @@ struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode,
1008 dummy.b_state = 0; 1007 dummy.b_state = 0;
1009 dummy.b_blocknr = -1000; 1008 dummy.b_blocknr = -1000;
1010 buffer_trace_init(&dummy.b_history); 1009 buffer_trace_init(&dummy.b_history);
1011 err = ext4_get_blocks_handle(handle, inode, block, 1, 1010 err = ext4_get_blocks_wrap(handle, inode, block, 1,
1012 &dummy, create, 1); 1011 &dummy, create, 1);
1013 /* 1012 /*
1014 * ext4_get_blocks_handle() returns number of blocks 1013 * ext4_get_blocks_handle() returns number of blocks
@@ -1759,7 +1758,7 @@ void ext4_set_aops(struct inode *inode)
1759 * This required during truncate. We need to physically zero the tail end 1758 * This required during truncate. We need to physically zero the tail end
1760 * of that block so it doesn't yield old data if the file is later grown. 1759 * of that block so it doesn't yield old data if the file is later grown.
1761 */ 1760 */
1762static int ext4_block_truncate_page(handle_t *handle, struct page *page, 1761int ext4_block_truncate_page(handle_t *handle, struct page *page,
1763 struct address_space *mapping, loff_t from) 1762 struct address_space *mapping, loff_t from)
1764{ 1763{
1765 ext4_fsblk_t index = from >> PAGE_CACHE_SHIFT; 1764 ext4_fsblk_t index = from >> PAGE_CACHE_SHIFT;
@@ -2263,6 +2262,9 @@ void ext4_truncate(struct inode *inode)
2263 return; 2262 return;
2264 } 2263 }
2265 2264
2265 if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)
2266 return ext4_ext_truncate(inode, page);
2267
2266 handle = start_transaction(inode); 2268 handle = start_transaction(inode);
2267 if (IS_ERR(handle)) { 2269 if (IS_ERR(handle)) {
2268 if (page) { 2270 if (page) {
@@ -3003,12 +3005,15 @@ err_out:
3003 * block and work out the exact number of indirects which are touched. Pah. 3005 * block and work out the exact number of indirects which are touched. Pah.
3004 */ 3006 */
3005 3007
3006static int ext4_writepage_trans_blocks(struct inode *inode) 3008int ext4_writepage_trans_blocks(struct inode *inode)
3007{ 3009{
3008 int bpp = ext4_journal_blocks_per_page(inode); 3010 int bpp = ext4_journal_blocks_per_page(inode);
3009 int indirects = (EXT4_NDIR_BLOCKS % bpp) ? 5 : 3; 3011 int indirects = (EXT4_NDIR_BLOCKS % bpp) ? 5 : 3;
3010 int ret; 3012 int ret;
3011 3013
3014 if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)
3015 return ext4_ext_writepage_trans_blocks(inode, bpp);
3016
3012 if (ext4_should_journal_data(inode)) 3017 if (ext4_should_journal_data(inode))
3013 ret = 3 * (bpp + indirects) + 2; 3018 ret = 3 * (bpp + indirects) + 2;
3014 else 3019 else