diff options
-rw-r--r-- | fs/ext4/ext4.h | 2 | ||||
-rw-r--r-- | fs/ext4/indirect.c | 27 | ||||
-rw-r--r-- | fs/ext4/inode.c | 2 |
3 files changed, 11 insertions, 20 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 46674058d251..25e261da871f 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -2109,7 +2109,7 @@ extern ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb, | |||
2109 | const struct iovec *iov, loff_t offset, | 2109 | const struct iovec *iov, loff_t offset, |
2110 | unsigned long nr_segs); | 2110 | unsigned long nr_segs); |
2111 | extern int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock); | 2111 | extern int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock); |
2112 | extern int ext4_ind_trans_blocks(struct inode *inode, int nrblocks, int chunk); | 2112 | extern int ext4_ind_trans_blocks(struct inode *inode, int nrblocks); |
2113 | extern void ext4_ind_truncate(handle_t *, struct inode *inode); | 2113 | extern void ext4_ind_truncate(handle_t *, struct inode *inode); |
2114 | extern int ext4_free_hole_blocks(handle_t *handle, struct inode *inode, | 2114 | extern int ext4_free_hole_blocks(handle_t *handle, struct inode *inode, |
2115 | ext4_lblk_t first, ext4_lblk_t stop); | 2115 | ext4_lblk_t first, ext4_lblk_t stop); |
diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c index b8d5d351e24f..f7742f03cdcb 100644 --- a/fs/ext4/indirect.c +++ b/fs/ext4/indirect.c | |||
@@ -779,27 +779,18 @@ int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock) | |||
779 | return (blk_bits / EXT4_ADDR_PER_BLOCK_BITS(inode->i_sb)) + 1; | 779 | return (blk_bits / EXT4_ADDR_PER_BLOCK_BITS(inode->i_sb)) + 1; |
780 | } | 780 | } |
781 | 781 | ||
782 | int ext4_ind_trans_blocks(struct inode *inode, int nrblocks, int chunk) | 782 | /* |
783 | * Calculate number of indirect blocks touched by mapping @nrblocks logically | ||
784 | * contiguous blocks | ||
785 | */ | ||
786 | int ext4_ind_trans_blocks(struct inode *inode, int nrblocks) | ||
783 | { | 787 | { |
784 | int indirects; | ||
785 | |||
786 | /* if nrblocks are contiguous */ | ||
787 | if (chunk) { | ||
788 | /* | ||
789 | * With N contiguous data blocks, we need at most | ||
790 | * N/EXT4_ADDR_PER_BLOCK(inode->i_sb) + 1 indirect blocks, | ||
791 | * 2 dindirect blocks, and 1 tindirect block | ||
792 | */ | ||
793 | return DIV_ROUND_UP(nrblocks, | ||
794 | EXT4_ADDR_PER_BLOCK(inode->i_sb)) + 4; | ||
795 | } | ||
796 | /* | 788 | /* |
797 | * if nrblocks are not contiguous, worse case, each block touch | 789 | * With N contiguous data blocks, we need at most |
798 | * a indirect block, and each indirect block touch a double indirect | 790 | * N/EXT4_ADDR_PER_BLOCK(inode->i_sb) + 1 indirect blocks, |
799 | * block, plus a triple indirect block | 791 | * 2 dindirect blocks, and 1 tindirect block |
800 | */ | 792 | */ |
801 | indirects = nrblocks * 2 + 1; | 793 | return DIV_ROUND_UP(nrblocks, EXT4_ADDR_PER_BLOCK(inode->i_sb)) + 4; |
802 | return indirects; | ||
803 | } | 794 | } |
804 | 795 | ||
805 | /* | 796 | /* |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 80c710ae470b..23d9a44d721a 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -4653,7 +4653,7 @@ int ext4_getattr(struct vfsmount *mnt, struct dentry *dentry, | |||
4653 | static int ext4_index_trans_blocks(struct inode *inode, int nrblocks, int chunk) | 4653 | static int ext4_index_trans_blocks(struct inode *inode, int nrblocks, int chunk) |
4654 | { | 4654 | { |
4655 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) | 4655 | if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) |
4656 | return ext4_ind_trans_blocks(inode, nrblocks, chunk); | 4656 | return ext4_ind_trans_blocks(inode, nrblocks); |
4657 | return ext4_ext_index_trans_blocks(inode, nrblocks, chunk); | 4657 | return ext4_ext_index_trans_blocks(inode, nrblocks, chunk); |
4658 | } | 4658 | } |
4659 | 4659 | ||