summaryrefslogtreecommitdiff
path: root/fs/namei.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2022-07-05 19:22:46 +0300
committerAl Viro <viro@zeniv.linux.org.uk>2022-07-05 23:18:21 +0300
commit7e4745a09426b3fe63e9fbea3190e0f8500820a4 (patch)
tree3525e8aa941a4590b3ba161d5260fb90deb7e379 /fs/namei.c
parent51c6546c30ea6efe9aa819015bd61ffefc910944 (diff)
downloadlinux-7e4745a09426b3fe63e9fbea3190e0f8500820a4.tar.xz
switch try_to_unlazy_next() to __legitimize_mnt()
The tricky case (__legitimize_mnt() failing after having grabbed a reference) can be trivially dealt with by leaving nd->path.mnt non-NULL, for terminate_walk() to drop it. legitimize_mnt() becomes static after that. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/namei.c')
-rw-r--r--fs/namei.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 9c50facb9769..e864d5b9eeac 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -799,13 +799,18 @@ out:
*/
static bool try_to_unlazy_next(struct nameidata *nd, struct dentry *dentry, unsigned seq)
{
+ int res;
BUG_ON(!(nd->flags & LOOKUP_RCU));
nd->flags &= ~LOOKUP_RCU;
if (unlikely(!legitimize_links(nd)))
goto out2;
- if (unlikely(!legitimize_mnt(nd->path.mnt, nd->m_seq)))
- goto out2;
+ res = __legitimize_mnt(nd->path.mnt, nd->m_seq);
+ if (unlikely(res)) {
+ if (res > 0)
+ goto out2;
+ goto out1;
+ }
if (unlikely(!lockref_get_not_dead(&nd->path.dentry->d_lockref)))
goto out1;