[Devel] [PATCH rh7 4/4] vfs: rename: check backing inode being equal
Maxim Patlasov
mpatlasov at virtuozzo.com
Tue Jul 26 18:07:48 PDT 2016
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 <mszeredi at redhat.com>
https://jira.sw.ru/browse/PSBM-47981
Signed-off-by: Maxim Patlasov <mpatlasov at virtuozzo.com>
---
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);
More information about the Devel
mailing list