aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ext4/extents.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index e40d2b793f2d..ffcaa1137def 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -3319,7 +3319,7 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
3319 struct ext4_extent_header *eh; 3319 struct ext4_extent_header *eh;
3320 struct ext4_extent newex, *ex, *last_ex; 3320 struct ext4_extent newex, *ex, *last_ex;
3321 ext4_fsblk_t newblock; 3321 ext4_fsblk_t newblock;
3322 int err = 0, depth, ret, cache_type; 3322 int i, err = 0, depth, ret, cache_type;
3323 unsigned int allocated = 0; 3323 unsigned int allocated = 0;
3324 struct ext4_allocation_request ar; 3324 struct ext4_allocation_request ar;
3325 ext4_io_end_t *io = EXT4_I(inode)->cur_aio_dio; 3325 ext4_io_end_t *io = EXT4_I(inode)->cur_aio_dio;
@@ -3508,8 +3508,20 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
3508 goto out2; 3508 goto out2;
3509 } 3509 }
3510 last_ex = EXT_LAST_EXTENT(eh); 3510 last_ex = EXT_LAST_EXTENT(eh);
3511 if (map->m_lblk + ar.len > le32_to_cpu(last_ex->ee_block) 3511 /*
3512 + ext4_ext_get_actual_len(last_ex)) 3512 * If the current leaf block was reached by looking at
3513 * the last index block all the way down the tree, and
3514 * we are extending the inode beyond the last extent
3515 * in the current leaf block, then clear the
3516 * EOFBLOCKS_FL flag.
3517 */
3518 for (i = depth-1; i >= 0; i--) {
3519 if (path[i].p_idx != EXT_LAST_INDEX(path[i].p_hdr))
3520 break;
3521 }
3522 if ((i < 0) &&
3523 (map->m_lblk + ar.len > le32_to_cpu(last_ex->ee_block) +
3524 ext4_ext_get_actual_len(last_ex)))
3513 ext4_clear_inode_flag(inode, EXT4_INODE_EOFBLOCKS); 3525 ext4_clear_inode_flag(inode, EXT4_INODE_EOFBLOCKS);
3514 } 3526 }
3515 err = ext4_ext_insert_extent(handle, inode, path, &newex, flags); 3527 err = ext4_ext_insert_extent(handle, inode, path, &newex, flags);