| From 9b6d49ee0eed619ecf67fbbc04b156426cfdacd3 Mon Sep 17 00:00:00 2001 |
| From: Theodore Ts'o <tytso@mit.edu> |
| Date: Thu, 27 Dec 2012 01:42:48 -0500 |
| Subject: [PATCH] ext4: lock i_mutex when truncating orphan inodes |
| |
| commit 721e3eba21e43532e438652dd8f1fcdfce3187e7 upstream. |
| |
| Commit c278531d39 added a warning when ext4_flush_unwritten_io() is |
| called without i_mutex being taken. It had previously not been taken |
| during orphan cleanup since races weren't possible at that point in |
| the mount process, but as a result of this c278531d39, we will now see |
| a kernel WARN_ON in this case. Take the i_mutex in |
| ext4_orphan_cleanup() to suppress this warning. |
| |
| Reported-by: Alexander Beregalov <a.beregalov@gmail.com> |
| Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> |
| Reviewed-by: Zheng Liu <wenqing.lz@taobao.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| --- |
| fs/ext4/super.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| diff --git a/fs/ext4/super.c b/fs/ext4/super.c |
| index 6928d5ad2c0d..90906948e242 100644 |
| --- a/fs/ext4/super.c |
| +++ b/fs/ext4/super.c |
| @@ -2028,7 +2028,9 @@ static void ext4_orphan_cleanup(struct super_block *sb, |
| __func__, inode->i_ino, inode->i_size); |
| jbd_debug(2, "truncating inode %lu to %lld bytes\n", |
| inode->i_ino, inode->i_size); |
| + mutex_lock(&inode->i_mutex); |
| ext4_truncate(inode); |
| + mutex_unlock(&inode->i_mutex); |
| nr_truncates++; |
| } else { |
| ext4_msg(sb, KERN_DEBUG, |
| -- |
| 1.8.5.2 |
| |