mirror of https://github.com/torvalds/linux.git
ovl: port ovl_lower_positive() to cred guard
Use the scoped ovl cred guard. Link: https://patch.msgid.link/20251117-work-ovl-cred-guard-v4-39-b31603935724@kernel.org Reviewed-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
6b6ef7d16f
commit
db7cfe8783
|
|
@ -1418,7 +1418,6 @@ bool ovl_lower_positive(struct dentry *dentry)
|
||||||
{
|
{
|
||||||
struct ovl_entry *poe = OVL_E(dentry->d_parent);
|
struct ovl_entry *poe = OVL_E(dentry->d_parent);
|
||||||
const struct qstr *name = &dentry->d_name;
|
const struct qstr *name = &dentry->d_name;
|
||||||
const struct cred *old_cred;
|
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
bool positive = false;
|
bool positive = false;
|
||||||
bool done = false;
|
bool done = false;
|
||||||
|
|
@ -1434,46 +1433,45 @@ bool ovl_lower_positive(struct dentry *dentry)
|
||||||
if (!ovl_dentry_upper(dentry))
|
if (!ovl_dentry_upper(dentry))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
old_cred = ovl_override_creds(dentry->d_sb);
|
with_ovl_creds(dentry->d_sb) {
|
||||||
/* Positive upper -> have to look up lower to see whether it exists */
|
/* Positive upper -> have to look up lower to see whether it exists */
|
||||||
for (i = 0; !done && !positive && i < ovl_numlower(poe); i++) {
|
for (i = 0; !done && !positive && i < ovl_numlower(poe); i++) {
|
||||||
struct dentry *this;
|
struct dentry *this;
|
||||||
struct ovl_path *parentpath = &ovl_lowerstack(poe)[i];
|
struct ovl_path *parentpath = &ovl_lowerstack(poe)[i];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We need to make a non-const copy of dentry->d_name,
|
* We need to make a non-const copy of dentry->d_name,
|
||||||
* because lookup_one_positive_unlocked() will hash name
|
* because lookup_one_positive_unlocked() will hash name
|
||||||
* with parentpath base, which is on another (lower fs).
|
* with parentpath base, which is on another (lower fs).
|
||||||
*/
|
*/
|
||||||
this = lookup_one_positive_unlocked(
|
this = lookup_one_positive_unlocked(mnt_idmap(parentpath->layer->mnt),
|
||||||
mnt_idmap(parentpath->layer->mnt),
|
&QSTR_LEN(name->name, name->len),
|
||||||
&QSTR_LEN(name->name, name->len),
|
parentpath->dentry);
|
||||||
parentpath->dentry);
|
if (IS_ERR(this)) {
|
||||||
if (IS_ERR(this)) {
|
switch (PTR_ERR(this)) {
|
||||||
switch (PTR_ERR(this)) {
|
case -ENOENT:
|
||||||
case -ENOENT:
|
case -ENAMETOOLONG:
|
||||||
case -ENAMETOOLONG:
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/*
|
/*
|
||||||
* Assume something is there, we just couldn't
|
* Assume something is there, we just couldn't
|
||||||
* access it.
|
* access it.
|
||||||
*/
|
*/
|
||||||
positive = true;
|
positive = true;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
struct path path = {
|
||||||
|
.dentry = this,
|
||||||
|
.mnt = parentpath->layer->mnt,
|
||||||
|
};
|
||||||
|
positive = !ovl_path_is_whiteout(OVL_FS(dentry->d_sb), &path);
|
||||||
|
done = true;
|
||||||
|
dput(this);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
struct path path = {
|
|
||||||
.dentry = this,
|
|
||||||
.mnt = parentpath->layer->mnt,
|
|
||||||
};
|
|
||||||
positive = !ovl_path_is_whiteout(OVL_FS(dentry->d_sb), &path);
|
|
||||||
done = true;
|
|
||||||
dput(this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ovl_revert_creds(old_cred);
|
|
||||||
|
|
||||||
return positive;
|
return positive;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue