Module Name: src Committed By: dholland Date: Tue Sep 15 15:00:32 UTC 2015
Modified Files: src/sys/ufs/lfs: lfs_rename.c lfs_vnops.c ulfs_extern.h ulfs_lookup.c ulfs_vnops.c Log Message: Kill off ulfs_makedirentry; just pass the data to ulfs_direnter instead. For now, move one copy of the code that allocates and fills in a temporary struct lfs_direct to the top of ulfs_direnter; but it should go away shortly. To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/sys/ufs/lfs/lfs_rename.c cvs rdiff -u -r1.289 -r1.290 src/sys/ufs/lfs/lfs_vnops.c cvs rdiff -u -r1.16 -r1.17 src/sys/ufs/lfs/ulfs_extern.h cvs rdiff -u -r1.27 -r1.28 src/sys/ufs/lfs/ulfs_lookup.c cvs rdiff -u -r1.29 -r1.30 src/sys/ufs/lfs/ulfs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/ufs/lfs/lfs_rename.c diff -u src/sys/ufs/lfs/lfs_rename.c:1.10 src/sys/ufs/lfs/lfs_rename.c:1.11 --- src/sys/ufs/lfs/lfs_rename.c:1.10 Tue Sep 15 14:58:06 2015 +++ src/sys/ufs/lfs/lfs_rename.c Tue Sep 15 15:00:32 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_rename.c,v 1.10 2015/09/15 14:58:06 dholland Exp $ */ +/* $NetBSD: lfs_rename.c,v 1.11 2015/09/15 15:00:32 dholland Exp $ */ /* from NetBSD: ufs_rename.c,v 1.6 2013/01/22 09:39:18 dholland Exp */ /*- @@ -89,7 +89,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_rename.c,v 1.10 2015/09/15 14:58:06 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_rename.c,v 1.11 2015/09/15 15:00:32 dholland Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -770,7 +770,6 @@ ulfs_gro_rename(struct mount *mp, kauth_ struct ulfs_lookup_results *fulr = fde; struct ulfs_lookup_results *tulr = tde; bool directory_p, reparent_p; - struct lfs_direct *newdir; int error; KASSERT(mp != NULL); @@ -871,10 +870,9 @@ ulfs_gro_rename(struct mount *mp, kauth_ } } - newdir = pool_cache_get(ulfs_direct_cache, PR_WAITOK); - ulfs_makedirentry(VTOI(fvp), tcnp, newdir); - error = ulfs_direnter(tdvp, tulr, NULL, newdir, tcnp, NULL); - pool_cache_put(ulfs_direct_cache, newdir); + error = ulfs_direnter(tdvp, tulr, + NULL, tcnp, VTOI(fvp)->i_number, LFS_IFTODT(VTOI(fvp)->i_mode), + NULL); if (error) { if (directory_p && reparent_p) { /* Index: src/sys/ufs/lfs/lfs_vnops.c diff -u src/sys/ufs/lfs/lfs_vnops.c:1.289 src/sys/ufs/lfs/lfs_vnops.c:1.290 --- src/sys/ufs/lfs/lfs_vnops.c:1.289 Tue Sep 1 06:16:59 2015 +++ src/sys/ufs/lfs/lfs_vnops.c Tue Sep 15 15:00:32 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_vnops.c,v 1.289 2015/09/01 06:16:59 dholland Exp $ */ +/* $NetBSD: lfs_vnops.c,v 1.290 2015/09/15 15:00:32 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. @@ -125,7 +125,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.289 2015/09/01 06:16:59 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.290 2015/09/15 15:00:32 dholland Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" @@ -858,7 +858,6 @@ lfs_mkdir(void *v) struct ulfs_lookup_results *ulr; struct buf *bp; struct lfs_dirtemplate dirtemplate; - struct lfs_direct *newdir; int dirblksiz; int error; @@ -963,10 +962,8 @@ lfs_mkdir(void *v) if ((error = lfs_update(tvp, NULL, NULL, UPDATE_DIROP)) != 0) { goto bad; } - newdir = pool_cache_get(ulfs_direct_cache, PR_WAITOK); - ulfs_makedirentry(ip, cnp, newdir); - error = ulfs_direnter(dvp, ulr, tvp, newdir, cnp, bp); - pool_cache_put(ulfs_direct_cache, newdir); + error = ulfs_direnter(dvp, ulr, tvp, + cnp, ip->i_number, LFS_IFTODT(ip->i_mode), bp); bad: if (error == 0) { VN_KNOTE(dvp, NOTE_WRITE | NOTE_LINK); Index: src/sys/ufs/lfs/ulfs_extern.h diff -u src/sys/ufs/lfs/ulfs_extern.h:1.16 src/sys/ufs/lfs/ulfs_extern.h:1.17 --- src/sys/ufs/lfs/ulfs_extern.h:1.16 Tue Sep 1 06:16:59 2015 +++ src/sys/ufs/lfs/ulfs_extern.h Tue Sep 15 15:00:32 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: ulfs_extern.h,v 1.16 2015/09/01 06:16:59 dholland Exp $ */ +/* $NetBSD: ulfs_extern.h,v 1.17 2015/09/15 15:00:32 dholland Exp $ */ /* from NetBSD: ufs_extern.h,v 1.72 2012/05/09 00:21:18 riastradh Exp */ /*- @@ -112,13 +112,10 @@ int ulfs_balloc_range(struct vnode *, of /* ulfs_lookup.c */ void ulfs_dirbad(struct inode *, doff_t, const char *); int ulfs_dirbadentry(struct vnode *, struct lfs_direct *, int); -void ulfs_makedirentry(struct inode *, struct componentname *, - struct lfs_direct *); -void ulfs_makedirentry_bytype(struct lfs *, struct componentname *, - ino_t, unsigned /*dtype*/, struct lfs_direct *); int ulfs_direnter(struct vnode *, const struct ulfs_lookup_results *, - struct vnode *, struct lfs_direct *, - struct componentname *, struct buf *); + struct vnode *, + struct componentname *, ino_t, unsigned, + struct buf *); int ulfs_dirremove(struct vnode *, const struct ulfs_lookup_results *, struct inode *, int, int); int ulfs_dirrewrite(struct inode *, off_t, Index: src/sys/ufs/lfs/ulfs_lookup.c diff -u src/sys/ufs/lfs/ulfs_lookup.c:1.27 src/sys/ufs/lfs/ulfs_lookup.c:1.28 --- src/sys/ufs/lfs/ulfs_lookup.c:1.27 Tue Sep 15 14:58:06 2015 +++ src/sys/ufs/lfs/ulfs_lookup.c Tue Sep 15 15:00:32 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: ulfs_lookup.c,v 1.27 2015/09/15 14:58:06 dholland Exp $ */ +/* $NetBSD: ulfs_lookup.c,v 1.28 2015/09/15 15:00:32 dholland Exp $ */ /* from NetBSD: ufs_lookup.c,v 1.122 2013/01/22 09:39:18 dholland Exp */ /* @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ulfs_lookup.c,v 1.27 2015/09/15 14:58:06 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ulfs_lookup.c,v 1.28 2015/09/15 15:00:32 dholland Exp $"); #ifdef _KERNEL_OPT #include "opt_lfs.h" @@ -697,29 +697,18 @@ bad: /* * Construct a new directory entry after a call to namei, using the - * name in the componentname argument cnp. The argument ip is the - * inode to which the new directory entry will refer. + * name in the componentname argument cnp. The new directory entry + * will refer to inode INUM which has type (directory-level type) + * DTYPE. If adding a reference to an already-created or + * already-extant inode, these values are retrieved with: + * ip->i_number + * LFS_IFTODT(ip->i_mode) + * (The latter should be tidier. XXX) * * Does not set d_reclen. */ -void -ulfs_makedirentry(struct inode *ip, struct componentname *cnp, - struct lfs_direct *newdirp) -{ - struct lfs *fs = ip->i_lfs; - - lfs_dir_setino(fs, newdirp, ip->i_number); - memcpy(newdirp->d_name, cnp->cn_nameptr, (size_t)cnp->cn_namelen); - newdirp->d_name[cnp->cn_namelen] = '\0'; - lfs_dir_setnamlen(fs, newdirp, cnp->cn_namelen); - lfs_dir_settype(fs, newdirp, LFS_IFTODT(ip->i_mode)); -} - -/* - * Similar but for special inodes. - */ -void -ulfs_makedirentry_bytype(struct lfs *fs, struct componentname *cnp, +static void +ulfs_makedirentry_tmp(struct lfs *fs, struct componentname *cnp, ino_t inum, unsigned dtype, struct lfs_direct *newdirp) { lfs_dir_setino(fs, newdirp, inum); @@ -736,20 +725,15 @@ ulfs_makedirentry_bytype(struct lfs *fs, * DVP is the directory to be updated. It must be locked. * ULR is the ulfs_lookup_results structure from the final lookup step. * TVP is not used. (XXX: why is it here? remove it) - * DIRP is the new directory entry contents. * CNP is the componentname from the final lookup step. + * INUM is the inode number to insert into the new directory entry. + * DTYPE is the type code (LFS_DT_*) to insert into the new directory entry. * NEWDIRBP is not used and (XXX) should be removed. The previous * comment here said it was used by the now-removed softupdates code. * * The link count of the target inode is *not* incremented; the * caller does that. * - * DIRP should have been filled in by ulfs_makedirentry(). Manual - * initialization should be avoided, but if needed should be - * equivalent to ulfs_makedirentry in byteswapping, use of accessor - * functions, etc.; otherwise we might byteswap too many times or not - * enough. - * * If ulr->ulr_count is 0, ulfs_lookup did not find space to insert the * directory entry. ulr_offset, which is the place to put the entry, * should be on a block boundary (and should be at the end of the @@ -766,8 +750,9 @@ ulfs_makedirentry_bytype(struct lfs *fs, */ int ulfs_direnter(struct vnode *dvp, const struct ulfs_lookup_results *ulr, - struct vnode *tvp, struct lfs_direct *dirp, - struct componentname *cnp, struct buf *newdirbp) + struct vnode *tvp, + struct componentname *cnp, ino_t inum, unsigned dtype, + struct buf *newdirbp) { kauth_cred_t cr; int newentrysize; @@ -781,6 +766,10 @@ ulfs_direnter(struct vnode *dvp, const s struct ulfsmount *ump = VFSTOULFS(dvp->v_mount); struct lfs *fs = ump->um_lfs; int dirblksiz = fs->um_dirblksiz; + struct lfs_direct *dirp; + + dirp = pool_cache_get(ulfs_direct_cache, PR_WAITOK); + ulfs_makedirentry_tmp(fs, cnp, inum, dtype, dirp); error = 0; cr = cnp->cn_cred; @@ -799,6 +788,7 @@ ulfs_direnter(struct vnode *dvp, const s panic("ulfs_direnter: newblk"); if ((error = lfs_balloc(dvp, (off_t)ulr->ulr_offset, dirblksiz, cr, B_CLRBUF | B_SYNC, &bp)) != 0) { + pool_cache_put(ulfs_direct_cache, dirp); return (error); } dp->i_size = ulr->ulr_offset + dirblksiz; @@ -818,6 +808,7 @@ ulfs_direnter(struct vnode *dvp, const s error = VOP_BWRITE(bp->b_vp, bp); vfs_timestamp(&ts); ret = lfs_update(dvp, &ts, &ts, UPDATE_DIROP); + pool_cache_put(ulfs_direct_cache, dirp); if (error == 0) return (ret); return (error); @@ -853,6 +844,7 @@ ulfs_direnter(struct vnode *dvp, const s */ error = ulfs_blkatoff(dvp, (off_t)ulr->ulr_offset, &dirbuf, &bp, true); if (error) { + pool_cache_put(ulfs_direct_cache, dirp); return (error); } /* @@ -950,6 +942,7 @@ ulfs_direnter(struct vnode *dvp, const s #endif (void) lfs_truncate(dvp, (off_t)ulr->ulr_endoff, IO_SYNC, cr); } + pool_cache_put(ulfs_direct_cache, dirp); return (error); } Index: src/sys/ufs/lfs/ulfs_vnops.c diff -u src/sys/ufs/lfs/ulfs_vnops.c:1.29 src/sys/ufs/lfs/ulfs_vnops.c:1.30 --- src/sys/ufs/lfs/ulfs_vnops.c:1.29 Tue Sep 15 14:58:06 2015 +++ src/sys/ufs/lfs/ulfs_vnops.c Tue Sep 15 15:00:32 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: ulfs_vnops.c,v 1.29 2015/09/15 14:58:06 dholland Exp $ */ +/* $NetBSD: ulfs_vnops.c,v 1.30 2015/09/15 15:00:32 dholland Exp $ */ /* from NetBSD: ufs_vnops.c,v 1.213 2013/06/08 05:47:02 kardel Exp */ /*- @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ulfs_vnops.c,v 1.29 2015/09/15 14:58:06 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ulfs_vnops.c,v 1.30 2015/09/15 15:00:32 dholland Exp $"); #if defined(_KERNEL_OPT) #include "opt_lfs.h" @@ -554,7 +554,6 @@ ulfs_link(void *v) struct componentname *cnp = ap->a_cnp; struct mount *mp = dvp->v_mount; struct inode *ip; - struct lfs_direct *newdir; int error; struct ulfs_lookup_results *ulr; @@ -588,10 +587,8 @@ ulfs_link(void *v) ip->i_flag |= IN_CHANGE; error = lfs_update(vp, NULL, NULL, UPDATE_DIROP); if (!error) { - newdir = pool_cache_get(ulfs_direct_cache, PR_WAITOK); - ulfs_makedirentry(ip, cnp, newdir); - error = ulfs_direnter(dvp, ulr, vp, newdir, cnp, NULL); - pool_cache_put(ulfs_direct_cache, newdir); + error = ulfs_direnter(dvp, ulr, vp, + cnp, ip->i_number, LFS_IFTODT(ip->i_mode), NULL); } if (error) { ip->i_nlink--; @@ -620,7 +617,6 @@ ulfs_whiteout(void *v) } */ *ap = v; struct vnode *dvp = ap->a_dvp; struct componentname *cnp = ap->a_cnp; - struct lfs_direct *newdir; int error; struct ulfsmount *ump = VFSTOULFS(dvp->v_mount); struct lfs *fs = ump->um_lfs; @@ -646,11 +642,8 @@ ulfs_whiteout(void *v) panic("ulfs_whiteout: old format filesystem"); #endif - newdir = pool_cache_get(ulfs_direct_cache, PR_WAITOK); - ulfs_makedirentry_bytype(fs, cnp, ULFS_WINO, LFS_DT_WHT, - newdir); - error = ulfs_direnter(dvp, ulr, NULL, newdir, cnp, NULL); - pool_cache_put(ulfs_direct_cache, newdir); + error = ulfs_direnter(dvp, ulr, NULL, + cnp, ULFS_WINO, LFS_DT_WHT, NULL); break; case DELETE: @@ -1167,7 +1160,6 @@ ulfs_makeinode(struct vattr *vap, struct struct vnode **vpp, struct componentname *cnp) { struct inode *ip; - struct lfs_direct *newdir; struct vnode *tvp; int error; @@ -1207,10 +1199,8 @@ ulfs_makeinode(struct vattr *vap, struct */ if ((error = lfs_update(tvp, NULL, NULL, UPDATE_DIROP)) != 0) goto bad; - newdir = pool_cache_get(ulfs_direct_cache, PR_WAITOK); - ulfs_makedirentry(ip, cnp, newdir); - error = ulfs_direnter(dvp, ulr, tvp, newdir, cnp, NULL); - pool_cache_put(ulfs_direct_cache, newdir); + error = ulfs_direnter(dvp, ulr, tvp, + cnp, ip->i_number, LFS_IFTODT(ip->i_mode), NULL); if (error) goto bad; *vpp = tvp;