|
@@ -5398,13 +5398,12 @@ static int ext4_indirect_trans_blocks(struct inode *inode, int nrblocks,
|
|
|
/* if nrblocks are contiguous */
|
|
|
if (chunk) {
|
|
|
/*
|
|
|
- * With N contiguous data blocks, it need at most
|
|
|
- * N/EXT4_ADDR_PER_BLOCK(inode->i_sb) indirect blocks
|
|
|
- * 2 dindirect blocks
|
|
|
- * 1 tindirect block
|
|
|
+ * With N contiguous data blocks, we need at most
|
|
|
+ * N/EXT4_ADDR_PER_BLOCK(inode->i_sb) + 1 indirect blocks,
|
|
|
+ * 2 dindirect blocks, and 1 tindirect block
|
|
|
*/
|
|
|
- indirects = nrblocks / EXT4_ADDR_PER_BLOCK(inode->i_sb);
|
|
|
- return indirects + 3;
|
|
|
+ return DIV_ROUND_UP(nrblocks,
|
|
|
+ EXT4_ADDR_PER_BLOCK(inode->i_sb)) + 4;
|
|
|
}
|
|
|
/*
|
|
|
* if nrblocks are not contiguous, worse case, each block touch
|