From f7621b11e8acc8efa208c9420ff3ecb198b20e29 Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Thu, 24 Aug 2023 14:51:17 +0300 Subject: ovl: protect copying of realinode attributes to ovl inode ovl_copyattr() may be called concurrently from aio completion context without any lock and that could lead to overlay inode attributes getting permanently out of sync with real inode attributes. Use ovl inode spinlock to protect ovl_copyattr(). Signed-off-by: Amir Goldstein --- fs/overlayfs/util.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'fs/overlayfs/util.c') diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c index 868afd8834c3..4a9e7efc90aa 100644 --- a/fs/overlayfs/util.c +++ b/fs/overlayfs/util.c @@ -1403,6 +1403,7 @@ void ovl_copyattr(struct inode *inode) realinode = ovl_i_path_real(inode, &realpath); real_idmap = mnt_idmap(realpath.mnt); + spin_lock(&inode->i_lock); vfsuid = i_uid_into_vfsuid(real_idmap, realinode); vfsgid = i_gid_into_vfsgid(real_idmap, realinode); @@ -1413,4 +1414,5 @@ void ovl_copyattr(struct inode *inode) inode_set_mtime_to_ts(inode, inode_get_mtime(realinode)); inode_set_ctime_to_ts(inode, inode_get_ctime(realinode)); i_size_write(inode, i_size_read(realinode)); + spin_unlock(&inode->i_lock); } -- cgit v1.2.3