Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F149301342
D36542.1789840222.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
40 KB
Referenced Files
None
Subscribers
None
D36542.1789840222.diff
View Options
Index: sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
===================================================================
--- sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
+++ sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c
@@ -965,13 +965,17 @@
case RENAME:
if (error == ENOENT) {
error = EJUSTRETURN;
+#if __FreeBSD_version < 1400054
cnp->cn_flags |= SAVENAME;
+#endif
break;
}
zfs_fallthrough;
case DELETE:
+#if __FreeBSD_version < 1400054
if (error == 0)
cnp->cn_flags |= SAVENAME;
+#endif
break;
}
}
@@ -1318,7 +1322,10 @@
cnp->cn_nameptr = __DECONST(char *, name);
cnp->cn_namelen = strlen(name);
cnp->cn_nameiop = nameiop;
- cnp->cn_flags = ISLASTCN | SAVENAME;
+ cnp->cn_flags = ISLASTCN;
+#if __FreeBSD_version < 1400054
+ cnp->cn_flags |= SAVENAME;
+#endif
cnp->cn_lkflags = LK_EXCLUSIVE | LK_RETRY;
cnp->cn_cred = kcred;
#if __FreeBSD_version < 1400037
@@ -4620,7 +4627,9 @@
znode_t *zp = NULL;
int rc, mode;
+#if __FreeBSD_version < 1400054
ASSERT(cnp->cn_flags & SAVENAME);
+#endif
vattr_init_mask(vap);
mode = vap->va_mode & ALLPERMS;
@@ -4650,7 +4659,9 @@
zfs_freebsd_remove(struct vop_remove_args *ap)
{
+#if __FreeBSD_version < 1400054
ASSERT(ap->a_cnp->cn_flags & SAVENAME);
+#endif
return (zfs_remove_(ap->a_dvp, ap->a_vp, ap->a_cnp->cn_nameptr,
ap->a_cnp->cn_cred));
@@ -4672,7 +4683,9 @@
znode_t *zp = NULL;
int rc;
+#if __FreeBSD_version < 1400054
ASSERT(ap->a_cnp->cn_flags & SAVENAME);
+#endif
vattr_init_mask(vap);
*ap->a_vpp = NULL;
@@ -4698,7 +4711,9 @@
{
struct componentname *cnp = ap->a_cnp;
+#if __FreeBSD_version < 1400054
ASSERT(cnp->cn_flags & SAVENAME);
+#endif
return (zfs_rmdir_(ap->a_dvp, ap->a_vp, cnp->cn_nameptr, cnp->cn_cred));
}
@@ -4952,8 +4967,10 @@
vnode_t *tvp = ap->a_tvp;
int error;
+#if __FreeBSD_version < 1400054
ASSERT(ap->a_fcnp->cn_flags & (SAVENAME|SAVESTART));
ASSERT(ap->a_tcnp->cn_flags & (SAVENAME|SAVESTART));
+#endif
error = zfs_do_rename(fdvp, &fvp, ap->a_fcnp, tdvp, &tvp,
ap->a_tcnp, ap->a_fcnp->cn_cred);
@@ -4989,7 +5006,9 @@
#endif
int rc;
+#if __FreeBSD_version < 1400054
ASSERT(cnp->cn_flags & SAVENAME);
+#endif
vap->va_type = VLNK; /* FreeBSD: Syscall only sets va_mode. */
vattr_init_mask(vap);
@@ -5083,7 +5102,9 @@
if (tdvp->v_mount != vp->v_mount)
return (EXDEV);
+#if __FreeBSD_version < 1400054
ASSERT(cnp->cn_flags & SAVENAME);
+#endif
return (zfs_link(VTOZ(tdvp), VTOZ(vp),
cnp->cn_nameptr, cnp->cn_cred, 0));
Index: sys/fs/devfs/devfs_vnops.c
===================================================================
--- sys/fs/devfs/devfs_vnops.c
+++ sys/fs/devfs/devfs_vnops.c
@@ -1140,7 +1140,6 @@
if (de == NULL || de->de_flags & DE_WHITEOUT) {
if ((nameiop == CREATE || nameiop == RENAME) &&
(flags & (LOCKPARENT | WANTPARENT)) && (flags & ISLASTCN)) {
- cnp->cn_flags |= SAVENAME;
return (EJUSTRETURN);
}
return (ENOENT);
Index: sys/fs/ext2fs/ext2_lookup.c
===================================================================
--- sys/fs/ext2fs/ext2_lookup.c
+++ sys/fs/ext2fs/ext2_lookup.c
@@ -514,13 +514,10 @@
* We return ni_vp == NULL to indicate that the entry
* does not currently exist; we leave a pointer to
* the (locked) directory inode in ndp->ni_dvp.
- * The pathname buffer is saved so that the name
- * can be obtained later.
*
* NB - if the directory is unlocked, then this
* information cannot be used.
*/
- cnp->cn_flags |= SAVENAME;
return (EJUSTRETURN);
}
/*
@@ -631,7 +628,6 @@
&tdp)) != 0)
return (error);
*vpp = tdp;
- cnp->cn_flags |= SAVENAME;
return (0);
}
if (dd_ino != NULL)
@@ -925,10 +921,6 @@
int DIRBLKSIZ = ip->i_e2fs->e2fs_bsize;
int error;
-#ifdef INVARIANTS
- if ((cnp->cn_flags & SAVENAME) == 0)
- panic("ext2_direnter: missing name");
-#endif
dp = VTOI(dvp);
newdir.e2d_ino = htole32(ip->i_number);
if (EXT2_HAS_INCOMPAT_FEATURE(ip->i_e2fs,
Index: sys/fs/ext2fs/ext2_vnops.c
===================================================================
--- sys/fs/ext2fs/ext2_vnops.c
+++ sys/fs/ext2fs/ext2_vnops.c
@@ -709,10 +709,6 @@
struct inode *ip;
int error;
-#ifdef INVARIANTS
- if ((cnp->cn_flags & HASBUF) == 0)
- panic("ext2_link: no name");
-#endif
ip = VTOI(vp);
if ((nlink_t)ip->i_nlink >= EXT4_LINK_MAX) {
error = EMLINK;
@@ -801,11 +797,6 @@
int error = 0;
u_char namlen;
-#ifdef INVARIANTS
- if ((tcnp->cn_flags & HASBUF) == 0 ||
- (fcnp->cn_flags & HASBUF) == 0)
- panic("ext2_rename: no name");
-#endif
/*
* Check for cross-device rename.
*/
@@ -1315,10 +1306,6 @@
char *buf = NULL;
int error, dmode;
-#ifdef INVARIANTS
- if ((cnp->cn_flags & HASBUF) == 0)
- panic("ext2_mkdir: no name");
-#endif
dp = VTOI(dvp);
if ((nlink_t)dp->i_nlink >= EXT4_LINK_MAX &&
!EXT2_HAS_RO_COMPAT_FEATURE(dp->i_e2fs, EXT2F_ROCOMPAT_DIR_NLINK)) {
@@ -1946,10 +1933,6 @@
int error;
pdir = VTOI(dvp);
-#ifdef INVARIANTS
- if ((cnp->cn_flags & HASBUF) == 0)
- panic("ext2_makeinode: no name");
-#endif
*vpp = NULL;
if ((mode & IFMT) == 0)
mode |= IFREG;
Index: sys/fs/fuse/fuse_vnops.c
===================================================================
--- sys/fs/fuse/fuse_vnops.c
+++ sys/fs/fuse/fuse_vnops.c
@@ -1391,7 +1391,6 @@
int nameiop = cnp->cn_nameiop;
int flags = cnp->cn_flags;
- int wantparent = flags & (LOCKPARENT | WANTPARENT);
int islastcn = flags & ISLASTCN;
struct mount *mp = vnode_mount(dvp);
struct fuse_data *data = fuse_get_mpdata(mp);
@@ -1533,13 +1532,6 @@
else
err = 0;
if (!err) {
- /*
- * Set the SAVENAME flag to hold onto the
- * pathname for use later in VOP_CREATE or
- * VOP_RENAME.
- */
- cnp->cn_flags |= SAVENAME;
-
err = EJUSTRETURN;
}
} else {
@@ -1619,12 +1611,6 @@
goto out;
}
}
-
- if (islastcn && (
- (nameiop == DELETE) ||
- (nameiop == RENAME && wantparent))) {
- cnp->cn_flags |= SAVENAME;
- }
}
}
out:
Index: sys/fs/msdosfs/msdosfs_lookup.c
===================================================================
--- sys/fs/msdosfs/msdosfs_lookup.c
+++ sys/fs/msdosfs/msdosfs_lookup.c
@@ -421,13 +421,10 @@
* We return ni_vp == NULL to indicate that the entry
* does not currently exist; we leave a pointer to
* the (locked) directory inode in ndp->ni_dvp.
- * The pathname buffer is saved so that the name
- * can be obtained later.
*
* NB - if the directory is unlocked, then this
* information cannot be used.
*/
- cnp->cn_flags |= SAVENAME;
return (EJUSTRETURN);
}
#if 0
@@ -554,7 +551,6 @@
if ((error = msdosfs_lookup_checker(pmp, vdp, tdp, vpp))
!= 0)
return (error);
- cnp->cn_flags |= SAVENAME;
return (0);
}
Index: sys/fs/msdosfs/msdosfs_vnops.c
===================================================================
--- sys/fs/msdosfs/msdosfs_vnops.c
+++ sys/fs/msdosfs/msdosfs_vnops.c
@@ -161,10 +161,6 @@
* use the absence of the owner write bit to make the file
* readonly.
*/
-#ifdef DIAGNOSTIC
- if ((cnp->cn_flags & HASBUF) == 0)
- panic("msdosfs_create: no name");
-#endif
memset(&ndirent, 0, sizeof(ndirent));
error = uniqdosname(pdep, cnp, ndirent.de_Name);
if (error)
@@ -958,11 +954,6 @@
fcnp = ap->a_fcnp;
pmp = VFSTOMSDOSFS(fdvp->v_mount);
-#ifdef DIAGNOSTIC
- if ((tcnp->cn_flags & HASBUF) == 0 ||
- (fcnp->cn_flags & HASBUF) == 0)
- panic("msdosfs_rename: no name");
-#endif
/*
* Check for cross-device rename.
*/
@@ -1414,10 +1405,6 @@
* cluster. This will be written to an empty slot in the parent
* directory.
*/
-#ifdef DIAGNOSTIC
- if ((cnp->cn_flags & HASBUF) == 0)
- panic("msdosfs_mkdir: no name");
-#endif
error = uniqdosname(pdep, cnp, ndirent.de_Name);
if (error)
goto bad;
Index: sys/fs/nfsclient/nfs_clvnops.c
===================================================================
--- sys/fs/nfsclient/nfs_clvnops.c
+++ sys/fs/nfsclient/nfs_clvnops.c
@@ -1250,10 +1250,6 @@
* associated locking bookkeeping, etc.
*/
if (cnp->cn_namelen == 1 && cnp->cn_nameptr[0] == '.') {
- /* XXX: Is this really correct? */
- if (cnp->cn_nameiop != LOOKUP &&
- (flags & ISLASTCN))
- cnp->cn_flags |= SAVENAME;
return (0);
}
@@ -1288,9 +1284,6 @@
VOP_GETATTR(newvp, &vattr, cnp->cn_cred) == 0 &&
timespeccmp(&vattr.va_ctime, &nctime, ==))) {
NFSINCRGLOBAL(nfsstatsv1.lookupcache_hits);
- if (cnp->cn_nameiop != LOOKUP &&
- (flags & ISLASTCN))
- cnp->cn_flags |= SAVENAME;
return (0);
}
cache_purge(newvp);
@@ -1372,7 +1365,6 @@
*/
if (mp->mnt_flag & MNT_RDONLY)
return (EROFS);
- cnp->cn_flags |= SAVENAME;
return (EJUSTRETURN);
}
@@ -1428,7 +1420,6 @@
if (attrflag)
(void) nfscl_loadattrcache(&newvp, &nfsva, NULL, 0, 1);
*vpp = newvp;
- cnp->cn_flags |= SAVENAME;
return (0);
}
@@ -1513,8 +1504,6 @@
NFSUNLOCKNODE(np);
}
}
- if (cnp->cn_nameiop != LOOKUP && (flags & ISLASTCN))
- cnp->cn_flags |= SAVENAME;
if ((cnp->cn_flags & MAKEENTRY) && dvp != newvp &&
(cnp->cn_nameiop != DELETE || !(flags & ISLASTCN)) &&
attrflag != 0 && (newvp->v_type != VDIR || dattrflag != 0))
@@ -1881,7 +1870,6 @@
int error = 0;
struct vattr vattr;
- KASSERT((cnp->cn_flags & HASBUF) != 0, ("nfs_remove: no name"));
KASSERT(vrefcnt(vp) > 0, ("nfs_remove: bad v_usecount"));
if (vp->v_type == VDIR)
error = EPERM;
@@ -1994,8 +1982,6 @@
struct nfsv4node *newv4 = NULL;
int error;
- KASSERT((tcnp->cn_flags & HASBUF) != 0 &&
- (fcnp->cn_flags & HASBUF) != 0, ("nfs_rename: no name"));
/* Check for cross-device rename */
if ((fvp->v_mount != tdvp->v_mount) ||
(tvp && (fvp->v_mount != tvp->v_mount))) {
Index: sys/fs/nfsserver/nfs_nfsdport.c
===================================================================
--- sys/fs/nfsserver/nfs_nfsdport.c
+++ sys/fs/nfsserver/nfs_nfsdport.c
@@ -686,8 +686,6 @@
* termination occurs if no symlink encountered.
*/
if ((cnp->cn_flags & ISSYMLINK) == 0) {
- if ((cnp->cn_flags & (SAVENAME | SAVESTART)) == 0)
- nfsvno_relpathbuf(ndp);
if (ndp->ni_vp && !lockleaf)
NFSVOPUNLOCK(ndp->ni_vp);
break;
@@ -796,7 +794,7 @@
{
struct componentname *cnp = &ndp->ni_cnd;
- cnp->cn_flags |= (NOMACCHECK | HASBUF);
+ cnp->cn_flags |= (NOMACCHECK);
cnp->cn_pnbuf = uma_zalloc(namei_zone, M_WAITOK);
if (hashpp != NULL)
*hashpp = NULL;
@@ -810,10 +808,8 @@
nfsvno_relpathbuf(struct nameidata *ndp)
{
- if ((ndp->ni_cnd.cn_flags & HASBUF) == 0)
- panic("nfsrelpath");
uma_zfree(namei_zone, ndp->ni_cnd.cn_pnbuf);
- ndp->ni_cnd.cn_flags &= ~HASBUF;
+ ndp->ni_cnd.cn_pnbuf = NULL;
}
/*
@@ -1478,8 +1474,7 @@
else
vput(ndp->ni_dvp);
vput(vp);
- if ((ndp->ni_cnd.cn_flags & SAVENAME) != 0)
- nfsvno_relpathbuf(ndp);
+ nfsvno_relpathbuf(ndp);
NFSEXITCODE(error);
return (error);
}
@@ -1519,8 +1514,7 @@
else
vput(ndp->ni_dvp);
vput(vp);
- if ((ndp->ni_cnd.cn_flags & SAVENAME) != 0)
- nfsvno_relpathbuf(ndp);
+ nfsvno_relpathbuf(ndp);
NFSEXITCODE(error);
return (error);
}
@@ -1939,8 +1933,7 @@
}
}
} else {
- if (ndp->ni_cnd.cn_flags & HASBUF)
- nfsvno_relpathbuf(ndp);
+ nfsvno_relpathbuf(ndp);
if (ndp->ni_startdir && create == NFSV4OPEN_CREATE) {
vrele(ndp->ni_startdir);
if (ndp->ni_dvp == ndp->ni_vp)
@@ -4578,7 +4571,7 @@
named.ni_cnd.cn_nameiop = DELETE;
named.ni_cnd.cn_lkflags = LK_EXCLUSIVE | LK_RETRY;
named.ni_cnd.cn_cred = tcred;
- named.ni_cnd.cn_flags = ISLASTCN | LOCKPARENT | LOCKLEAF | SAVENAME;
+ named.ni_cnd.cn_flags = ISLASTCN | LOCKPARENT | LOCKLEAF;
nfsvno_setpathbuf(&named, &bufp, &hashp);
named.ni_cnd.cn_nameptr = bufp;
named.ni_cnd.cn_namelen = strlen(fname);
@@ -6351,7 +6344,7 @@
named.ni_cnd.cn_nameiop = LOOKUP;
named.ni_cnd.cn_lkflags = LK_SHARED | LK_RETRY;
named.ni_cnd.cn_cred = tcred;
- named.ni_cnd.cn_flags = ISLASTCN | LOCKPARENT | LOCKLEAF | SAVENAME;
+ named.ni_cnd.cn_flags = ISLASTCN | LOCKPARENT | LOCKLEAF;
nfsvno_setpathbuf(&named, &bufp, &hashp);
named.ni_cnd.cn_nameptr = bufp;
named.ni_cnd.cn_namelen = strlen(pf->dsf_filename);
Index: sys/fs/nfsserver/nfs_nfsdserv.c
===================================================================
--- sys/fs/nfsserver/nfs_nfsdserv.c
+++ sys/fs/nfsserver/nfs_nfsdserv.c
@@ -1360,7 +1360,7 @@
case NFFIFO:
break;
case NFDIR:
- cnflags = (LOCKPARENT | SAVENAME);
+ cnflags = LOCKPARENT;
break;
default:
nd->nd_repstat = NFSERR_BADTYPE;
@@ -1823,8 +1823,7 @@
NFSVOPUNLOCK(dp);
}
}
- NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
- LOCKPARENT | SAVENAME | NOCACHE);
+ NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE, LOCKPARENT | NOCACHE);
if (!nd->nd_repstat) {
nfsvno_setpathbuf(&named, &bufp, &hashp);
error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
@@ -2018,8 +2017,7 @@
nfsrv_wcc(nd, dirfor_ret, &dirfor, diraft_ret, &diraft);
goto out;
}
- NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE,
- LOCKPARENT | SAVENAME | NOCACHE);
+ NFSNAMEICNDSET(&named.ni_cnd, nd->nd_cred, CREATE, LOCKPARENT | NOCACHE);
nfsvno_setpathbuf(&named, &bufp, &hashp);
error = nfsrv_parsename(nd, bufp, hashp, &named.ni_pathlen);
if (error)
Index: sys/fs/smbfs/smbfs_vnops.c
===================================================================
--- sys/fs/smbfs/smbfs_vnops.c
+++ sys/fs/smbfs/smbfs_vnops.c
@@ -1241,8 +1241,6 @@
killit = 1;
else if (error == 0
/* && vattr.va_ctime.tv_sec == VTOSMB(vp)->n_ctime*/) {
- if (nameiop != LOOKUP && islastcn)
- cnp->cn_flags |= SAVENAME;
SMBVDEBUG("use cached vnode\n");
return (0);
}
@@ -1296,7 +1294,6 @@
error = VOP_ACCESS(dvp, VWRITE, cnp->cn_cred, td);
if (error)
goto out;
- cnp->cn_flags |= SAVENAME;
error = EJUSTRETURN;
goto out;
}
@@ -1321,7 +1318,6 @@
if (error)
goto out;
*vpp = vp;
- cnp->cn_flags |= SAVENAME;
goto out;
}
if (nameiop == RENAME && islastcn) {
@@ -1336,7 +1332,6 @@
if (error)
goto out;
*vpp = vp;
- cnp->cn_flags |= SAVENAME;
goto out;
}
if (flags & ISDOTDOT) {
Index: sys/fs/tmpfs/tmpfs_subr.c
===================================================================
--- sys/fs/tmpfs/tmpfs_subr.c
+++ sys/fs/tmpfs/tmpfs_subr.c
@@ -1051,7 +1051,6 @@
struct tmpfs_node *parent;
ASSERT_VOP_ELOCKED(dvp, "tmpfs_alloc_file");
- MPASS(cnp->cn_flags & HASBUF);
tmp = VFS_TO_TMPFS(dvp->v_mount);
dnode = VP_TO_TMPFS_DIR(dvp);
Index: sys/fs/tmpfs/tmpfs_vnops.c
===================================================================
--- sys/fs/tmpfs/tmpfs_vnops.c
+++ sys/fs/tmpfs/tmpfs_vnops.c
@@ -140,12 +140,6 @@
if (error != 0)
goto out;
- /*
- * Keep the component name in the buffer for
- * future uses.
- */
- cnp->cn_flags |= SAVENAME;
-
error = EJUSTRETURN;
} else
error = ENOENT;
@@ -199,7 +193,6 @@
*vpp = NULL;
goto out;
}
- cnp->cn_flags |= SAVENAME;
} else {
error = tmpfs_alloc_vp(dvp->v_mount, tnode,
cnp->cn_lkflags, vpp);
@@ -778,7 +771,6 @@
struct tmpfs_node *node;
MPASS(VOP_ISLOCKED(dvp));
- MPASS(cnp->cn_flags & HASBUF);
MPASS(dvp != vp); /* XXX When can this be false? */
node = VP_TO_TMPFS_NODE(vp);
@@ -971,8 +963,6 @@
MPASS(VOP_ISLOCKED(tdvp));
MPASS(IMPLIES(tvp != NULL, VOP_ISLOCKED(tvp)));
- MPASS(fcnp->cn_flags & HASBUF);
- MPASS(tcnp->cn_flags & HASBUF);
want_seqc_end = false;
Index: sys/fs/unionfs/union_subr.c
===================================================================
--- sys/fs/unionfs/union_subr.c
+++ sys/fs/unionfs/union_subr.c
@@ -666,7 +666,7 @@
cn->cn_namelen = pathlen;
cn->cn_pnbuf = path;
cn->cn_nameiop = nameiop;
- cn->cn_flags = (LOCKPARENT | LOCKLEAF | HASBUF | SAVENAME | ISLASTCN);
+ cn->cn_flags = (LOCKPARENT | LOCKLEAF | ISLASTCN);
cn->cn_lkflags = LK_EXCLUSIVE;
cn->cn_cred = cnp->cn_cred;
cn->cn_nameptr = cn->cn_pnbuf;
@@ -686,10 +686,6 @@
} else
vrele(dvp);
- KASSERT((cn->cn_flags & HASBUF) != 0,
- ("%s: HASBUF cleared", __func__));
- KASSERT((cn->cn_flags & SAVENAME) != 0,
- ("%s: SAVENAME cleared", __func__));
KASSERT(cn->cn_pnbuf == path, ("%s: cn_pnbuf changed", __func__));
return (error);
@@ -716,8 +712,6 @@
udvp = UNIONFSVPTOUPPERVP(dvp);
vp = NULLVP;
- KASSERT((cnp->cn_flags & HASBUF) != 0,
- ("%s called without HASBUF", __func__));
error = unionfs_relookup(udvp, &vp, cnp, &cn, td, cnp->cn_nameptr,
cnp->cn_namelen, CREATE);
if (error)
@@ -752,8 +746,6 @@
udvp = UNIONFSVPTOUPPERVP(dvp);
vp = NULLVP;
- KASSERT((cnp->cn_flags & HASBUF) != 0,
- ("%s called without HASBUF", __func__));
error = unionfs_relookup(udvp, &vp, cnp, &cn, td, cnp->cn_nameptr,
cnp->cn_namelen, DELETE);
if (error)
@@ -788,8 +780,6 @@
udvp = UNIONFSVPTOUPPERVP(dvp);
vp = NULLVP;
- KASSERT((cnp->cn_flags & HASBUF) != 0,
- ("%s called without HASBUF", __func__));
error = unionfs_relookup(udvp, &vp, cnp, &cn, td, cnp->cn_nameptr,
cnp->cn_namelen, RENAME);
if (error)
@@ -1020,8 +1010,7 @@
nd.ni_cnd.cn_namelen = unp->un_pathlen;
nd.ni_cnd.cn_pnbuf = unp->un_path;
nd.ni_cnd.cn_nameiop = CREATE;
- nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | HASBUF | SAVENAME |
- ISLASTCN;
+ nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | ISLASTCN;
nd.ni_cnd.cn_lkflags = LK_EXCLUSIVE;
nd.ni_cnd.cn_cred = cred;
nd.ni_cnd.cn_nameptr = nd.ni_cnd.cn_pnbuf;
@@ -1061,10 +1050,6 @@
VOP_UNLOCK(udvp);
unionfs_vn_create_on_upper_free_out2:
- KASSERT((nd.ni_cnd.cn_flags & HASBUF) != 0,
- ("%s: HASBUF cleared", __func__));
- KASSERT((nd.ni_cnd.cn_flags & SAVENAME) != 0,
- ("%s: SAVENAME cleared", __func__));
KASSERT(nd.ni_cnd.cn_pnbuf == unp->un_path,
("%s: cn_pnbuf changed", __func__));
@@ -1290,8 +1275,7 @@
cn.cn_pnbuf = NULL;
cn.cn_nameptr = dp->d_name;
cn.cn_nameiop = LOOKUP;
- cn.cn_flags = LOCKPARENT | LOCKLEAF | SAVENAME |
- RDONLY | ISLASTCN;
+ cn.cn_flags = LOCKPARENT | LOCKLEAF | RDONLY | ISLASTCN;
cn.cn_lkflags = LK_EXCLUSIVE;
cn.cn_cred = cred;
@@ -1312,8 +1296,7 @@
* If it has no exist/whiteout entry in upper,
* directory is not empty.
*/
- cn.cn_flags = LOCKPARENT | LOCKLEAF | SAVENAME |
- RDONLY | ISLASTCN;
+ cn.cn_flags = LOCKPARENT | LOCKLEAF | RDONLY | ISLASTCN;
lookuperr = VOP_LOOKUP(uvp, &tvp, &cn);
if (!lookuperr)
Index: sys/fs/unionfs/union_vnops.c
===================================================================
--- sys/fs/unionfs/union_vnops.c
+++ sys/fs/unionfs/union_vnops.c
@@ -348,10 +348,6 @@
unionfs_lookup_return:
- /* Ensure subsequent vnops will get a valid pathname buffer. */
- if (nameiop != LOOKUP && (error == 0 || error == EJUSTRETURN))
- cnp->cn_flags |= SAVENAME;
-
UNIONFS_INTERNAL_DEBUG("unionfs_lookup: leave (%d)\n", error);
return (error);
@@ -1205,11 +1201,6 @@
rtvp = tvp;
needrelookup = 0;
-#ifdef DIAGNOSTIC
- if (!(fcnp->cn_flags & HASBUF) || !(tcnp->cn_flags & HASBUF))
- panic("unionfs_rename: no name");
-#endif
-
/* check for cross device rename */
if (fvp->v_mount != tdvp->v_mount ||
(tvp != NULLVP && fvp->v_mount != tvp->v_mount)) {
Index: sys/kern/kern_exec.c
===================================================================
--- sys/kern/kern_exec.c
+++ sys/kern/kern_exec.c
@@ -474,7 +474,7 @@
* pointer in ni_vp among other things.
*/
NDINIT(&nd, LOOKUP, ISOPEN | LOCKLEAF | LOCKSHARED | FOLLOW |
- SAVENAME | AUDITVNODE1 | WANTPARENT, UIO_SYSSPACE,
+ AUDITVNODE1 | WANTPARENT, UIO_SYSSPACE,
args->fname);
error = namei(&nd);
Index: sys/kern/uipc_mqueue.c
===================================================================
--- sys/kern/uipc_mqueue.c
+++ sys/kern/uipc_mqueue.c
@@ -941,7 +941,6 @@
error = VOP_ACCESS(dvp, VWRITE, cnp->cn_cred, td);
if (error)
return (error);
- cnp->cn_flags |= SAVENAME;
return (EJUSTRETURN);
}
return (ENOENT);
@@ -997,8 +996,6 @@
if (mq == NULL)
return (EAGAIN);
sx_xlock(&mqfs->mi_lock);
- if ((cnp->cn_flags & HASBUF) == 0)
- panic("%s: no name", __func__);
pn = mqfs_create_file(pd, cnp->cn_nameptr, cnp->cn_namelen,
cnp->cn_cred, ap->a_vap->va_mode);
if (pn == NULL) {
@@ -1492,8 +1489,6 @@
if (pd->mn_type != mqfstype_root && pd->mn_type != mqfstype_dir)
return (ENOTDIR);
sx_xlock(&mqfs->mi_lock);
- if ((cnp->cn_flags & HASBUF) == 0)
- panic("%s: no name", __func__);
pn = mqfs_create_dir(pd, cnp->cn_nameptr, cnp->cn_namelen,
ap->a_vap->cn_cred, ap->a_vap->va_mode);
if (pn != NULL)
Index: sys/kern/uipc_usrreq.c
===================================================================
--- sys/kern/uipc_usrreq.c
+++ sys/kern/uipc_usrreq.c
@@ -593,7 +593,7 @@
buf[namelen] = 0;
restart:
- NDINIT_ATRIGHTS(&nd, CREATE, NOFOLLOW | LOCKPARENT | SAVENAME | NOCACHE,
+ NDINIT_ATRIGHTS(&nd, CREATE, NOFOLLOW | LOCKPARENT | NOCACHE,
UIO_SYSSPACE, buf, fd, cap_rights_init_one(&rights, CAP_BINDAT));
/* SHOULD BE ABLE TO ADOPT EXISTING AND wakeup() ALA FIFO's */
error = namei(&nd);
@@ -1919,9 +1919,9 @@
else
vp = nd.ni_vp;
ASSERT_VOP_LOCKED(vp, "unp_connect");
- NDFREE_NOTHING(&nd);
if (error)
goto bad;
+ NDFREE_PNBUF(&nd);
if (vp->v_type != VSOCK) {
error = ENOTSOCK;
Index: sys/kern/vfs_cache.c
===================================================================
--- sys/kern/vfs_cache.c
+++ sys/kern/vfs_cache.c
@@ -3134,7 +3134,7 @@
if (flags != 0)
return (EINVAL);
- NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | SAVENAME | WANTPARENT | AUDITVNODE1,
+ NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | WANTPARENT | AUDITVNODE1,
pathseg, path, fd, &cap_fstat_rights);
if ((error = namei(&nd)) != 0)
return (error);
@@ -3600,9 +3600,9 @@
/*
* Resolve an arbitrary vnode to a pathname (taking care of hardlinks).
*
- * Since the namecache does not track hardlinks, the caller is
- * expected to first look up the target vnode with SAVENAME |
- * WANTPARENT flags passed to namei to get dvp and vp.
+ * Since the namecache does not track hardlinks, the caller is expected to
+ * first look up the target vnode with WANTPARENT flag passed to namei to get
+ * dvp and vp.
*
* Then we have 2 cases:
* - if the found vnode is a directory, the path can be constructed just by
@@ -3928,7 +3928,6 @@
enum cache_fpl_status status:8;
bool in_smr;
bool fsearch;
- bool savename;
struct pwd **pwd;
#ifdef INVARIANTS
struct cache_fpl_debug debug;
@@ -4166,7 +4165,6 @@
fpl->line = line;
fpl->dvp = NULL;
fpl->tvp = NULL;
- fpl->savename = false;
return (error);
}
@@ -4181,9 +4179,9 @@
#define CACHE_FPL_SUPPORTED_CN_FLAGS \
(NC_NOMAKEENTRY | NC_KEEPPOSENTRY | LOCKLEAF | LOCKPARENT | WANTPARENT | \
- FAILIFEXISTS | FOLLOW | EMPTYPATH | LOCKSHARED | SAVENAME | SAVESTART | \
- WILLBEDIR | ISOPEN | NOMACCHECK | AUDITVNODE1 | AUDITVNODE2 | NOCAPCHECK | \
- OPENREAD | OPENWRITE | WANTIOCTLCAPS)
+ FAILIFEXISTS | FOLLOW | EMPTYPATH | LOCKSHARED | SAVESTART | WILLBEDIR | \
+ ISOPEN | NOMACCHECK | AUDITVNODE1 | AUDITVNODE2 | NOCAPCHECK | OPENREAD | \
+ OPENWRITE | WANTIOCTLCAPS)
#define CACHE_FPL_INTERNAL_CN_FLAGS \
(ISDOTDOT | MAKEENTRY | ISLASTCN)
@@ -4530,14 +4528,11 @@
}
fpl->tvp = tvp;
- fpl->savename = (cnp->cn_flags & SAVENAME) != 0;
if (tvp == NULL) {
if ((cnp->cn_flags & SAVESTART) != 0) {
ndp->ni_startdir = dvp;
vrefact(ndp->ni_startdir);
- cnp->cn_flags |= SAVENAME;
- fpl->savename = true;
}
MPASS(error == EJUSTRETURN);
if ((cnp->cn_flags & LOCKPARENT) == 0) {
@@ -4598,8 +4593,6 @@
if ((cnp->cn_flags & SAVESTART) != 0) {
ndp->ni_startdir = dvp;
vrefact(ndp->ni_startdir);
- cnp->cn_flags |= SAVENAME;
- fpl->savename = true;
}
return (cache_fpl_handled(fpl));
@@ -4944,9 +4937,6 @@
}
fpl->tvp = tvp;
- if (!fpl->savename) {
- MPASS((cnp->cn_flags & SAVENAME) == 0);
- }
if (tvp == NULL) {
MPASS(error == EJUSTRETURN);
@@ -6080,7 +6070,6 @@
#endif
fpl.nulchar = &cnp->cn_nameptr[ndp->ni_pathlen - 1];
fpl.fsearch = false;
- fpl.savename = (cnp->cn_flags & SAVENAME) != 0;
fpl.tvp = NULL; /* for degenerate path handling */
fpl.pwd = pwdp;
pwd = pwd_get_smr();
@@ -6119,17 +6108,12 @@
if (__predict_true(fpl.status == CACHE_FPL_STATUS_HANDLED)) {
MPASS(error != CACHE_FPL_FAILED);
if (error != 0) {
+ cache_fpl_cleanup_cnp(fpl.cnp);
MPASS(fpl.dvp == NULL);
MPASS(fpl.tvp == NULL);
- MPASS(fpl.savename == false);
}
ndp->ni_dvp = fpl.dvp;
ndp->ni_vp = fpl.tvp;
- if (fpl.savename) {
- cnp->cn_flags |= HASBUF;
- } else {
- cache_fpl_cleanup_cnp(cnp);
- }
}
return (error);
}
Index: sys/kern/vfs_lookup.c
===================================================================
--- sys/kern/vfs_lookup.c
+++ sys/kern/vfs_lookup.c
@@ -260,10 +260,8 @@
{
uma_zfree(namei_zone, cnp->cn_pnbuf);
-#ifdef DIAGNOSTIC
cnp->cn_pnbuf = NULL;
cnp->cn_nameptr = NULL;
-#endif
}
static int
@@ -589,13 +587,6 @@
("%s: FAILIFEXISTS must be passed with LOCKPARENT and without LOCKLEAF",
__func__));
}
- /*
- * For NDVALIDATE.
- *
- * While NDINIT may seem like a more natural place to do it, there are
- * callers which directly modify flags past invoking init.
- */
- cnp->cn_origflags = cnp->cn_flags;
#endif
ndp->ni_cnd.cn_cred = td->td_ucred;
KASSERT(ndp->ni_resflags == 0, ("%s: garbage in ni_resflags: %x\n",
@@ -690,10 +681,6 @@
if ((cnp->cn_flags & ISSYMLINK) == 0) {
SDT_PROBE4(vfs, namei, lookup, return, error,
(error == 0 ? ndp->ni_vp : NULL), false, ndp);
- if ((cnp->cn_flags & (SAVENAME | SAVESTART)) == 0) {
- namei_cleanup_cnp(cnp);
- } else
- cnp->cn_flags |= HASBUF;
nameicap_cleanup(ndp);
pwd_drop(pwd);
if (error == 0)
@@ -998,9 +985,7 @@
* Search a new directory.
*
* The last component of the filename is left accessible via
- * cnp->cn_nameptr for callers that need the name. Callers needing
- * the name set the SAVENAME flag. When done, they assume
- * responsibility for freeing the pathname buffer.
+ * cnp->cn_nameptr. It has to be freed with a call to NDFREE*.
*
* Store / as a temporary sentinel so that we only have one character
* to test for. Pathnames tend to be short so this should not be
@@ -1445,10 +1430,7 @@
/*
* Search a new directory.
*
- * The last component of the filename is left accessible via
- * cnp->cn_nameptr for callers that need the name. Callers needing
- * the name set the SAVENAME flag. When done, they assume
- * responsibility for freeing the pathname buffer.
+ * See a comment in vfs_lookup for cnp->cn_nameptr.
*/
#ifdef NAMEI_DIAGNOSTIC
printf("{%s}: ", cnp->cn_nameptr);
@@ -1547,47 +1529,6 @@
return (error);
}
-/*
- * Free data allocated by namei(); see namei(9) for details.
- */
-void
-NDFREE_PNBUF(struct nameidata *ndp)
-{
-
- if ((ndp->ni_cnd.cn_flags & HASBUF) != 0) {
- MPASS((ndp->ni_cnd.cn_flags & (SAVENAME | SAVESTART)) != 0);
- uma_zfree(namei_zone, ndp->ni_cnd.cn_pnbuf);
- ndp->ni_cnd.cn_flags &= ~HASBUF;
- }
-}
-
-/*
- * NDFREE_PNBUF replacement for callers that know there is no buffer.
- *
- * This is a hack. Preferably the VFS layer would not produce anything more
- * than it was asked to do. Unfortunately several non-LOOKUP cases can add the
- * HASBUF flag to the result. Even then an interface could be implemented where
- * the caller specifies what they expected to see in the result and what they
- * are going to take care of.
- *
- * In the meantime provide this kludge as a trivial replacement for NDFREE_PNBUF
- * calls scattered throughout the kernel where we know for a fact the flag must not
- * be seen.
- */
-#ifdef INVARIANTS
-void
-NDFREE_NOTHING(struct nameidata *ndp)
-{
- struct componentname *cnp;
-
- cnp = &ndp->ni_cnd;
- KASSERT(cnp->cn_nameiop == LOOKUP, ("%s: got non-LOOKUP op %d\n",
- __func__, cnp->cn_nameiop));
- KASSERT((cnp->cn_flags & (SAVENAME | HASBUF)) == 0,
- ("%s: bad flags \%" PRIx64 "\n", __func__, cnp->cn_flags));
-}
-#endif
-
void
(NDFREE)(struct nameidata *ndp, const u_int flags)
{
@@ -1638,62 +1579,15 @@
#ifdef INVARIANTS
/*
* Validate the final state of ndp after the lookup.
- *
- * Historically filesystems were allowed to modify cn_flags. Most notably they
- * can add SAVENAME to the request, resulting in HASBUF and pushing subsequent
- * clean up to the consumer. In practice this seems to only concern != LOOKUP
- * operations.
- *
- * As a step towards stricter API contract this routine validates the state to
- * clean up. Note validation is a work in progress with the intent of becoming
- * stricter over time.
*/
-#define NDMODIFYINGFLAGS (LOCKLEAF | LOCKPARENT | WANTPARENT | SAVENAME | SAVESTART | HASBUF)
-static void
+void
NDVALIDATE(struct nameidata *ndp)
{
struct componentname *cnp;
- uint64_t used, orig;
cnp = &ndp->ni_cnd;
- orig = cnp->cn_origflags;
- used = cnp->cn_flags;
- switch (cnp->cn_nameiop) {
- case LOOKUP:
- /*
- * For plain lookup we require strict conformance -- nothing
- * to clean up if it was not requested by the caller.
- */
- orig &= NDMODIFYINGFLAGS;
- used &= NDMODIFYINGFLAGS;
- if ((orig & (SAVENAME | SAVESTART)) != 0)
- orig |= HASBUF;
- if (orig != used) {
- goto out_mismatch;
- }
- break;
- case CREATE:
- case DELETE:
- case RENAME:
- /*
- * Some filesystems set SAVENAME to provoke HASBUF, accommodate
- * for it until it gets fixed.
- */
- orig &= NDMODIFYINGFLAGS;
- orig |= (SAVENAME | HASBUF);
- used &= NDMODIFYINGFLAGS;
- used |= (SAVENAME | HASBUF);
- if (orig != used) {
- goto out_mismatch;
- }
- break;
- }
- return;
-out_mismatch:
- panic("%s: mismatched flags for op %d: added %" PRIx64 ", "
- "removed %" PRIx64" (%" PRIx64" != %" PRIx64"; stored %" PRIx64" != %" PRIx64")",
- __func__, cnp->cn_nameiop, used & ~orig, orig &~ used,
- orig, used, cnp->cn_origflags, cnp->cn_flags);
+ if (cnp->cn_pnbuf == NULL)
+ panic("%s: got no buf!", __func__);
}
#endif
Index: sys/kern/vfs_subr.c
===================================================================
--- sys/kern/vfs_subr.c
+++ sys/kern/vfs_subr.c
@@ -395,7 +395,7 @@
buf[req->newlen] = '\0';
- ndflags = LOCKLEAF | NOFOLLOW | AUDITVNODE1 | SAVENAME;
+ ndflags = LOCKLEAF | NOFOLLOW | AUDITVNODE1;
NDINIT(&nd, LOOKUP, ndflags, UIO_SYSSPACE, buf);
if ((error = namei(&nd)) != 0)
goto out;
Index: sys/kern/vfs_syscalls.c
===================================================================
--- sys/kern/vfs_syscalls.c
+++ sys/kern/vfs_syscalls.c
@@ -338,8 +338,8 @@
error = namei(&nd);
if (error != 0)
return (error);
+ NDFREE_PNBUF(&nd);
mp = vfs_ref_from_vp(nd.ni_vp);
- NDFREE_NOTHING(&nd);
vrele(nd.ni_vp);
return (kern_do_statfs(td, mp, buf));
}
@@ -957,11 +957,11 @@
return (error);
if ((error = change_dir(nd.ni_vp, td)) != 0) {
vput(nd.ni_vp);
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
return (error);
}
VOP_UNLOCK(nd.ni_vp);
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
pwd_chdir(td, nd.ni_vp);
return (0);
}
@@ -1012,12 +1012,12 @@
VOP_UNLOCK(nd.ni_vp);
error = pwd_chroot(td, nd.ni_vp);
vrele(nd.ni_vp);
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
return (error);
e_vunlock:
vput(nd.ni_vp);
error:
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
return (error);
}
@@ -1354,8 +1354,8 @@
NDPREINIT(&nd);
restart:
bwillwrite();
- NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE1 |
- NOCACHE, pathseg, path, fd, &cap_mknodat_rights);
+ NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | AUDITVNODE1 | NOCACHE,
+ pathseg, path, fd, &cap_mknodat_rights);
if ((error = namei(&nd)) != 0)
return (error);
vp = nd.ni_vp;
@@ -1462,8 +1462,8 @@
NDPREINIT(&nd);
restart:
bwillwrite();
- NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE1 |
- NOCACHE, pathseg, path, fd, &cap_mkfifoat_rights);
+ NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | AUDITVNODE1 | NOCACHE,
+ pathseg, path, fd, &cap_mkfifoat_rights);
if ((error = namei(&nd)) != 0)
return (error);
if (nd.ni_vp != NULL) {
@@ -1621,7 +1621,7 @@
return (EPERM); /* POSIX */
}
NDINIT_ATRIGHTS(&nd, CREATE,
- LOCKPARENT | SAVENAME | AUDITVNODE2 | NOCACHE, segflag, path, fd,
+ LOCKPARENT | AUDITVNODE2 | NOCACHE, segflag, path, fd,
&cap_linkat_target_rights);
if ((error = namei(&nd)) == 0) {
if (nd.ni_vp != NULL) {
@@ -1739,8 +1739,8 @@
NDPREINIT(&nd);
restart:
bwillwrite();
- NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE1 |
- NOCACHE, segflg, path2, fd, &cap_symlinkat_rights);
+ NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | AUDITVNODE1 | NOCACHE, segflg,
+ path2, fd, &cap_symlinkat_rights);
if ((error = namei(&nd)) != 0)
goto out;
if (nd.ni_vp) {
@@ -2151,7 +2151,7 @@
vp = nd.ni_vp;
error = vn_access(vp, amode, usecred, td);
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
vput(vp);
out:
if (usecred != cred) {
@@ -2455,7 +2455,7 @@
hook(nd.ni_vp, sbp);
}
}
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
vput(nd.ni_vp);
#ifdef __STAT_TIME_T_EXT
sbp->st_atim_ext = 0;
@@ -2606,7 +2606,7 @@
pathseg, path);
if ((error = namei(&nd)) != 0)
return (error);
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
error = VOP_PATHCONF(nd.ni_vp, name, valuep);
vput(nd.ni_vp);
@@ -2662,7 +2662,7 @@
if ((error = namei(&nd)) != 0)
return (error);
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
vp = nd.ni_vp;
error = kern_readlink_vp(vp, buf, bufseg, count, td);
@@ -2813,7 +2813,7 @@
fd, &cap_fchflags_rights);
if ((error = namei(&nd)) != 0)
return (error);
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
error = setfflags(td, nd.ni_vp, flags);
vrele(nd.ni_vp);
return (error);
@@ -2944,7 +2944,7 @@
fd, &cap_fchmod_rights);
if ((error = namei(&nd)) != 0)
return (error);
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
error = setfmode(td, td->td_ucred, nd.ni_vp, mode);
vrele(nd.ni_vp);
return (error);
@@ -3057,7 +3057,7 @@
if ((error = namei(&nd)) != 0)
return (error);
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
error = setfown(td, td->td_ucred, nd.ni_vp, uid, gid);
vrele(nd.ni_vp);
return (error);
@@ -3274,7 +3274,7 @@
if ((error = namei(&nd)) != 0)
return (error);
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
error = setutimes(td, nd.ni_vp, ts, 2, tptr == NULL);
vrele(nd.ni_vp);
return (error);
@@ -3310,7 +3310,7 @@
NDINIT(&nd, LOOKUP, NOFOLLOW | AUDITVNODE1, pathseg, path);
if ((error = namei(&nd)) != 0)
return (error);
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
error = setutimes(td, nd.ni_vp, ts, 2, tptr == NULL);
vrele(nd.ni_vp);
return (error);
@@ -3429,7 +3429,7 @@
* "If both tv_nsec fields are UTIME_OMIT... EACCESS may be detected."
* "Search permission is denied by a component of the path prefix."
*/
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
if ((flags & UTIMENS_EXIT) == 0)
error = setutimes(td, nd.ni_vp, ts, 2, flags & UTIMENS_NULL);
vrele(nd.ni_vp);
@@ -3471,7 +3471,7 @@
if ((error = namei(&nd)) != 0)
return (error);
vp = nd.ni_vp;
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
rl_cookie = vn_rangelock_wlock(vp, 0, OFF_MAX);
if ((error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) {
vn_rangelock_unlock(vp, rl_cookie);
@@ -3833,7 +3833,7 @@
NDPREINIT(&nd);
restart:
bwillwrite();
- NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | SAVENAME | AUDITVNODE1 |
+ NDINIT_ATRIGHTS(&nd, CREATE, LOCKPARENT | AUDITVNODE1 |
NC_NOMAKEENTRY | NC_KEEPPOSENTRY | FAILIFEXISTS | WILLBEDIR,
segflg, path, fd, &cap_mkdirat_rights);
if ((error = namei(&nd)) != 0)
@@ -4286,7 +4286,7 @@
if ((error = namei(&nd)) != 0)
return (error);
vp = nd.ni_vp;
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
if (vp->v_type != VCHR || vp->v_rdev == NULL) {
error = EINVAL;
goto out;
@@ -4450,7 +4450,7 @@
error = namei(&nd);
if (error != 0)
return (error);
- NDFREE_NOTHING(&nd);
+ NDFREE_PNBUF(&nd);
vp = nd.ni_vp;
bzero(&fh, sizeof(fh));
fh.fh_fsid = vp->v_mount->mnt_stat.f_fsid;
Index: sys/sys/namei.h
===================================================================
--- sys/sys/namei.h
+++ sys/sys/namei.h
@@ -158,20 +158,9 @@
/*
* Namei parameter descriptors.
- *
- * SAVENAME may be set by either the callers of namei or by VOP_LOOKUP.
- * If the caller of namei sets the flag (for example execve wants to
- * know the name of the program that is being executed), then it must
- * free the buffer. If VOP_LOOKUP sets the flag, then the buffer must
- * be freed by either the commit routine or the VOP_ABORT routine.
- * SAVESTART is set only by the callers of namei. It implies SAVENAME
- * plus the addition of saving the parent directory that contains the
- * name in ni_startdir. It allows repeated calls to lookup for the
- * name being sought. The caller is responsible for releasing the
- * buffer and for vrele'ing ni_startdir.
*/
#define RDONLY 0x00000200 /* lookup with read-only semantics */
-#define SAVENAME 0x00000400 /* save pathname buffer */
+/* UNUSED 0x00000400 */
#define SAVESTART 0x00000800 /* save starting directory */
#define ISWHITEOUT 0x00001000 /* found whiteout */
#define DOWHITEOUT 0x00002000 /* do whiteouts */
@@ -185,7 +174,7 @@
#define OPENREAD 0x00200000 /* open for reading */
#define OPENWRITE 0x00400000 /* open for writing */
#define WANTIOCTLCAPS 0x00800000 /* leave ioctl caps for the caller */
-#define HASBUF 0x01000000 /* has allocated pathname buffer */
+/* UNUSED 0x01000000 */
#define NOEXECCHECK 0x02000000 /* do not perform exec check on dir */
#define MAKEENTRY 0x04000000 /* entry is to be added to name cache */
#define ISSYMLINK 0x08000000 /* symlink needs interpretation */
@@ -198,7 +187,7 @@
* Flags which must not be passed in by callers.
*/
#define NAMEI_INTERNAL_FLAGS \
- (HASBUF | NOEXECCHECK | MAKEENTRY | ISSYMLINK | ISLASTCN | ISDOTDOT | \
+ (NOEXECCHECK | MAKEENTRY | ISSYMLINK | ISLASTCN | ISDOTDOT | \
TRAILINGSLASH)
/*
@@ -293,14 +282,13 @@
struct nameidata *_ndp = (ndp); \
filecaps_free(&_ndp->ni_filecaps); \
} while (0)
-void NDFREE_PNBUF(struct nameidata *);
-void NDFREE(struct nameidata *, const u_int);
-#ifdef INVARIANTS
-void NDFREE_NOTHING(struct nameidata *);
-#else
-#define NDFREE_NOTHING(ndp) do { } while (0)
-#endif
+#define NDFREE_PNBUF(ndp) do { \
+ struct nameidata *_ndp = (ndp); \
+ uma_zfree(namei_zone, _ndp->ni_cnd.cn_pnbuf); \
+} while (0)
+
+void NDFREE(struct nameidata *, const u_int);
int namei(struct nameidata *ndp);
int vfs_lookup(struct nameidata *ndp);
Index: sys/sys/param.h
===================================================================
--- sys/sys/param.h
+++ sys/sys/param.h
@@ -76,7 +76,7 @@
* cannot include sys/param.h and should only be updated here.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 1400067
+#define __FreeBSD_version 1400068
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
Index: sys/ufs/ufs/ufs_lookup.c
===================================================================
--- sys/ufs/ufs/ufs_lookup.c
+++ sys/ufs/ufs/ufs_lookup.c
@@ -524,13 +524,10 @@
* We return ni_vp == NULL to indicate that the entry
* does not currently exist; we leave a pointer to
* the (locked) directory inode in ndp->ni_dvp.
- * The pathname buffer is saved so that the name
- * can be obtained later.
*
* NB - if the directory is unlocked, then this
* information cannot be used.
*/
- cnp->cn_flags |= SAVENAME;
return (EJUSTRETURN);
}
/*
@@ -670,7 +667,6 @@
#endif
*vpp = tdp;
- cnp->cn_flags |= SAVENAME;
return (0);
}
if (dd_ino != NULL)
@@ -830,8 +826,6 @@
u_int namelen;
namelen = (unsigned)cnp->cn_namelen;
- KASSERT((cnp->cn_flags & SAVENAME) != 0,
- ("ufs_makedirentry: missing name"));
KASSERT(namelen <= UFS_MAXNAMLEN,
("ufs_makedirentry: name too long"));
newdirp->d_ino = ip->i_number;
Index: sys/ufs/ufs/ufs_vnops.c
===================================================================
--- sys/ufs/ufs/ufs_vnops.c
+++ sys/ufs/ufs/ufs_vnops.c
@@ -1099,11 +1099,6 @@
struct direct newdir;
int error;
-#ifdef INVARIANTS
- if ((cnp->cn_flags & HASBUF) == 0)
- panic("ufs_link: no name");
-#endif
-
if (DOINGSUJ(tdvp)) {
error = softdep_prelink(tdvp, vp, cnp);
if (error != 0) {
@@ -1194,8 +1189,6 @@
case CREATE:
/* create a new directory whiteout */
#ifdef INVARIANTS
- if ((cnp->cn_flags & SAVENAME) == 0)
- panic("ufs_whiteout: missing name");
if (OFSFMT(dvp))
panic("ufs_whiteout: old format filesystem");
#endif
@@ -1283,11 +1276,6 @@
checkpath_locked = want_seqc_end = false;
-#ifdef INVARIANTS
- if ((tcnp->cn_flags & HASBUF) == 0 ||
- (fcnp->cn_flags & HASBUF) == 0)
- panic("ufs_rename: no name");
-#endif
endoff = 0;
mp = tdvp->v_mount;
VOP_UNLOCK(tdvp);
@@ -2020,10 +2008,6 @@
int error, dmode;
long blkoff;
-#ifdef INVARIANTS
- if ((cnp->cn_flags & HASBUF) == 0)
- panic("ufs_mkdir: no name");
-#endif
dp = VTOI(dvp);
error = ufs_sync_nlink(dvp, NULL);
if (error != 0)
@@ -2795,10 +2779,6 @@
int error;
pdir = VTOI(dvp);
-#ifdef INVARIANTS
- if ((cnp->cn_flags & HASBUF) == 0)
- panic("%s: no name", callfunc);
-#endif
*vpp = NULL;
if ((mode & IFMT) == 0)
mode |= IFREG;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Sep 19, 5:50 PM (18 h, 39 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29787040
Default Alt Text
D36542.1789840222.diff (40 KB)
Attached To
Mode
D36542: vfs: always retain path buffer after lookup
Attached
Detach File
Event Timeline
Log In to Comment