aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2015-06-03 19:18:18 -0400
committerDave Chinner <david@fromorbit.com>2015-06-03 19:18:18 -0400
commitec56b1f1fdc69599963574ce94cc5693d535dd64 (patch)
treef24257a8fc533d11218caf0f4653cf30fa024d71
parent5ebe6afaf0057ac3eaeb98defd5456894b446d22 (diff)
xfs: mmap lock needs to be inside freeze protection
Lock ordering for the new mmap lock needs to be: mmap_sem sb_start_pagefault i_mmap_lock page lock <fault processsing> Right now xfs_vm_page_mkwrite gets this the wrong way around, While technically it cannot deadlock due to the current freeze ordering, it's still a landmine that might explode if we change anything in future. Hence we need to nest the locks correctly. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Jan Kara <jack@suse.cz> Reviewed-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
-rw-r--r--fs/xfs/xfs_file.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index 8121e75352ee..0b4e79fd8d05 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -1487,15 +1487,20 @@ xfs_filemap_page_mkwrite(
1487 struct vm_fault *vmf) 1487 struct vm_fault *vmf)
1488{ 1488{
1489 struct xfs_inode *ip = XFS_I(vma->vm_file->f_mapping->host); 1489 struct xfs_inode *ip = XFS_I(vma->vm_file->f_mapping->host);
1490 int error; 1490 int ret;
1491 1491
1492 trace_xfs_filemap_page_mkwrite(ip); 1492 trace_xfs_filemap_page_mkwrite(ip);
1493 1493
1494 sb_start_pagefault(VFS_I(ip)->i_sb);
1495 file_update_time(vma->vm_file);
1494 xfs_ilock(ip, XFS_MMAPLOCK_SHARED); 1496 xfs_ilock(ip, XFS_MMAPLOCK_SHARED);
1495 error = block_page_mkwrite(vma, vmf, xfs_get_blocks); 1497
1498 ret = __block_page_mkwrite(vma, vmf, xfs_get_blocks);
1499
1496 xfs_iunlock(ip, XFS_MMAPLOCK_SHARED); 1500 xfs_iunlock(ip, XFS_MMAPLOCK_SHARED);
1501 sb_end_pagefault(VFS_I(ip)->i_sb);
1497 1502
1498 return error; 1503 return block_page_mkwrite_return(ret);
1499} 1504}
1500 1505
1501const struct file_operations xfs_file_operations = { 1506const struct file_operations xfs_file_operations = {