61 lines
1.6 KiB
Diff
61 lines
1.6 KiB
Diff
From 66d08dd92b82dabfd64853aa4edde1547fdf9ef7 Mon Sep 17 00:00:00 2001
|
|
From: Dmitry Monakhov <dmonakhov@openvz.org>
|
|
Date: Sun, 30 Sep 2012 23:03:50 -0400
|
|
Subject: [PATCH 10/13] 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>
|
|
(cherry picked from commit 6f2080e64487b9963f9c6ff8a252e1abce98f2d4)
|
|
---
|
|
fs/ext4/extents.c | 16 +++++++++-------
|
|
1 file changed, 9 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
|
|
index 202eb4d..b1c92c0 100644
|
|
--- a/fs/ext4/extents.c
|
|
+++ b/fs/ext4/extents.c
|
|
@@ -2572,7 +2572,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);
|
|
|
|
@@ -2604,12 +2604,16 @@ again:
|
|
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);
|
|
@@ -2641,8 +2645,6 @@ again:
|
|
goto out;
|
|
}
|
|
}
|
|
-cont:
|
|
-
|
|
/*
|
|
* We start scanning from right side, freeing all the blocks
|
|
* after i_size and walking into the tree depth-wise.
|
|
--
|
|
1.7.12.rc0.22.gcdd159b
|
|
|