From: Jan Kara Date: Thu, 26 Mar 2026 09:54:02 +0000 (+0100) Subject: fs: Remove inode lock from __generic_file_fsync() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ba31a330b4c191c44abc158e8d9682705e8fc1dd;p=thirdparty%2Fkernel%2Flinux.git fs: Remove inode lock from __generic_file_fsync() Inode lock in __generic_file_fsync() protects sync_mapping_buffers() and sync_inode_metadata() calls. Neither sync_mapping_buffers() nor sync_inode_metadata() themselves need the protection by inode_lock and both metadata buffer head writeback and inode writeback can happen without inode lock (either in case of background writeback or sync(2) calls). The only protection inode_lock can possibly provide is that write(2) or other inode modifying calls cannot happen in the middle of bh+inode writeout and thus result in writeout of inconsistent metadata. However if writes and fsyncs race, background writeback can submit inconsistent metadata just after fsync completed even with inode_lock protecting fsync so this seems moot as well. So let's remove the apparently pointless inode_lock protection. Signed-off-by: Jan Kara Link: https://patch.msgid.link/20260326095354.16340-50-jack@suse.cz Signed-off-by: Christian Brauner --- diff --git a/fs/libfs.c b/fs/libfs.c index 74134ba2e8d1e..ed7242d614fe2 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -1561,7 +1561,6 @@ int __generic_file_fsync(struct file *file, loff_t start, loff_t end, if (err) return err; - inode_lock(inode); ret = sync_mapping_buffers(inode->i_mapping); if (!(inode_state_read_once(inode) & I_DIRTY_ALL)) goto out; @@ -1573,7 +1572,6 @@ int __generic_file_fsync(struct file *file, loff_t start, loff_t end, ret = err; out: - inode_unlock(inode); /* check and advance again to catch errors after syncing out buffers */ err = file_check_and_advance_wb_err(file); if (ret == 0)