@@ -6064,8 +6064,6 @@ vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf)
sb_start_pagefault(inode->i_sb);
file_update_time(vma->vm_file);
- down_read(&inode->i_mapping_sem);
-
err = ext4_convert_inline_data(inode);
if (err)
goto out_ret;
@@ -6177,7 +6175,6 @@ vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf)
out_ret:
ret = block_page_mkwrite_return(err);
out:
- up_read(&inode->i_mapping_sem);
sb_end_pagefault(inode->i_sb);
return ret;
out_error:
@@ -1316,10 +1316,8 @@ __xfs_filemap_fault(
xfs_iunlock(XFS_I(inode), XFS_MMAPLOCK_SHARED);
} else {
if (write_fault) {
- xfs_ilock(XFS_I(inode), XFS_MMAPLOCK_SHARED);
ret = iomap_page_mkwrite(vmf,
&xfs_buffered_write_iomap_ops);
- xfs_iunlock(XFS_I(inode), XFS_MMAPLOCK_SHARED);
} else
ret = filemap_fault(vmf);
}
@@ -594,10 +594,7 @@ static vm_fault_t zonefs_filemap_page_mkwrite(struct vm_fault *vmf)
sb_start_pagefault(inode->i_sb);
file_update_time(vmf->vma->vm_file);
- /* Serialize against truncates */
- down_read(&inode->i_mapping_sem);
ret = iomap_page_mkwrite(vmf, &zonefs_iomap_ops);
- up_read(&inode->i_mapping_sem);
sb_end_pagefault(inode->i_sb);
return ret;
Using i_mapping_sem in .page_mkwrite handlers is generally unnecessary since these handlers do not create any new pages in the page cache. Thus if the handler locks the page and it is still attached to appropriate mapping, we are certain there cannot be truncate or hole punch in progress past its page cache invalidation step (remember that a page cannot be created in the page cache from the moment hole punch acquires i_mapping_sem and starts invalidating page cache to the moment the operation is finished and i_mapping_sem is released) and any page cache invalidation will wait until we release the page lock. So just remove i_mapping_sem usage from .page_mkwrite handlers. Signed-off-by: Jan Kara <jack@suse.cz> --- fs/ext4/inode.c | 3 --- fs/xfs/xfs_file.c | 2 -- fs/zonefs/super.c | 3 --- 3 files changed, 8 deletions(-)