diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index ad39627..6bb2f55 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -3709,7 +3709,7 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
 	struct ext4_extent newex, *ex, *ex2;
 	struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
 	ext4_fsblk_t newblock = 0;
-	int free_on_err = 0, err = 0, depth, ret;
+	int free_on_err = 0, err = 0, depth, ret, i;
 	unsigned int allocated = 0, offset = 0;
 	unsigned int allocated_clusters = 0, reserved_clusters = 0;
 	unsigned int punched_out = 0;
@@ -3880,6 +3880,21 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
 			err = ext4_ext_rm_leaf(handle, inode, path,
 					       &partial_cluster, map->m_lblk,
 					       map->m_lblk + punched_out);
+			if (err)
+				goto out2;
+
+			/*
+			 * Walk back up the path and remove
+			 * empty index blocks
+			 */
+			for (i = depth - 1; i > 0; i--) {
+				if (path[i].p_hdr->eh_entries == 0) {
+					err = ext4_ext_rm_idx(handle, inode,
+								path + i);
+					if (err)
+						goto out2;
+				}
+			}
 
 			if (!err && path->p_hdr->eh_entries == 0) {
 				/*
