|
@@ -1316,16 +1316,24 @@ static int free_hole_blocks(handle_t *handle, struct inode *inode,
|
|
|
blk = *i_data;
|
|
|
if (level > 0) {
|
|
|
ext4_lblk_t first2;
|
|
|
+ ext4_lblk_t count2;
|
|
|
+
|
|
|
bh = sb_bread(inode->i_sb, le32_to_cpu(blk));
|
|
|
if (!bh) {
|
|
|
EXT4_ERROR_INODE_BLOCK(inode, le32_to_cpu(blk),
|
|
|
"Read failure");
|
|
|
return -EIO;
|
|
|
}
|
|
|
- first2 = (first > offset) ? first - offset : 0;
|
|
|
+ if (first > offset) {
|
|
|
+ first2 = first - offset;
|
|
|
+ count2 = count;
|
|
|
+ } else {
|
|
|
+ first2 = 0;
|
|
|
+ count2 = count - (offset - first);
|
|
|
+ }
|
|
|
ret = free_hole_blocks(handle, inode, bh,
|
|
|
(__le32 *)bh->b_data, level - 1,
|
|
|
- first2, count - offset,
|
|
|
+ first2, count2,
|
|
|
inode->i_sb->s_blocksize >> 2);
|
|
|
if (ret) {
|
|
|
brelse(bh);
|