git: d9ea7e2b1e69 - main - vfs: factor FAILIFEXISTS handling out of vfs_lookup
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 24 Mar 2022 11:22:33 UTC
The branch main has been updated by mjg: URL: https://cgit.FreeBSD.org/src/commit/?id=d9ea7e2b1e696697b532535678c05a10d6635084 commit d9ea7e2b1e696697b532535678c05a10d6635084 Author: Mateusz Guzik <mjg@FreeBSD.org> AuthorDate: 2022-03-13 17:36:51 +0000 Commit: Mateusz Guzik <mjg@FreeBSD.org> CommitDate: 2022-03-24 11:22:20 +0000 vfs: factor FAILIFEXISTS handling out of vfs_lookup --- sys/kern/vfs_lookup.c | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/sys/kern/vfs_lookup.c b/sys/kern/vfs_lookup.c index f4fabe55b06e..29db916382b1 100644 --- a/sys/kern/vfs_lookup.c +++ b/sys/kern/vfs_lookup.c @@ -853,6 +853,32 @@ bad: return (error); } +/* + * FAILIFEXISTS handling. + * + * XXX namei called with LOCKPARENT but not LOCKLEAF has the strange + * behaviour of leaving the vnode unlocked if the target is the same + * vnode as the parent. + */ +static int __noinline +vfs_lookup_failifexists(struct nameidata *ndp) +{ + struct componentname *cnp __diagused; + + cnp = &ndp->ni_cnd; + + MPASS((cnp->cn_flags & ISSYMLINK) == 0); + if (ndp->ni_vp == ndp->ni_dvp) + vrele(ndp->ni_dvp); + else + vput(ndp->ni_dvp); + vrele(ndp->ni_vp); + ndp->ni_dvp = NULL; + ndp->ni_vp = NULL; + NDFREE_PNBUF(ndp); + return (EEXIST); +} + /* * Search a pathname. * This is a very central and rather complicated routine. @@ -1388,7 +1414,7 @@ success_right_lock: if ((cnp->cn_flags & ISDOTDOT) == 0) nameicap_tracker_add(ndp, ndp->ni_vp); if ((cnp->cn_flags & (FAILIFEXISTS | ISSYMLINK)) == FAILIFEXISTS) - goto bad_eexist; + return (vfs_lookup_failifexists(ndp)); } return (0); @@ -1405,24 +1431,6 @@ bad: bad_unlocked: ndp->ni_vp = NULL; return (error); -bad_eexist: - /* - * FAILIFEXISTS handling. - * - * XXX namei called with LOCKPARENT but not LOCKLEAF has the strange - * behaviour of leaving the vnode unlocked if the target is the same - * vnode as the parent. - */ - MPASS((cnp->cn_flags & ISSYMLINK) == 0); - if (ndp->ni_vp == ndp->ni_dvp) - vrele(ndp->ni_dvp); - else - vput(ndp->ni_dvp); - vrele(ndp->ni_vp); - ndp->ni_dvp = NULL; - ndp->ni_vp = NULL; - NDFREE_PNBUF(ndp); - return (EEXIST); } /*