mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-29 10:01:25 +00:00
__d_unalias() should refuse to move mountpoints
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
e77fb7cef8
commit
ee3efa91e2
1 changed files with 5 additions and 4 deletions
|
@ -2387,14 +2387,13 @@ static struct dentry *__d_unalias(struct inode *inode,
|
||||||
struct dentry *dentry, struct dentry *alias)
|
struct dentry *dentry, struct dentry *alias)
|
||||||
{
|
{
|
||||||
struct mutex *m1 = NULL, *m2 = NULL;
|
struct mutex *m1 = NULL, *m2 = NULL;
|
||||||
struct dentry *ret;
|
struct dentry *ret = ERR_PTR(-EBUSY);
|
||||||
|
|
||||||
/* If alias and dentry share a parent, then no extra locks required */
|
/* If alias and dentry share a parent, then no extra locks required */
|
||||||
if (alias->d_parent == dentry->d_parent)
|
if (alias->d_parent == dentry->d_parent)
|
||||||
goto out_unalias;
|
goto out_unalias;
|
||||||
|
|
||||||
/* See lock_rename() */
|
/* See lock_rename() */
|
||||||
ret = ERR_PTR(-EBUSY);
|
|
||||||
if (!mutex_trylock(&dentry->d_sb->s_vfs_rename_mutex))
|
if (!mutex_trylock(&dentry->d_sb->s_vfs_rename_mutex))
|
||||||
goto out_err;
|
goto out_err;
|
||||||
m1 = &dentry->d_sb->s_vfs_rename_mutex;
|
m1 = &dentry->d_sb->s_vfs_rename_mutex;
|
||||||
|
@ -2402,8 +2401,10 @@ static struct dentry *__d_unalias(struct inode *inode,
|
||||||
goto out_err;
|
goto out_err;
|
||||||
m2 = &alias->d_parent->d_inode->i_mutex;
|
m2 = &alias->d_parent->d_inode->i_mutex;
|
||||||
out_unalias:
|
out_unalias:
|
||||||
|
if (likely(!d_mountpoint(alias))) {
|
||||||
__d_move(alias, dentry);
|
__d_move(alias, dentry);
|
||||||
ret = alias;
|
ret = alias;
|
||||||
|
}
|
||||||
out_err:
|
out_err:
|
||||||
spin_unlock(&inode->i_lock);
|
spin_unlock(&inode->i_lock);
|
||||||
if (m2)
|
if (m2)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue