diff options
author | Dan Williams <dan.j.williams@intel.com> | 2018-03-12 17:12:29 -0400 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2018-05-22 10:19:08 -0400 |
commit | c63a8eae63d3859c9c7067aa239a4cfd7423a665 (patch) | |
tree | 0dd8ab3bd054ac8171bc46b8a7e31d3261b1c629 /fs/xfs/xfs_iops.c | |
parent | 5fac7408d828719db6d3fdba63e3c3726a6d1ee5 (diff) |
xfs: prepare xfs_break_layouts() to be called with XFS_MMAPLOCK_EXCL
In preparation for adding coordination between extent unmap operations
and busy dax-pages, update xfs_break_layouts() to permit it to be called
with the mmap lock held. This lock scheme will be required for
coordinating the break of 'dax layouts' (non-idle dax (ZONE_DEVICE)
pages mapped into the file's address space). Breaking dax layouts will
be added to xfs_break_layouts() in a future patch, for now this preps
the unmap call sites to take and hold XFS_MMAPLOCK_EXCL over the call to
xfs_break_layouts().
Cc: "Darrick J. Wong" <darrick.wong@oracle.com>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
Cc: Dave Chinner <david@fromorbit.com>
Suggested-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <darrick.wong@oracle.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'fs/xfs/xfs_iops.c')
-rw-r--r-- | fs/xfs/xfs_iops.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index a3ed3c811dfa..138fb36ca875 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c | |||
@@ -1031,13 +1031,17 @@ xfs_vn_setattr( | |||
1031 | 1031 | ||
1032 | if (iattr->ia_valid & ATTR_SIZE) { | 1032 | if (iattr->ia_valid & ATTR_SIZE) { |
1033 | struct xfs_inode *ip = XFS_I(d_inode(dentry)); | 1033 | struct xfs_inode *ip = XFS_I(d_inode(dentry)); |
1034 | uint iolock = XFS_IOLOCK_EXCL; | 1034 | uint iolock; |
1035 | |||
1036 | xfs_ilock(ip, XFS_MMAPLOCK_EXCL); | ||
1037 | iolock = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL; | ||
1035 | 1038 | ||
1036 | error = xfs_break_layouts(d_inode(dentry), &iolock); | 1039 | error = xfs_break_layouts(d_inode(dentry), &iolock); |
1037 | if (error) | 1040 | if (error) { |
1041 | xfs_iunlock(ip, XFS_MMAPLOCK_EXCL); | ||
1038 | return error; | 1042 | return error; |
1043 | } | ||
1039 | 1044 | ||
1040 | xfs_ilock(ip, XFS_MMAPLOCK_EXCL); | ||
1041 | error = xfs_vn_setattr_size(dentry, iattr); | 1045 | error = xfs_vn_setattr_size(dentry, iattr); |
1042 | xfs_iunlock(ip, XFS_MMAPLOCK_EXCL); | 1046 | xfs_iunlock(ip, XFS_MMAPLOCK_EXCL); |
1043 | } else { | 1047 | } else { |