The patch backports upstream commit 9409e22acdfc9153f88d9b1ed2bd2a5b34d2d3ca:
> vfs: rename: check backing inode being equal > > If a file is renamed to a hardlink of itself POSIX specifies that rename(2) > should do nothing and return success. > > This condition is checked in vfs_rename(). However it won't detect hard > links on overlayfs where these are given separate inodes on the overlayfs > layer. > > Overlayfs itself detects this condition and returns success without doing > anything, but then vfs_rename() will proceed as if this was a successful > rename (detach_mounts(), d_move()). > > The correct thing to do is to detect this condition before even calling > into overlayfs. This patch does this by calling vfs_select_inode() to get > the underlying inodes. > > Signed-off-by: Miklos Szeredi <[email protected]> https://jira.sw.ru/browse/PSBM-47981 Signed-off-by: Maxim Patlasov <[email protected]> --- fs/namei.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fs/namei.c b/fs/namei.c index 16820b1..427c740 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -4103,7 +4103,11 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, unsigned max_links = new_dir->i_sb->s_max_links; iop_rename2_t rename2; - if (source == target) + /* + * Check source == target. + * On overlayfs need to look at underlying inodes. + */ + if (vfs_select_inode(old_dentry) == vfs_select_inode(new_dentry)) return 0; error = may_delete(old_dir, old_dentry, is_dir); _______________________________________________ Devel mailing list [email protected] https://lists.openvz.org/mailman/listinfo/devel
