On Sat, Jun 26, 2021 at 07:07:42AM +0200, Sebastien Marie wrote:
> Hi,
> 
> The following diff removes LOCKLEAF from NDINIT. The code doesn't
> doesn't need it: the returned vnode is released immediately. The
> string path is built from the namei() call using REALPATH, during
> directories traversal.
> 
> Without LOCKLEAF, calling vrele() only is enough if namei() found a
> file, instead of calling VOP_UNLOCK() + vrele().
> 
> Comments or OK ?
> -- 
> Sebastien Marie
> 
> diff dca1bd8d5621788b92aad3f944ac9999965773e2 
> 545f8aacd74a1f793d1289475eb1c3f84d649e06
> blob - 840ea5453e13604cb38b6a5d580370053386ce71
> blob + fe240bb520b142726f358dfec4eaf6f26de151c1
> --- sys/kern/vfs_syscalls.c
> +++ sys/kern/vfs_syscalls.c
> @@ -916,36 +916,35 @@ sys___realpath(struct proc *p, void *v, register_t *re
>               }
>  
>               free(cwdbuf, M_TEMP, cwdlen);
>       }
>  
>       /* find root "/" or "//" */
>       for (c = pathname; *c != '\0'; c++) {
>               if (*c != '/')
>                       break;
>       }
> -     NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF | SAVENAME | REALPATH,
> -         UIO_SYSSPACE, pathname, p);
> +     NDINIT(&nd, LOOKUP, FOLLOW | SAVENAME | REALPATH, UIO_SYSSPACE,
> +         pathname, p);
>  
>       nd.ni_cnd.cn_rpbuf = rpbuf;
>       nd.ni_cnd.cn_rpi = strlen(rpbuf);
>  
>       nd.ni_pledge = PLEDGE_RPATH;
>       nd.ni_unveil = UNVEIL_READ;
>       if ((error = namei(&nd)) != 0)
>               goto end;
>  
> -     /* release lock and reference from namei */
> -     if (nd.ni_vp) {
> -             VOP_UNLOCK(nd.ni_vp);
> +     /* release reference from namei */
> +     if (nd.ni_vp)
>               vrele(nd.ni_vp);
> -     }
> +
>       error = copyoutstr(nd.ni_cnd.cn_rpbuf, SCARG(uap, resolved),
>           MAXPATHLEN, NULL);
>  
>  #ifdef KTRACE
>       if (KTRPOINT(p, KTR_NAMEI))
>               ktrnamei(p, nd.ni_cnd.cn_rpbuf);
>  #endif
>       pool_put(&namei_pool, nd.ni_cnd.cn_pnbuf);
>  end:
>       pool_put(&namei_pool, rpbuf);
> 

Makes sense. OK claudio@

-- 
:wq Claudio

Reply via email to