From c8831c1f2d84614dbec104f0016dfc601dee6313 Mon Sep 17 00:00:00 2001 From: Dmitry Monakhov Date: Sun, 30 Sep 2012 23:03:50 -0400 Subject: [PATCH] --- yaml --- r: 331622 b: refs/heads/master c: 6f2080e64487b9963f9c6ff8a252e1abce98f2d4 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/ext4/extents.c | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index 70875c87b8bf..0e8bba5989f5 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 02d262dffcf4c74e5c4612ee736bdb94f18ed5b9 +refs/heads/master: 6f2080e64487b9963f9c6ff8a252e1abce98f2d4 diff --git a/trunk/fs/ext4/extents.c b/trunk/fs/ext4/extents.c index 5920e75fc05f..c1fcf489e056 100644 --- a/trunk/fs/ext4/extents.c +++ b/trunk/fs/ext4/extents.c @@ -2589,7 +2589,7 @@ static int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start, struct ext4_ext_path *path = NULL; ext4_fsblk_t partial_cluster = 0; handle_t *handle; - int i = 0, err; + int i = 0, err = 0; ext_debug("truncate since %u to %u\n", start, end); @@ -2621,12 +2621,16 @@ static int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start, return PTR_ERR(path); } depth = ext_depth(inode); + /* Leaf not may not exist only if inode has no blocks at all */ ex = path[depth].p_ext; if (!ex) { - ext4_ext_drop_refs(path); - kfree(path); - path = NULL; - goto cont; + if (depth) { + EXT4_ERROR_INODE(inode, + "path[%d].p_hdr == NULL", + depth); + err = -EIO; + } + goto out; } ee_block = le32_to_cpu(ex->ee_block); @@ -2658,8 +2662,6 @@ static int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start, goto out; } } -cont: - /* * We start scanning from right side, freeing all the blocks * after i_size and walking into the tree depth-wise.