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;

Reply via email to