ext4: fix ext_remove_space for punch_hole case
authorDmitry Monakhov <dmonakhov@openvz.org>
Mon, 1 Oct 2012 03:03:50 +0000 (23:03 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 1 Oct 2012 03:03:50 +0000 (23:03 -0400)
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>
fs/ext4/extents.c

index 5920e75fc05fe07a221672353d95c3d6a035431b..c1fcf489e056dc95e4e8711bdc369a668fa67dbd 100644 (file)
@@ -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 @@ 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);
@@ -2658,8 +2662,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.