Module Name:    src
Committed By:   hannken
Date:           Sun May 28 16:38:55 UTC 2017

Modified Files:
        src/sys/ufs/ext2fs: ext2fs_alloc.c ext2fs_extern.h ext2fs_vfsops.c
            ext2fs_vnops.c

Log Message:
Change ext2fs to use vcache_new like we did for ffs:
- Change ext2fs_valloc to return an inode number.
- Make ext2fs_makeinode private to ext2fs_vnops.c and
  pass vattr instead of mode.


To generate a diff of this commit:
cvs rdiff -u -r1.51 -r1.52 src/sys/ufs/ext2fs/ext2fs_alloc.c
cvs rdiff -u -r1.55 -r1.56 src/sys/ufs/ext2fs/ext2fs_extern.h
cvs rdiff -u -r1.208 -r1.209 src/sys/ufs/ext2fs/ext2fs_vfsops.c
cvs rdiff -u -r1.127 -r1.128 src/sys/ufs/ext2fs/ext2fs_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/ext2fs/ext2fs_alloc.c
diff -u src/sys/ufs/ext2fs/ext2fs_alloc.c:1.51 src/sys/ufs/ext2fs/ext2fs_alloc.c:1.52
--- src/sys/ufs/ext2fs/ext2fs_alloc.c:1.51	Sat Aug 20 19:53:43 2016
+++ src/sys/ufs/ext2fs/ext2fs_alloc.c	Sun May 28 16:38:55 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ext2fs_alloc.c,v 1.51 2016/08/20 19:53:43 jdolecek Exp $	*/
+/*	$NetBSD: ext2fs_alloc.c,v 1.52 2017/05/28 16:38:55 hannken Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_alloc.c,v 1.51 2016/08/20 19:53:43 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_alloc.c,v 1.52 2017/05/28 16:38:55 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -167,16 +167,13 @@ nospace:
  *	  available inode is located.
  */
 int
