summaryrefslogtreecommitdiff
path: root/fs/xfs
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2015-06-04 09:18:18 +1000
committerBen Hutchings <ben@decadent.org.uk>2016-06-15 21:29:33 +0100
commita80de2c9dd4c7c129813f9c70853bf97c0372ea0 (patch)
tree0b45d90b4a65d4816b5ce427f219d43fb45600bb /fs/xfs
parent7cafecfabbd7119ca94bd5583411ff245bcbbaec (diff)
xfs: mmap lock needs to be inside freeze protection
commit ec56b1f1fdc69599963574ce94cc5693d535dd64 upstream. 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> Signed-off-by: Ben Hutchings <ben@decadent.org.uk> Cc: Jan Kara <jack@suse.cz> Cc: xfs@oss.sgi.com
Diffstat (limited to 'fs/xfs')
-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 975aaac7494e..d2f4cb598b46 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -1441,15 +1441,20 @@ xfs_filemap_page_mkwrite(
struct vm_fault *vmf)
{
struct xfs_inode *ip = XFS_I(vma->vm_file->f_mapping->host);
- int error;
+ int ret;
trace_xfs_filemap_page_mkwrite(ip);
+ sb_start_pagefault(VFS_I(ip)->i_sb);
+ file_update_time(vma->vm_file);
xfs_ilock(ip, XFS_MMAPLOCK_SHARED);
- error = block_page_mkwrite(vma, vmf, xfs_get_blocks);
+
+ ret = __block_page_mkwrite(vma, vmf, xfs_get_blocks);
+
xfs_iunlock(ip, XFS_MMAPLOCK_SHARED);
+ sb_end_pagefault(VFS_I(ip)->i_sb);
- return error;
+ return block_page_mkwrite_return(ret);
}
const struct file_operations xfs_file_operations = {