|
@@ -1031,13 +1031,17 @@ xfs_vn_setattr(
|
|
|
|
|
|
if (iattr->ia_valid & ATTR_SIZE) {
|
|
|
struct xfs_inode *ip = XFS_I(d_inode(dentry));
|
|
|
- uint iolock = XFS_IOLOCK_EXCL;
|
|
|
+ uint iolock;
|
|
|
+
|
|
|
+ xfs_ilock(ip, XFS_MMAPLOCK_EXCL);
|
|
|
+ iolock = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL;
|
|
|
|
|
|
error = xfs_break_layouts(d_inode(dentry), &iolock);
|
|
|
- if (error)
|
|
|
+ if (error) {
|
|
|
+ xfs_iunlock(ip, XFS_MMAPLOCK_EXCL);
|
|
|
return error;
|
|
|
+ }
|
|
|
|
|
|
- xfs_ilock(ip, XFS_MMAPLOCK_EXCL);
|
|
|
error = xfs_vn_setattr_size(dentry, iattr);
|
|
|
xfs_iunlock(ip, XFS_MMAPLOCK_EXCL);
|
|
|
} else {
|