diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2022-07-05 18:22:46 +0200 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2022-07-05 22:18:21 +0200 |
commit | 7e4745a09426b3fe63e9fbea3190e0f8500820a4 (patch) | |
tree | 3525e8aa941a4590b3ba161d5260fb90deb7e379 /fs/namei.c | |
parent | follow_dotdot{,_rcu}(): change calling conventions (diff) | |
download | linux-7e4745a09426b3fe63e9fbea3190e0f8500820a4.tar.xz linux-7e4745a09426b3fe63e9fbea3190e0f8500820a4.zip |
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.c | 9 |
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; |