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;