lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Tue, 13 Apr 2021 13:28:51 +0200
From:   Jan Kara <jack@...e.cz>
To:     <linux-fsdevel@...r.kernel.org>
Cc:     <linux-ext4@...r.kernel.org>, <linux-xfs@...r.kernel.org>,
        Ted Tso <tytso@....edu>, Christoph Hellwig <hch@...radead.org>,
        Amir Goldstein <amir73il@...il.com>,
        Dave Chinner <david@...morbit.com>, Jan Kara <jack@...e.cz>
Subject: [PATCH 7/7] fs: Remove i_mapping_sem protection from .page_mkwrite handlers

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@...e.cz>
---
 fs/ext4/inode.c   | 3 ---
 fs/xfs/xfs_file.c | 2 --
 fs/zonefs/super.c | 3 ---
 3 files changed, 8 deletions(-)

diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index d76803eba884..4779b6084a30 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -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:
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index a76404708312..416a5c8ccdda 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -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);
 	}
diff --git a/fs/zonefs/super.c b/fs/zonefs/super.c
index ace6f3a223da..a90ef0f09a9f 100644
--- a/fs/zonefs/super.c
+++ b/fs/zonefs/super.c
@@ -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;
-- 
2.31.0.99.g0d91da736d9f.dirty

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