| From a0391a3ae91d301c0e59368531a4de5f0b122bcf Mon Sep 17 00:00:00 2001 |
| From: Jan Kara <jack@suse.cz> |
| Date: Mon, 20 Feb 2012 17:49:56 +0100 |
| Subject: udf: Fix deadlock in udf_release_file() |
| |
| From: Jan Kara <jack@suse.cz> |
| |
| commit a0391a3ae91d301c0e59368531a4de5f0b122bcf upstream. |
| |
| udf_release_file() can be called from munmap() path with mmap_sem held. Thus |
| we cannot take i_mutex there because that ranks above mmap_sem. Luckily, |
| i_mutex is not needed in udf_release_file() anymore since protection by |
| i_data_sem is enough to protect from races with write and truncate. |
| |
| Reported-by: Al Viro <viro@ZenIV.linux.org.uk> |
| Reviewed-by: Namjae Jeon <linkinjeon@gmail.com> |
| Signed-off-by: Jan Kara <jack@suse.cz> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/udf/file.c | 2 -- |
| 1 file changed, 2 deletions(-) |
| |
| --- a/fs/udf/file.c |
| +++ b/fs/udf/file.c |
| @@ -201,12 +201,10 @@ out: |
| static int udf_release_file(struct inode *inode, struct file *filp) |
| { |
| if (filp->f_mode & FMODE_WRITE) { |
| - mutex_lock(&inode->i_mutex); |
| down_write(&UDF_I(inode)->i_data_sem); |
| udf_discard_prealloc(inode); |
| udf_truncate_tail_extent(inode); |
| up_write(&UDF_I(inode)->i_data_sem); |
| - mutex_unlock(&inode->i_mutex); |
| } |
| return 0; |
| } |