mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
[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 <[email protected]>
Signed-off-by: Dave Kleikamp <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
c3fcc8137c
commit
a86c618126
12 changed files with 2368 additions and 18 deletions
|
|
@ -5,7 +5,7 @@
|
|||
obj-$(CONFIG_EXT4DEV_FS) += ext4dev.o
|
||||
|
||||
ext4dev-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \
|
||||
ioctl.o namei.o super.o symlink.o hash.o resize.o
|
||||
ioctl.o namei.o super.o symlink.o hash.o resize.o extents.o
|
||||
|
||||
ext4dev-$(CONFIG_EXT4DEV_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o
|
||||
ext4dev-$(CONFIG_EXT4DEV_FS_POSIX_ACL) += acl.o
|
||||
|
|
|
|||
|
|
@ -134,8 +134,7 @@ static int ext4_readdir(struct file * filp,
|
|||
struct buffer_head *bh = NULL;
|
||||
|
||||
map_bh.b_state = 0;
|
||||
err = ext4_get_blocks_handle(NULL, inode, blk, 1,
|
||||
&map_bh, 0, 0);
|
||||
err = ext4_get_blocks_wrap(NULL, inode, blk, 1, &map_bh, 0, 0);
|
||||
if (err > 0) {
|
||||
page_cache_readahead(sb->s_bdev->bd_inode->i_mapping,
|
||||
&filp->f_ra,
|
||||
|
|
|
|||
2075
fs/ext4/extents.c
Normal file
2075
fs/ext4/extents.c
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -615,6 +615,17 @@ got:
|
|||
ext4_std_error(sb, err);
|
||||
goto fail_free_drop;
|
||||
}
|
||||
if (test_opt(sb, EXTENTS)) {
|
||||
EXT4_I(inode)->i_flags |= EXT4_EXTENTS_FL;
|
||||
ext4_ext_tree_init(handle, inode);
|
||||
if (!EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)) {
|
||||
err = ext4_journal_get_write_access(handle, EXT4_SB(sb)->s_sbh);
|
||||
if (err) goto fail;
|
||||
EXT4_SET_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS);
|
||||
BUFFER_TRACE(EXT4_SB(sb)->s_sbh, "call ext4_journal_dirty_metadata");
|
||||
err = ext4_journal_dirty_metadata(handle, EXT4_SB(sb)->s_sbh);
|
||||
}
|
||||
}
|
||||
|
||||
ext4_debug("allocating inode %lu\n", inode->i_ino);
|
||||
goto really_out;
|
||||
|
|
|
|||
|
|
@ -40,8 +40,6 @@
|
|||
#include "xattr.h"
|
||||
#include "acl.h"
|
||||
|
||||
static int ext4_writepage_trans_blocks(struct inode *inode);
|
||||
|
||||
/*
|
||||
* Test whether an inode is a fast symlink.
|
||||
*/
|
||||
|
|
@ -804,6 +802,7 @@ int ext4_get_blocks_handle(handle_t *handle, struct inode *inode,
|
|||
ext4_fsblk_t first_block = 0;
|
||||
|
||||
|
||||
J_ASSERT(!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL));
|
||||
J_ASSERT(handle != NULL || create == 0);
|
||||
depth = ext4_block_to_path(inode,iblock,offsets,&blocks_to_boundary);
|
||||
|
||||
|
|
@ -984,7 +983,7 @@ static int ext4_get_block(struct inode *inode, sector_t iblock,
|
|||
|
||||
get_block:
|
||||
if (ret == 0) {
|
||||
ret = ext4_get_blocks_handle(handle, inode, iblock,
|
||||
ret = ext4_get_blocks_wrap(handle, inode, iblock,
|
||||
max_blocks, bh_result, create, 0);
|
||||
if (ret > 0) {
|
||||
bh_result->b_size = (ret << inode->i_blkbits);
|
||||
|
|
@ -1008,7 +1007,7 @@ struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode,
|
|||
dummy.b_state = 0;
|
||||
dummy.b_blocknr = -1000;
|
||||
buffer_trace_init(&dummy.b_history);
|
||||
err = ext4_get_blocks_handle(handle, inode, block, 1,
|
||||
err = ext4_get_blocks_wrap(handle, inode, block, 1,
|
||||
&dummy, create, 1);
|
||||
/*
|
||||
* ext4_get_blocks_handle() returns number of blocks
|
||||
|
|
@ -1759,7 +1758,7 @@ void ext4_set_aops(struct inode *inode)
|
|||
* This required during truncate. We need to physically zero the tail end
|
||||
* of that block so it doesn't yield old data if the file is later grown.
|
||||
*/
|
||||
static int ext4_block_truncate_page(handle_t *handle, struct page *page,
|
||||
int ext4_block_truncate_page(handle_t *handle, struct page *page,
|
||||
struct address_space *mapping, loff_t from)
|
||||
{
|
||||
ext4_fsblk_t index = from >> PAGE_CACHE_SHIFT;
|
||||
|
|
@ -2263,6 +2262,9 @@ void ext4_truncate(struct inode *inode)
|
|||
return;
|
||||
}
|
||||
|
||||
if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)
|
||||
return ext4_ext_truncate(inode, page);
|
||||
|
||||
handle = start_transaction(inode);
|
||||
if (IS_ERR(handle)) {
|
||||
if (page) {
|
||||
|
|
@ -3003,12 +3005,15 @@ err_out:
|
|||
* block and work out the exact number of indirects which are touched. Pah.
|
||||
*/
|
||||
|
||||
static int ext4_writepage_trans_blocks(struct inode *inode)
|
||||
int ext4_writepage_trans_blocks(struct inode *inode)
|
||||
{
|
||||
int bpp = ext4_journal_blocks_per_page(inode);
|
||||
int indirects = (EXT4_NDIR_BLOCKS % bpp) ? 5 : 3;
|
||||
int ret;
|
||||
|
||||
if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)
|
||||
return ext4_ext_writepage_trans_blocks(inode, bpp);
|
||||
|
||||
if (ext4_should_journal_data(inode))
|
||||
ret = 3 * (bpp + indirects) + 2;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -248,7 +248,6 @@ flags_err:
|
|||
return err;
|
||||
}
|
||||
|
||||
|
||||
default:
|
||||
return -ENOTTY;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -390,6 +390,7 @@ static void ext4_put_super (struct super_block * sb)
|
|||
struct ext4_super_block *es = sbi->s_es;
|
||||
int i;
|
||||
|
||||
ext4_ext_release(sb);
|
||||
ext4_xattr_put_super(sb);
|
||||
jbd2_journal_destroy(sbi->s_journal);
|
||||
if (!(sb->s_flags & MS_RDONLY)) {
|
||||
|
|
@ -454,6 +455,7 @@ static struct inode *ext4_alloc_inode(struct super_block *sb)
|
|||
#endif
|
||||
ei->i_block_alloc_info = NULL;
|
||||
ei->vfs_inode.i_version = 1;
|
||||
memset(&ei->i_cached_extent, 0, sizeof(struct ext4_ext_cache));
|
||||
return &ei->vfs_inode;
|
||||
}
|
||||
|
||||
|
|
@ -677,7 +679,7 @@ enum {
|
|||
Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota,
|
||||
Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_quota, Opt_noquota,
|
||||
Opt_ignore, Opt_barrier, Opt_err, Opt_resize, Opt_usrquota,
|
||||
Opt_grpquota
|
||||
Opt_grpquota, Opt_extents,
|
||||
};
|
||||
|
||||
static match_table_t tokens = {
|
||||
|
|
@ -727,6 +729,7 @@ static match_table_t tokens = {
|
|||
{Opt_quota, "quota"},
|
||||
{Opt_usrquota, "usrquota"},
|
||||
{Opt_barrier, "barrier=%u"},
|
||||
{Opt_extents, "extents"},
|
||||
{Opt_err, NULL},
|
||||
{Opt_resize, "resize"},
|
||||
};
|
||||
|
|
@ -1059,6 +1062,9 @@ clear_qf_name:
|
|||
case Opt_bh:
|
||||
clear_opt(sbi->s_mount_opt, NOBH);
|
||||
break;
|
||||
case Opt_extents:
|
||||
set_opt (sbi->s_mount_opt, EXTENTS);
|
||||
break;
|
||||
default:
|
||||
printk (KERN_ERR
|
||||
"EXT4-fs: Unrecognized mount option \"%s\" "
|
||||
|
|
@ -1787,6 +1793,8 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
|
|||
test_opt(sb,DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA ? "ordered":
|
||||
"writeback");
|
||||
|
||||
ext4_ext_init(sb);
|
||||
|
||||
lock_kernel();
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue