Skip to content

Commit

Permalink
ext4: Fix potential truncate BUG due to i_prealloc_list being non-empty
Browse files Browse the repository at this point in the history
We need to call ext4_discard_reservation() earlier in ext4_truncate(),
to avoid a BUG() in ext4_mb_return_to_preallocation(), which is called
(ultimately) by ext4_free_blocks().  So we must ditch the blocks on
i_prealloc_list before we start freeing the data blocks.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
  • Loading branch information
Theodore Ts'o committed Aug 14, 2008
1 parent bf068ee commit b4df203
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions fs/ext4/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -3494,6 +3494,9 @@ void ext4_truncate(struct inode *inode)
* modify the block allocation tree.
*/
down_write(&ei->i_data_sem);

ext4_discard_reservation(inode);

/*
* The orphan list entry will now protect us from any crash which
* occurs before the truncate completes, so it is now safe to propagate
Expand Down Expand Up @@ -3563,8 +3566,6 @@ void ext4_truncate(struct inode *inode)
;
}

ext4_discard_reservation(inode);

up_write(&ei->i_data_sem);
inode->i_mtime = inode->i_ctime = ext4_current_time(inode);
ext4_mark_inode_dirty(handle, inode);
Expand Down

0 comments on commit b4df203

Please sign in to comment.