-ext2fs_valloc(struct vnode *pvp, int mode, kauth_cred_t cred,
-    struct vnode **vpp)
+ext2fs_valloc(struct vnode *pvp, int mode, kauth_cred_t cred, ino_t *inop)
 {
 	struct inode *pip;
 	struct m_ext2fs *fs;
-	struct inode *ip;
 	ino_t ino, ipref;
-	int cg, error;
+	int cg;
 
-	*vpp = NULL;
 	pip = VTOI(pvp);
 	fs = pip->i_e2fs;
 	if (fs->e2fs.e2fs_ficount == 0)
@@ -190,32 +187,10 @@ ext2fs_valloc(struct vnode *pvp, int mod
 	ino = (ino_t)ext2fs_hashalloc(pip, cg, (long)ipref, mode, ext2fs_nodealloccg);
 	if (ino == 0)
 		goto noinodes;
-	error = VFS_VGET(pvp->v_mount, ino, vpp);
-	if (error) {
-		ext2fs_vfree(pvp, ino, mode);
-		return error;
-	}
-	ip = VTOI(*vpp);
-
-	KASSERT(!E2FS_HAS_GD_CSUM(fs) || (fs->e2fs_gd[ino_to_cg(fs, ino)].ext2bgd_flags & h2fs16(E2FS_BG_INODE_ZEROED)) != 0);
-
-	/* check for already used inode; makes sense only for ZEROED itable */
-	if (__predict_false(ip->i_e2fs_mode && ip->i_e2fs_nlink != 0)) {
-		printf("mode = 0%o, nlinks %d, inum = %llu, fs = %s\n",
-		    ip->i_e2fs_mode, ip->i_e2fs_nlink,
-		    (unsigned long long)ip->i_number, fs->e2fs_fsmnt);
-		panic("ext2fs_valloc: dup alloc");
-	}
-
-	memset(ip->i_din.e2fs_din, 0, EXT2_DINODE_SIZE(fs));
 
-	/*
-	 * Set up a new generation number for this inode.
-	 */
-	if (++ext2gennumber < time_second)
-		ext2gennumber = time_second;
-	ip->i_e2fs_gen = ext2gennumber;
+	*inop = ino;
 	return 0;
+
 noinodes:
 	ext2fs_fserr(fs, kauth_cred_geteuid(cred), "out of inodes");
 	uprintf("\n%s: create/symlink failed, no inodes free\n", fs->e2fs_fsmnt);

Index: src/sys/ufs/ext2fs/ext2fs_extern.h
diff -u src/sys/ufs/ext2fs/ext2fs_extern.h:1.55 src/sys/ufs/ext2fs/ext2fs_extern.h:1.56
--- src/sys/ufs/ext2fs/ext2fs_extern.h:1.55	Sat Aug 20 19:47:44 2016
+++ src/sys/ufs/ext2fs/ext2fs_extern.h	Sun May 28 16:38:55 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ext2fs_extern.h,v 1.55 2016/08/20 19:47:44 jdolecek Exp $	*/
+/*	$NetBSD: ext2fs_extern.h,v 1.56 2017/05/28 16:38:55 hannken Exp $	*/
 
 /*-
  * Copyright (c) 1991, 1993, 1994
@@ -95,7 +95,7 @@ int ext2fs_alloc(struct inode *, daddr_t
 		   daddr_t *);
 int ext2fs_realloccg(struct inode *, daddr_t, daddr_t, int, int ,
 			  kauth_cred_t, struct buf **);
-int ext2fs_valloc(struct vnode *, int, kauth_cred_t, struct vnode **);
+int ext2fs_valloc(struct vnode *, int, kauth_cred_t, ino_t *);
 /* XXX ondisk32 */
 daddr_t ext2fs_blkpref(struct inode *, daddr_t, int, int32_t *);
 void ext2fs_blkfree(struct inode *, daddr_t);
@@ -176,8 +176,6 @@ int ext2fs_advlock(void *);
 int ext2fs_fsync(void *);
 int ext2fs_vinit(struct mount *, int (**specops)(void *),
 		      int (**fifoops)(void *), struct vnode **);
-int ext2fs_makeinode(int, struct vnode *, struct vnode **,
-			  struct componentname *cnp, int);
 int ext2fs_reclaim(void *);
 
 /* ext2fs_hash.c */

Index: src/sys/ufs/ext2fs/ext2fs_vfsops.c
diff -u src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.208 src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.209
--- src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.208	Mon Apr 17 08:32:01 2017
+++ src/sys/ufs/ext2fs/ext2fs_vfsops.c	Sun May 28 16:38:55 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ext2fs_vfsops.c,v 1.208 2017/04/17 08:32:01 hannken Exp $	*/
+/*	$NetBSD: ext2fs_vfsops.c,v 1.209 2017/05/28 16:38:55 hannken Exp $	*/
 
 /*
  * Copyright (c) 1989, 1991, 1993, 1994
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_vfsops.c,v 1.208 2017/04/17 08:32:01 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_vfsops.c,v 1.209 2017/05/28 16:38:55 hannken Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -131,6 +131,7 @@ struct vfsops ext2fs_vfsops = {
 	.vfs_sync = ext2fs_sync,
 	.vfs_vget = ufs_vget,
 	.vfs_loadvnode = ext2fs_loadvnode,
+	.vfs_newvnode = ext2fs_newvnode,
 	.vfs_fhtovp = ext2fs_fhtovp,
 	.vfs_vptofh = ext2fs_vptofh,
 	.vfs_init = ext2fs_init,
@@ -966,25 +967,16 @@ ext2fs_sync(struct mount *mp, int waitfo
 }
 
 /*
- * Read an inode from disk and initialize this vnode / inode pair.
- * Caller assures no other thread will try to load this inode.
+ * Load inode from disk and initialize vnode.
  */
-int
-ext2fs_loadvnode(struct mount *mp, struct vnode *vp,
-    const void *key, size_t key_len, const void **new_key)
+static int
+ext2fs_init_vnode(struct ufsmount *ump, struct vnode *vp, ino_t ino)
 {
-	ino_t ino;
 	struct m_ext2fs *fs;
 	struct inode *ip;
-	struct ufsmount *ump;
 	struct buf *bp;
-	dev_t dev;
 	int error;
 
-	KASSERT(key_len == sizeof(ino));
-	memcpy(&ino, key, key_len);
-	ump = VFSTOUFS(mp);
-	dev = ump->um_dev;
 	fs = ump->um_e2fs;
 
 	/* Read in the disk contents for the inode, copy into the inode. */
@@ -996,25 +988,20 @@ ext2fs_loadvnode(struct mount *mp, struc
 	/* Allocate and initialize inode. */
 	ip = pool_get(&ext2fs_inode_pool, PR_WAITOK);
 	memset(ip, 0, sizeof(struct inode));
-	vp->v_tag = VT_EXT2FS;
-	vp->v_op = ext2fs_vnodeop_p;
-	vp->v_vflag |= VV_LOCKSWORK;
-	vp->v_data = ip;
 	ip->i_vnode = vp;
 	ip->i_ump = ump;
 	ip->i_e2fs = fs;
-	ip->i_dev = dev;
+	ip->i_dev = ump->um_dev;
 	ip->i_number = ino;
 	ip->i_e2fs_last_lblk = 0;
 	ip->i_e2fs_last_blk = 0;
 
-	/* Initialize genfs node. */
-	genfs_node_init(vp, &ext2fs_genfsops);
-
 	error = ext2fs_loadvnode_content(fs, ino, bp, ip);
 	brelse(bp, 0);
-	if (error)
+	if (error) {
+		pool_put(&ext2fs_inode_pool, ip);
 		return error;
+	}
 
 	/* If the inode was deleted, reset all fields */
 	if (ip->i_e2fs_dtime != 0) {
@@ -1024,6 +1011,41 @@ ext2fs_loadvnode(struct mount *mp, struc
 		memset(ip->i_e2fs_blocks, 0, sizeof(ip->i_e2fs_blocks));
 	}
 
+	/* Initialise vnode with this inode. */
+	vp->v_tag = VT_EXT2FS;
+	vp->v_op = ext2fs_vnodeop_p;
+	vp->v_vflag |= VV_LOCKSWORK;
+	vp->v_data = ip;
+
+	/* Initialize genfs node. */
+	genfs_node_init(vp, &ext2fs_genfsops);
+
+	return 0;
+}
+
+/*
+ * Read an inode from disk and initialize this vnode / inode pair.
+ * Caller assures no other thread will try to load this inode.
+ */
+int
+ext2fs_loadvnode(struct mount *mp, struct vnode *vp,
+    const void *key, size_t key_len, const void **new_key)
+{
+	ino_t ino;
+	struct inode *ip;
+	struct ufsmount *ump;
+	int error;
+
+	KASSERT(key_len == sizeof(ino));
+	memcpy(&ino, key, key_len);
+	ump = VFSTOUFS(mp);
+
+	error = ext2fs_init_vnode(ump, vp, ino);
+	if (error)
+		return error;
+
+	ip = VTOI(vp);
+
 	/* Initialize the vnode from the inode. */
 	ext2fs_vinit(mp, ext2fs_specop_p, ext2fs_fifoop_p, &vp);
 
@@ -1049,6 +1071,113 @@ ext2fs_loadvnode(struct mount *mp, struc
 }
 
 /*
+ * Create a new inode on disk and initialize this vnode / inode pair.
+ */
+int
+ext2fs_newvnode(struct mount *mp, struct vnode *dvp, struct vnode *vp,
+    struct vattr *vap, kauth_cred_t cred,
+    size_t *key_len, const void **new_key)
+{
+	ino_t ino;
+	struct inode *ip, *pdir;
+	struct m_ext2fs *fs;
+	struct ufsmount *ump;
+	int error, mode;
+
+	KASSERT(dvp->v_mount == mp);
+	KASSERT(vap->va_type != VNON);
+
+	*key_len = sizeof(ino);
+
+	pdir = VTOI(dvp);
+	fs = pdir->i_e2fs;
+	ump = VFSTOUFS(mp);
+	mode = MAKEIMODE(vap->va_type, vap->va_mode);
+
+	/* Allocate fresh inode. */
+	error = ext2fs_valloc(dvp, mode, cred, &ino);
+	if (error)
+		return error;
+
+	/* Attach inode to vnode. */
+	error = ext2fs_init_vnode(ump, vp, ino);
+	if (error) {
+		ext2fs_vfree(dvp, ino, mode);
+		return error;
+	}
+
+	ip = VTOI(vp);
+
+	KASSERT(!E2FS_HAS_GD_CSUM(fs) || (fs->e2fs_gd[ino_to_cg(fs, ino)].ext2bgd_flags & h2fs16(E2FS_BG_INODE_ZEROED)) != 0);
+
+	/* check for already used inode; makes sense only for ZEROED itable */
+	if (__predict_false(ip->i_e2fs_mode && ip->i_e2fs_nlink != 0)) {
+		printf("mode = 0%o, nlinks %d, inum = %llu, fs = %s\n",
+		    ip->i_e2fs_mode, ip->i_e2fs_nlink,
+		    (unsigned long long)ip->i_number, fs->e2fs_fsmnt);
+		panic("ext2fs_valloc: dup alloc");
+	}
+
+	memset(ip->i_din.e2fs_din, 0, EXT2_DINODE_SIZE(fs));
+
+	/*
+	 * Set up a new generation number for this inode.
+	 */
+	if (++ext2gennumber < time_second)
+		ext2gennumber = time_second;
+	ip->i_e2fs_gen = ext2gennumber;
+
+	ip->i_uid = kauth_cred_geteuid(cred);
+	ip->i_e2fs_uid = ip->i_uid & 0xffff;
+	ip->i_e2fs_gid = pdir->i_e2fs_gid;
+	if (ip->i_e2fs->e2fs.e2fs_rev > E2FS_REV0) {
+		ip->i_e2fs_uid_high = (ip->i_uid >> 16) & 0xffff;
+		ip->i_e2fs_gid_high = pdir->i_e2fs_gid_high;
+	} else {
+		ip->i_e2fs_uid_high = 0;
+		ip->i_e2fs_gid_high = 0;
+	}
+	ip->i_gid = ip->i_e2fs_gid | (ip->i_e2fs_gid_high << 16);
+	ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE;
+	ip->i_e2fs_mode = mode;
+	vp->v_type = IFTOVT(mode);
+	ip->i_e2fs_nlink = 1;
+
+	/* Authorize setting SGID if needed. */
+	if (ip->i_e2fs_mode & ISGID) {
+		error = kauth_authorize_vnode(cred, KAUTH_VNODE_WRITE_SECURITY,
+		    vp, NULL, genfs_can_chmod(vp->v_type, cred, ip->i_uid,
+		    ip->i_gid, mode));
+		if (error)
+			ip->i_e2fs_mode &= ~ISGID;
+	}
+
+	/* Initialize extra_isize according to what is set in superblock */
+	if (EXT2F_HAS_ROCOMPAT_FEATURE(ip->i_e2fs, EXT2F_ROCOMPAT_EXTRA_ISIZE)
+	    && EXT2_DINODE_SIZE(ip->i_e2fs) > EXT2_REV0_DINODE_SIZE) {
+		ip->i_din.e2fs_din->e2di_extra_isize = ip->i_e2fs->e2fs.e4fs_want_extra_isize;
+	}
+
+	/* Set create time if possible */
+	if (EXT2_DINODE_FITS(ip->i_din.e2fs_din, e2di_crtime, EXT2_DINODE_SIZE(ip->i_e2fs))) {
+		struct timespec now;
+		vfs_timestamp(&now);
+		EXT2_DINODE_TIME_SET(&now, ip->i_din.e2fs_din, e2di_crtime, EXT2_DINODE_SIZE(ip->i_e2fs));
+	}
+
+	/* Initialize the vnode from the inode. */
+	ext2fs_vinit(mp, ext2fs_specop_p, ext2fs_fifoop_p, &vp);
+
+	/* Finish inode initialization. */
+	ip->i_devvp = ump->um_devvp;
+	vref(ip->i_devvp);
+
+	uvm_vnp_setsize(vp, ext2fs_size(ip));
+	*new_key = &ip->i_number;
+	return 0;
+}
+
+/*
  * File handle to vnode
  *
  * Have to be really careful about stale file handles:

Index: src/sys/ufs/ext2fs/ext2fs_vnops.c
diff -u src/sys/ufs/ext2fs/ext2fs_vnops.c:1.127 src/sys/ufs/ext2fs/ext2fs_vnops.c:1.128
--- src/sys/ufs/ext2fs/ext2fs_vnops.c:1.127	Fri May 26 14:21:02 2017
+++ src/sys/ufs/ext2fs/ext2fs_vnops.c	Sun May 28 16:38:55 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ext2fs_vnops.c,v 1.127 2017/05/26 14:21:02 riastradh Exp $	*/
+/*	$NetBSD: ext2fs_vnops.c,v 1.128 2017/05/28 16:38:55 hannken Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -65,7 +65,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_vnops.c,v 1.127 2017/05/26 14:21:02 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_vnops.c,v 1.128 2017/05/28 16:38:55 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -101,6 +101,8 @@ extern int prtactive;
 static int ext2fs_chmod(struct vnode *, int, kauth_cred_t, struct lwp *);
 static int ext2fs_chown(struct vnode *, uid_t, gid_t, kauth_cred_t,
 				struct lwp *);
+static int ext2fs_makeinode(struct vattr *, struct vnode *, struct vnode **,
+				struct componentname *, int);
 
 union _qcvt {
 	int64_t	qcvt;
@@ -134,9 +136,7 @@ ext2fs_create(void *v)
 	} */ *ap = v;
 	int	error;
 
-	error =
-	    ext2fs_makeinode(MAKEIMODE(ap->a_vap->va_type, ap->a_vap->va_mode),
-			     ap->a_dvp, ap->a_vpp, ap->a_cnp, 1);
+	error = ext2fs_makeinode(ap->a_vap, ap->a_dvp, ap->a_vpp, ap->a_cnp, 1);
 
 	if (error)
 		return error;
@@ -162,37 +162,13 @@ ext2fs_mknod(void *v)
 	struct vnode **vpp = ap->a_vpp;
 	struct inode *ip;
 	int error;
-	struct mount	*mp;
-	ino_t		ino;
 
-	if ((error = ext2fs_makeinode(MAKEIMODE(vap->va_type, vap->va_mode),
-		    ap->a_dvp, vpp, ap->a_cnp, 1)) != 0)
+	if ((error = ext2fs_makeinode(vap, ap->a_dvp, vpp, ap->a_cnp, 1)) != 0)
 		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) {
-		/*
-		 * Want to be able to use this to make badblock
-		 * inodes, so don't truncate the dev number.
-		 */
-		ip->i_din.e2fs_din->e2di_rdev = h2fs32(vap->va_rdev);
-	}
-	/*
-	 * Remove inode so that it will be reloaded by vcache_get and
-	 * checked to see if it is an alias of an existing entry in
-	 * the inode cache.
-	 */
-	(*vpp)->v_type = VNON;
 	VOP_UNLOCK(*vpp);
-	vgone(*vpp);
-	error = vcache_get(mp, &ino, sizeof(ino), vpp);
-	if (error != 0) {
-		*vpp = NULL;
-		return error;
-	}
 	return 0;
 }
 
@@ -676,11 +652,12 @@ ext2fs_mkdir(void *v)
 	ulr = &VTOI(dvp)->i_crap;
 	UFS_CHECK_CRAPCOUNTER(VTOI(dvp));
 
+	KASSERT(ap->a_vap->va_type == VDIR);
+
 	/*
 	 * Acquire the inode, but don't sync/direnter it just yet
 	 */
-	error = ext2fs_makeinode(IFDIR | ap->a_vap->va_mode, ap->a_dvp,
-			      &tvp, ap->a_cnp, 0);
+	error = ext2fs_makeinode(ap->a_vap, ap->a_dvp, &tvp, ap->a_cnp, 0);
 	if (error)
 		goto out;
 
@@ -881,8 +858,8 @@ ext2fs_symlink(void *v)
 	int		len, error;
 
 	vpp = ap->a_vpp;
-	error = ext2fs_makeinode(IFLNK | ap->a_vap->va_mode, ap->a_dvp,
-			      vpp, ap->a_cnp, 1);
+	KASSERT(ap->a_vap->va_type == VLNK);
+	error = ext2fs_makeinode(ap->a_vap, ap->a_dvp, vpp, ap->a_cnp, 1);
 	if (error)
 		return error;
 	VN_KNOTE(ap->a_dvp, NOTE_WRITE);
@@ -1030,8 +1007,8 @@ ext2fs_vinit(struct mount *mntp, int (**
 /*
  * Allocate a new inode.
  */
-int
-ext2fs_makeinode(int mode, struct vnode *dvp, struct vnode **vpp,
+static int
+ext2fs_makeinode(struct vattr *vap, struct vnode *dvp, struct vnode **vpp,
 		struct componentname *cnp, int do_direnter)
 {
 	struct inode *ip, *pdir;
@@ -1046,51 +1023,16 @@ ext2fs_makeinode(int mode, struct vnode 
 	UFS_CHECK_CRAPCOUNTER(pdir);
 
 	*vpp = NULL;
-	if ((mode & IFMT) == 0)
-		mode |= IFREG;
 
-	if ((error = ext2fs_valloc(dvp, mode, cnp->cn_cred, &tvp)) != 0) {
+	error = vcache_new(dvp->v_mount, dvp, vap, cnp->cn_cred, &tvp);
+	if (error)
+		return error;
+	error = vn_lock(tvp, LK_EXCLUSIVE);
+	if (error) {
+		vrele(tvp);
 		return error;
 	}
 	ip = VTOI(tvp);
-	ip->i_uid = kauth_cred_geteuid(cnp->cn_cred);
-	ip->i_e2fs_uid = ip->i_uid & 0xffff;
-	ip->i_e2fs_gid = pdir->i_e2fs_gid;
-	if (ip->i_e2fs->e2fs.e2fs_rev > E2FS_REV0) {
-		ip->i_e2fs_uid_high = (ip->i_uid >> 16) & 0xffff;
-		ip->i_e2fs_gid_high = pdir->i_e2fs_gid_high;
-	} else {
-		ip->i_e2fs_uid_high = 0;
-		ip->i_e2fs_gid_high = 0;
-	}
-	ip->i_gid = ip->i_e2fs_gid | (ip->i_e2fs_gid_high << 16);
-	ip->i_flag |= IN_ACCESS | IN_CHANGE | IN_UPDATE;
-	ip->i_e2fs_mode = mode;
-	tvp->v_type = IFTOVT(mode);	/* Rest init'd in getnewvnode(). */
-	ip->i_e2fs_nlink = 1;
-
-	/* Authorize setting SGID if needed. */
-	if (ip->i_e2fs_mode & ISGID) {
-		error = kauth_authorize_vnode(cnp->cn_cred, KAUTH_VNODE_WRITE_SECURITY,
-		    tvp, NULL, genfs_can_chmod(tvp->v_type, cnp->cn_cred, ip->i_uid,
-		    ip->i_gid, mode));
-		if (error)
-			ip->i_e2fs_mode &= ~ISGID;
-	}
-
-	/* Initialize extra_isize according to what is set in superblock */
-	if (EXT2F_HAS_ROCOMPAT_FEATURE(ip->i_e2fs, EXT2F_ROCOMPAT_EXTRA_ISIZE)
-	    && EXT2_DINODE_SIZE(ip->i_e2fs) > EXT2_REV0_DINODE_SIZE) {
-		ip->i_din.e2fs_din->e2di_extra_isize = ip->i_e2fs->e2fs.e4fs_want_extra_isize;
-	}
-
-	/* Set create time if possible */
-	if (EXT2_DINODE_FITS(ip->i_din.e2fs_din, e2di_crtime, EXT2_DINODE_SIZE(ip->i_e2fs))) {
-		struct timespec now;
-		vfs_timestamp(&now);
-		EXT2_DINODE_TIME_SET(&now, ip->i_din.e2fs_din, e2di_crtime, EXT2_DINODE_SIZE(ip->i_e2fs));
-	}
-
 	if (do_direnter) {
 		/*
 		 * Make sure inode goes to disk before directory entry.
@@ -1110,7 +1052,6 @@ bad:
 	 * Write error occurred trying to update the inode
 	 * or the directory so must deallocate the inode.
 	 */
-	tvp->v_type = VNON;	/* Stop explosion if VBLK */
 	ip->i_e2fs_nlink = 0;
 	ip->i_flag |= IN_CHANGE;
 	vput(tvp);

Reply via email to