|
@@ -423,12 +423,16 @@ static bool ovl_dentry_weird(struct dentry *dentry)
|
|
|
DCACHE_OP_COMPARE);
|
|
|
}
|
|
|
|
|
|
-static inline struct dentry *ovl_lookup_real(struct dentry *dir,
|
|
|
+static inline struct dentry *ovl_lookup_real(struct super_block *ovl_sb,
|
|
|
+ struct dentry *dir,
|
|
|
struct qstr *name)
|
|
|
{
|
|
|
+ const struct cred *old_cred;
|
|
|
struct dentry *dentry;
|
|
|
|
|
|
- dentry = lookup_hash(name, dir);
|
|
|
+ old_cred = ovl_override_creds(ovl_sb);
|
|
|
+ dentry = lookup_one_len_unlocked(name->name, dir, name->len);
|
|
|
+ revert_creds(old_cred);
|
|
|
|
|
|
if (IS_ERR(dentry)) {
|
|
|
if (PTR_ERR(dentry) == -ENOENT)
|
|
@@ -481,7 +485,7 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
|
|
|
|
|
|
upperdir = ovl_upperdentry_dereference(poe);
|
|
|
if (upperdir) {
|
|
|
- this = ovl_lookup_real(upperdir, &dentry->d_name);
|
|
|
+ this = ovl_lookup_real(dentry->d_sb, upperdir, &dentry->d_name);
|
|
|
err = PTR_ERR(this);
|
|
|
if (IS_ERR(this))
|
|
|
goto out;
|
|
@@ -514,7 +518,8 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
|
|
|
bool opaque = false;
|
|
|
struct path lowerpath = poe->lowerstack[i];
|
|
|
|
|
|
- this = ovl_lookup_real(lowerpath.dentry, &dentry->d_name);
|
|
|
+ this = ovl_lookup_real(dentry->d_sb,
|
|
|
+ lowerpath.dentry, &dentry->d_name);
|
|
|
err = PTR_ERR(this);
|
|
|
if (IS_ERR(this)) {
|
|
|
/*
|