ext4: fix ext_remove_space for punch_hole case

Inode is allowed to have empty leaf only if it this is blockless inode.

Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
Dmitry Monakhov 2012-09-30 23:03:50 -04:00 committed by Theodore Ts'o
parent 02d262dffc
commit 6f2080e644

View File

@ -2589,7 +2589,7 @@ static int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start,
struct ext4_ext_path *path = NULL; struct ext4_ext_path *path = NULL;
ext4_fsblk_t partial_cluster = 0; ext4_fsblk_t partial_cluster = 0;
handle_t *handle; handle_t *handle;
int i = 0, err; int i = 0, err = 0;
ext_debug("truncate since %u to %u\n", start, end); ext_debug("truncate since %u to %u\n", start, end);
@ -2621,12 +2621,16 @@ again:
return PTR_ERR(path); return PTR_ERR(path);
} }
depth = ext_depth(inode); depth = ext_depth(inode);
/* Leaf not may not exist only if inode has no blocks at all */
ex = path[depth].p_ext; ex = path[depth].p_ext;
if (!ex) { if (!ex) {
ext4_ext_drop_refs(path); if (depth) {
kfree(path); EXT4_ERROR_INODE(inode,
path = NULL; "path[%d].p_hdr == NULL",
goto cont; depth);
err = -EIO;
}
goto out;
} }
ee_block = le32_to_cpu(ex->ee_block); ee_block = le32_to_cpu(ex->ee_block);
@ -2658,8 +2662,6 @@ again:
goto out; goto out;
} }
} }
cont:
/* /*
* We start scanning from right side, freeing all the blocks * We start scanning from right side, freeing all the blocks
* after i_size and walking into the tree depth-wise. * after i_size and walking into the tree depth-wise.