Commit b4df2030 authored by Theodore Ts'o's avatar Theodore Ts'o

ext4: Fix potential truncate BUG due to i_prealloc_list being non-empty

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: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent bf068ee2
...@@ -3494,6 +3494,9 @@ void ext4_truncate(struct inode *inode) ...@@ -3494,6 +3494,9 @@ void ext4_truncate(struct inode *inode)
* modify the block allocation tree. * modify the block allocation tree.
*/ */
down_write(&ei->i_data_sem); down_write(&ei->i_data_sem);
ext4_discard_reservation(inode);
/* /*
* The orphan list entry will now protect us from any crash which * The orphan list entry will now protect us from any crash which
* occurs before the truncate completes, so it is now safe to propagate * occurs before the truncate completes, so it is now safe to propagate
...@@ -3563,8 +3566,6 @@ void ext4_truncate(struct inode *inode) ...@@ -3563,8 +3566,6 @@ void ext4_truncate(struct inode *inode)
; ;
} }
ext4_discard_reservation(inode);
up_write(&ei->i_data_sem); up_write(&ei->i_data_sem);
inode->i_mtime = inode->i_ctime = ext4_current_time(inode); inode->i_mtime = inode->i_ctime = ext4_current_time(inode);
ext4_mark_inode_dirty(handle, inode); ext4_mark_inode_dirty(handle, inode);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment