Commit 9020df37 authored by Miklos Szeredi's avatar Miklos Szeredi

ovl: compare inodes

When checking for consistency in directory operations (unlink, rename,
etc.) match inodes not dentries.
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent 25b7713a
...@@ -611,6 +611,11 @@ static int ovl_link(struct dentry *old, struct inode *newdir, ...@@ -611,6 +611,11 @@ static int ovl_link(struct dentry *old, struct inode *newdir,
return err; return err;
} }
static bool ovl_matches_upper(struct dentry *dentry, struct dentry *upper)
{
return d_inode(ovl_dentry_upper(dentry)) == d_inode(upper);
}
static int ovl_remove_and_whiteout(struct dentry *dentry, bool is_dir) static int ovl_remove_and_whiteout(struct dentry *dentry, bool is_dir)
{ {
struct dentry *workdir = ovl_workdir(dentry); struct dentry *workdir = ovl_workdir(dentry);
...@@ -646,7 +651,7 @@ static int ovl_remove_and_whiteout(struct dentry *dentry, bool is_dir) ...@@ -646,7 +651,7 @@ static int ovl_remove_and_whiteout(struct dentry *dentry, bool is_dir)
err = -ESTALE; err = -ESTALE;
if ((opaquedir && upper != opaquedir) || if ((opaquedir && upper != opaquedir) ||
(!opaquedir && ovl_dentry_upper(dentry) && (!opaquedir && ovl_dentry_upper(dentry) &&
upper != ovl_dentry_upper(dentry))) { !ovl_matches_upper(dentry, upper))) {
goto out_dput_upper; goto out_dput_upper;
} }
...@@ -707,7 +712,7 @@ static int ovl_remove_upper(struct dentry *dentry, bool is_dir) ...@@ -707,7 +712,7 @@ static int ovl_remove_upper(struct dentry *dentry, bool is_dir)
err = -ESTALE; err = -ESTALE;
if ((opaquedir && upper != opaquedir) || if ((opaquedir && upper != opaquedir) ||
(!opaquedir && upper != ovl_dentry_upper(dentry))) (!opaquedir && !ovl_matches_upper(dentry, upper)))
goto out_dput_upper; goto out_dput_upper;
if (is_dir) if (is_dir)
...@@ -985,7 +990,7 @@ static int ovl_rename(struct inode *olddir, struct dentry *old, ...@@ -985,7 +990,7 @@ static int ovl_rename(struct inode *olddir, struct dentry *old,
goto out_unlock; goto out_unlock;
err = -ESTALE; err = -ESTALE;
if (olddentry != ovl_dentry_upper(old)) if (!ovl_matches_upper(old, olddentry))
goto out_dput_old; goto out_dput_old;
newdentry = lookup_one_len(new->d_name.name, new_upperdir, newdentry = lookup_one_len(new->d_name.name, new_upperdir,
...@@ -1003,7 +1008,7 @@ static int ovl_rename(struct inode *olddir, struct dentry *old, ...@@ -1003,7 +1008,7 @@ static int ovl_rename(struct inode *olddir, struct dentry *old,
if (newdentry != opaquedir) if (newdentry != opaquedir)
goto out_dput; goto out_dput;
} else { } else {
if (newdentry != ovl_dentry_upper(new)) if (!ovl_matches_upper(new, newdentry))
goto out_dput; goto out_dput;
} }
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment