aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ext4/ext4.h2
-rw-r--r--fs/ext4/indirect.c27
-rw-r--r--fs/ext4/inode.c2
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);
2111extern int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock); 2111extern int ext4_ind_calc_metadata_amount(struct inode *inode, sector_t lblock);
2112extern int ext4_ind_trans_blocks(struct inode *inode, int nrblocks, int chunk); 2112extern int ext4_ind_trans_blocks(struct inode *inode, int nrblocks);
2113extern void ext4_ind_truncate(handle_t *, struct inode *inode); 2113extern void ext4_ind_truncate(handle_t *, struct inode *inode);
2114extern int ext4_free_hole_blocks(handle_t *handle, struct inode *inode, 2114extern 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
782int 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 */
786int 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,
4653static int ext4_index_trans_blocks(struct inode *inode, int nrblocks, int chunk) 4653static 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