ext4: don't assume extents can't cross block groups when truncating
authorTheodore Ts'o <tytso@mit.edu>
Sat, 2 Aug 2008 01:59:19 +0000 (21:59 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 2 Aug 2008 01:59:19 +0000 (21:59 -0400)
With the FLEX_BG layout, there is no reason why extents can't cross
block groups, so make the truncate code reserve enough credits so we
don't BUG if we come across such an extent.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/extents.c

index f554703eb924db4726ef04347b58416f2de9ea8b..f7529e27d791e34c5634523b2853fbc5a1675b39 100644 (file)
@@ -1910,9 +1910,13 @@ ext4_ext_rm_leaf(handle_t *handle, struct inode *inode,
                        BUG_ON(b != ex_ee_block + ex_ee_len - 1);
                }
 
-               /* at present, extent can't cross block group: */
-               /* leaf + bitmap + group desc + sb + inode */
-               credits = 5;
+               /*
+                * 3 for leaf, sb, and inode plus 2 (bmap and group
+                * descriptor) for each block group; assume two block
+                * groups plus ex_ee_len/blocks_per_block_group for
+                * the worst case
+                */
+               credits = 7 + 2*(ex_ee_len/EXT4_BLOCKS_PER_GROUP(inode->i_sb));
                if (ex == EXT_FIRST_EXTENT(eh)) {
                        correct_index = 1;
                        credits += (ext_depth(inode)) + 1;