Module Name:    src
Committed By:   dholland
Date:           Sat Jul 20 22:14:49 UTC 2013

Modified Files:
        src/sys/ufs/lfs: lfs_vnops.c

Log Message:
Merge ulfs_mknod into lfs_mknod, which was missing some bits.


To generate a diff of this commit:
cvs rdiff -u -r1.249 -r1.250 src/sys/ufs/lfs/lfs_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_vnops.c
diff -u src/sys/ufs/lfs/lfs_vnops.c:1.249 src/sys/ufs/lfs/lfs_vnops.c:1.250
--- src/sys/ufs/lfs/lfs_vnops.c:1.249	Sat Jul 20 19:59:31 2013
+++ src/sys/ufs/lfs/lfs_vnops.c	Sat Jul 20 22:14:49 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_vnops.c,v 1.249 2013/07/20 19:59:31 dholland Exp $	*/
+/*	$NetBSD: lfs_vnops.c,v 1.250 2013/07/20 22:14:49 dholland Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.249 2013/07/20 19:59:31 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.250 2013/07/20 22:14:49 dholland Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -554,14 +554,17 @@ lfs_mknod(void *v)
 		struct componentname *a_cnp;
 		struct vattr *a_vap;
 	} */ *ap = v;
-	struct vattr *vap = ap->a_vap;
-	struct vnode **vpp = ap->a_vpp;
+	struct vattr *vap;
+	struct vnode **vpp;
 	struct inode *ip;
 	int error;
 	struct mount	*mp;
 	ino_t		ino;
 	struct ulfs_lookup_results *ulr;
 
+	vap = ap->a_vap;
+	vpp = ap->a_vpp;
+
 	/* XXX should handle this material another way */
 	ulr = &VTOI(ap->a_dvp)->i_crap;
 	ULFS_CHECK_CRAPCOUNTER(VTOI(ap->a_dvp));
@@ -570,30 +573,37 @@ lfs_mknod(void *v)
 		vput(ap->a_dvp);
 		return error;
 	}
+
+	fstrans_start(ap->a_dvp->v_mount, FSTRANS_SHARED);
 	error = ulfs_makeinode(MAKEIMODE(vap->va_type, vap->va_mode),
 			      ap->a_dvp, ulr, vpp, ap->a_cnp);
 
 	/* Either way we're done with the dirop at this point */
 	SET_ENDOP_CREATE_AP(ap, "mknod");
 
-	if (error)
+	if (error) {
+		fstrans_done(ap->a_dvp->v_mount);
+		*vpp = NULL;
 		return (error);
+	}
 
+	VN_KNOTE(ap->a_dvp, NOTE_WRITE);
 	ip = VTOI(*vpp);
 	mp  = (*vpp)->v_mount;
 	ino = ip->i_number;
 	ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE;
 	if (vap->va_rdev != VNOVAL) {
+		struct ulfsmount *ump = ip->i_ump;
 		/*
 		 * Want to be able to use this to make badblock
 		 * inodes, so don't truncate the dev number.
 		 */
-#if 0
-		ip->i_ffs1_rdev = ulfs_rw32(vap->va_rdev,
-					   ULFS_MPNEEDSWAP((*vpp)->v_mount));
-#else
-		ip->i_ffs1_rdev = vap->va_rdev;
-#endif
+		if (ump->um_fstype == ULFS1)
+			ip->i_ffs1_rdev = ulfs_rw32(vap->va_rdev,
+			    ULFS_MPNEEDSWAP(ump));
+		else
+			ip->i_ffs2_rdev = ulfs_rw64(vap->va_rdev,
+			    ULFS_MPNEEDSWAP(ump));
 	}
 
 	/*
@@ -616,11 +626,12 @@ lfs_mknod(void *v)
 	 */
 	/* Used to be vput, but that causes us to call VOP_INACTIVE twice. */
 
-	VOP_UNLOCK(*vpp);
 	(*vpp)->v_type = VNON;
+	VOP_UNLOCK(*vpp);
 	vgone(*vpp);
 	error = VFS_VGET(mp, ino, vpp);
 
+	fstrans_done(ap->a_dvp->v_mount);
 	if (error != 0) {
 		*vpp = NULL;
 		return (error);

Reply via email to