cache: drop the spurious slash_prefixed argument

This commit is contained in:
Mateusz Guzik 2020-10-21 05:57:25 +00:00
parent 0710ec8cef
commit 2f1c35053c

View File

@ -512,11 +512,11 @@ static void cache_zap_locked(struct namecache *ncp);
static int vn_fullpath_hardlink(struct nameidata *ndp, char **retbuf, static int vn_fullpath_hardlink(struct nameidata *ndp, char **retbuf,
char **freebuf, size_t *buflen); char **freebuf, size_t *buflen);
static int vn_fullpath_any_smr(struct vnode *vp, struct vnode *rdir, char *buf, static int vn_fullpath_any_smr(struct vnode *vp, struct vnode *rdir, char *buf,
char **retbuf, size_t *buflen, bool slash_prefixed, size_t addend); char **retbuf, size_t *buflen, size_t addend);
static int vn_fullpath_any(struct vnode *vp, struct vnode *rdir, char *buf, static int vn_fullpath_any(struct vnode *vp, struct vnode *rdir, char *buf,
char **retbuf, size_t *buflen); char **retbuf, size_t *buflen);
static int vn_fullpath_dir(struct vnode *vp, struct vnode *rdir, char *buf, static int vn_fullpath_dir(struct vnode *vp, struct vnode *rdir, char *buf,
char **retbuf, size_t *len, bool slash_prefixed, size_t addend); char **retbuf, size_t *len, size_t addend);
static MALLOC_DEFINE(M_VFSCACHE, "vfscache", "VFS name cache entries"); static MALLOC_DEFINE(M_VFSCACHE, "vfscache", "VFS name cache entries");
@ -2687,7 +2687,7 @@ vn_getcwd(char *buf, char **retbuf, size_t *buflen)
vfs_smr_enter(); vfs_smr_enter();
pwd = pwd_get_smr(); pwd = pwd_get_smr();
error = vn_fullpath_any_smr(pwd->pwd_cdir, pwd->pwd_rdir, buf, retbuf, error = vn_fullpath_any_smr(pwd->pwd_cdir, pwd->pwd_rdir, buf, retbuf,
buflen, false, 0); buflen, 0);
VFS_SMR_ASSERT_NOT_ENTERED(); VFS_SMR_ASSERT_NOT_ENTERED();
if (error < 0) { if (error < 0) {
pwd = pwd_hold(curthread); pwd = pwd_hold(curthread);
@ -2753,7 +2753,7 @@ vn_fullpath(struct vnode *vp, char **retbuf, char **freebuf)
buf = malloc(buflen, M_TEMP, M_WAITOK); buf = malloc(buflen, M_TEMP, M_WAITOK);
vfs_smr_enter(); vfs_smr_enter();
pwd = pwd_get_smr(); pwd = pwd_get_smr();
error = vn_fullpath_any_smr(vp, pwd->pwd_rdir, buf, retbuf, &buflen, false, 0); error = vn_fullpath_any_smr(vp, pwd->pwd_rdir, buf, retbuf, &buflen, 0);
VFS_SMR_ASSERT_NOT_ENTERED(); VFS_SMR_ASSERT_NOT_ENTERED();
if (error < 0) { if (error < 0) {
pwd = pwd_hold(curthread); pwd = pwd_hold(curthread);
@ -2785,7 +2785,7 @@ vn_fullpath_global(struct vnode *vp, char **retbuf, char **freebuf)
buflen = MAXPATHLEN; buflen = MAXPATHLEN;
buf = malloc(buflen, M_TEMP, M_WAITOK); buf = malloc(buflen, M_TEMP, M_WAITOK);
vfs_smr_enter(); vfs_smr_enter();
error = vn_fullpath_any_smr(vp, rootvnode, buf, retbuf, &buflen, false, 0); error = vn_fullpath_any_smr(vp, rootvnode, buf, retbuf, &buflen, 0);
VFS_SMR_ASSERT_NOT_ENTERED(); VFS_SMR_ASSERT_NOT_ENTERED();
if (error < 0) { if (error < 0) {
error = vn_fullpath_any(vp, rootvnode, buf, retbuf, &buflen); error = vn_fullpath_any(vp, rootvnode, buf, retbuf, &buflen);
@ -2887,7 +2887,7 @@ vn_vptocnp(struct vnode **vp, char *buf, size_t *buflen)
*/ */
static int static int
vn_fullpath_dir(struct vnode *vp, struct vnode *rdir, char *buf, char **retbuf, vn_fullpath_dir(struct vnode *vp, struct vnode *rdir, char *buf, char **retbuf,
size_t *len, bool slash_prefixed, size_t addend) size_t *len, size_t addend)
{ {
#ifdef KDTRACE_HOOKS #ifdef KDTRACE_HOOKS
struct vnode *startvp = vp; struct vnode *startvp = vp;
@ -2895,16 +2895,19 @@ vn_fullpath_dir(struct vnode *vp, struct vnode *rdir, char *buf, char **retbuf,
struct vnode *vp1; struct vnode *vp1;
size_t buflen; size_t buflen;
int error; int error;
bool slash_prefixed;
VNPASS(vp->v_type == VDIR || VN_IS_DOOMED(vp), vp); VNPASS(vp->v_type == VDIR || VN_IS_DOOMED(vp), vp);
VNPASS(vp->v_usecount > 0, vp); VNPASS(vp->v_usecount > 0, vp);
buflen = *len; buflen = *len;
if (!slash_prefixed) { slash_prefixed = true;
if (addend == 0) {
MPASS(*len >= 2); MPASS(*len >= 2);
buflen--; buflen--;
buf[buflen] = '\0'; buf[buflen] = '\0';
slash_prefixed = false;
} }
error = 0; error = 0;
@ -3006,7 +3009,7 @@ cache_rev_failed_impl(int *reason, int line)
static int static int
vn_fullpath_any_smr(struct vnode *vp, struct vnode *rdir, char *buf, vn_fullpath_any_smr(struct vnode *vp, struct vnode *rdir, char *buf,
char **retbuf, size_t *buflen, bool slash_prefixed, size_t addend) char **retbuf, size_t *buflen, size_t addend)
{ {
#ifdef KDTRACE_HOOKS #ifdef KDTRACE_HOOKS
struct vnode *startvp = vp; struct vnode *startvp = vp;
@ -3032,14 +3035,14 @@ vn_fullpath_any_smr(struct vnode *vp, struct vnode *rdir, char *buf,
orig_buflen = *buflen; orig_buflen = *buflen;
if (!slash_prefixed) { if (addend == 0) {
MPASS(*buflen >= 2); MPASS(*buflen >= 2);
*buflen -= 1; *buflen -= 1;
buf[*buflen] = '\0'; buf[*buflen] = '\0';
} }
if (vp == rdir || vp == rootvnode) { if (vp == rdir || vp == rootvnode) {
if (!slash_prefixed) { if (addend == 0) {
*buflen -= 1; *buflen -= 1;
buf[*buflen] = '/'; buf[*buflen] = '/';
} }
@ -3137,8 +3140,7 @@ static int
vn_fullpath_any(struct vnode *vp, struct vnode *rdir, char *buf, char **retbuf, vn_fullpath_any(struct vnode *vp, struct vnode *rdir, char *buf, char **retbuf,
size_t *buflen) size_t *buflen)
{ {
size_t orig_buflen; size_t orig_buflen, addend;
bool slash_prefixed;
int error; int error;
if (*buflen < 2) if (*buflen < 2)
@ -3147,7 +3149,7 @@ vn_fullpath_any(struct vnode *vp, struct vnode *rdir, char *buf, char **retbuf,
orig_buflen = *buflen; orig_buflen = *buflen;
vref(vp); vref(vp);
slash_prefixed = false; addend = 0;
if (vp->v_type != VDIR) { if (vp->v_type != VDIR) {
*buflen -= 1; *buflen -= 1;
buf[*buflen] = '\0'; buf[*buflen] = '\0';
@ -3160,11 +3162,10 @@ vn_fullpath_any(struct vnode *vp, struct vnode *rdir, char *buf, char **retbuf,
} }
*buflen -= 1; *buflen -= 1;
buf[*buflen] = '/'; buf[*buflen] = '/';
slash_prefixed = true; addend = orig_buflen - *buflen;
} }
return (vn_fullpath_dir(vp, rdir, buf, retbuf, buflen, slash_prefixed, return (vn_fullpath_dir(vp, rdir, buf, retbuf, buflen, addend));
orig_buflen - *buflen));
} }
/* /*
@ -3189,7 +3190,6 @@ vn_fullpath_hardlink(struct nameidata *ndp, char **retbuf, char **freebuf,
struct vnode *vp; struct vnode *vp;
size_t addend; size_t addend;
int error; int error;
bool slash_prefixed;
enum vtype type; enum vtype type;
if (*buflen < 2) if (*buflen < 2)
@ -3197,8 +3197,6 @@ vn_fullpath_hardlink(struct nameidata *ndp, char **retbuf, char **freebuf,
if (*buflen > MAXPATHLEN) if (*buflen > MAXPATHLEN)
*buflen = MAXPATHLEN; *buflen = MAXPATHLEN;
slash_prefixed = false;
buf = malloc(*buflen, M_TEMP, M_WAITOK); buf = malloc(*buflen, M_TEMP, M_WAITOK);
addend = 0; addend = 0;
@ -3239,20 +3237,19 @@ vn_fullpath_hardlink(struct nameidata *ndp, char **retbuf, char **freebuf,
tmpbuf[0] = '/'; tmpbuf[0] = '/';
memcpy(&tmpbuf[1], cnp->cn_nameptr, cnp->cn_namelen); memcpy(&tmpbuf[1], cnp->cn_nameptr, cnp->cn_namelen);
tmpbuf[addend - 1] = '\0'; tmpbuf[addend - 1] = '\0';
slash_prefixed = true;
vp = ndp->ni_dvp; vp = ndp->ni_dvp;
} }
vfs_smr_enter(); vfs_smr_enter();
pwd = pwd_get_smr(); pwd = pwd_get_smr();
error = vn_fullpath_any_smr(vp, pwd->pwd_rdir, buf, retbuf, buflen, error = vn_fullpath_any_smr(vp, pwd->pwd_rdir, buf, retbuf, buflen,
slash_prefixed, addend); addend);
VFS_SMR_ASSERT_NOT_ENTERED(); VFS_SMR_ASSERT_NOT_ENTERED();
if (error < 0) { if (error < 0) {
pwd = pwd_hold(curthread); pwd = pwd_hold(curthread);
vref(vp); vref(vp);
error = vn_fullpath_dir(vp, pwd->pwd_rdir, buf, retbuf, buflen, error = vn_fullpath_dir(vp, pwd->pwd_rdir, buf, retbuf, buflen,
slash_prefixed, addend); addend);
pwd_drop(pwd); pwd_drop(pwd);
if (error != 0) if (error != 0)
goto out_bad; goto out_bad;