Module Name:    src
Committed By:   hannken
Date:           Wed Jul 28 11:03:48 UTC 2010

Modified Files:
        src/sys/kern: vfs_subr.c
        src/sys/sys: param.h vnode.h
        src/sys/ufs/ext2fs: ext2fs_inode.c ext2fs_vnops.c
        src/sys/ufs/ffs: ffs_vnops.c
        src/sys/ufs/ufs: inode.h ufs_inode.c

Log Message:
ext2fs,ffs: free on disk inodes in the reclaim routine.
Remove now unneeded vnode flag VI_FREEING.

Welcome to 5.99.38.

Ok: Andrew Doran <a...@netbsd.org>


To generate a diff of this commit:
cvs rdiff -u -r1.412 -r1.413 src/sys/kern/vfs_subr.c
cvs rdiff -u -r1.372 -r1.373 src/sys/sys/param.h
cvs rdiff -u -r1.222 -r1.223 src/sys/sys/vnode.h
cvs rdiff -u -r1.72 -r1.73 src/sys/ufs/ext2fs/ext2fs_inode.c
cvs rdiff -u -r1.93 -r1.94 src/sys/ufs/ext2fs/ext2fs_vnops.c
cvs rdiff -u -r1.114 -r1.115 src/sys/ufs/ffs/ffs_vnops.c
cvs rdiff -u -r1.56 -r1.57 src/sys/ufs/ufs/inode.h
cvs rdiff -u -r1.81 -r1.82 src/sys/ufs/ufs/ufs_inode.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/kern/vfs_subr.c
diff -u src/sys/kern/vfs_subr.c:1.412 src/sys/kern/vfs_subr.c:1.413
--- src/sys/kern/vfs_subr.c:1.412	Mon Jul 26 15:22:16 2010
+++ src/sys/kern/vfs_subr.c	Wed Jul 28 11:03:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_subr.c,v 1.412 2010/07/26 15:22:16 hannken Exp $	*/
+/*	$NetBSD: vfs_subr.c,v 1.413 2010/07/28 11:03:47 hannken Exp $	*/
 
 /*-
  * Copyright (c) 1997, 1998, 2004, 2005, 2007, 2008 The NetBSD Foundation, Inc.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.412 2010/07/26 15:22:16 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.413 2010/07/28 11:03:47 hannken Exp $");
 
 #include "opt_ddb.h"
 #include "opt_compat_netbsd.h"
@@ -1252,7 +1252,7 @@
 	 * for vclean() by adding another reference without waiting.
 	 * This is not strictly necessary, but we'll do it anyway.
 	 */
-	if (__predict_false((vp->v_iflag & (VI_XLOCK | VI_FREEING)) != 0)) {
+	if (__predict_false((vp->v_iflag & VI_XLOCK) != 0)) {
 		return false;
 	}
 	for (use = vp->v_usecount;; use = next) {
@@ -1300,14 +1300,14 @@
 	 * If the vnode is in the process of being cleaned out for
 	 * another use, we wait for the cleaning to finish and then
 	 * return failure.  Cleaning is determined by checking if
-	 * the VI_XLOCK or VI_FREEING flags are set.
+	 * the VI_XLOCK flag is set.
 	 */
-	if ((vp->v_iflag & (VI_XLOCK | VI_FREEING)) != 0) {
+	if ((vp->v_iflag & VI_XLOCK) != 0) {
 		if ((flags & LK_NOWAIT) != 0) {
 			vrelel(vp, 0);
 			return EBUSY;
 		}
-		vwait(vp, VI_XLOCK | VI_FREEING);
+		vwait(vp, VI_XLOCK);
 		vrelel(vp, 0);
 		return ENOENT;
 	}
@@ -1944,7 +1944,7 @@
 	vp->v_op = dead_vnodeop_p;
 	vp->v_tag = VT_NON;
 	KNOTE(&vp->v_klist, NOTE_REVOKE);
-	vp->v_iflag &= ~(VI_XLOCK | VI_FREEING);
+	vp->v_iflag &= ~VI_XLOCK;
 	vp->v_vflag &= ~VV_LOCKSWORK;
 	if ((flags & DOCLOSE) != 0) {
 		vp->v_iflag |= VI_CLEAN;

Index: src/sys/sys/param.h
diff -u src/sys/sys/param.h:1.372 src/sys/sys/param.h:1.373
--- src/sys/sys/param.h:1.372	Wed Jul 21 09:06:37 2010
+++ src/sys/sys/param.h	Wed Jul 28 11:03:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: param.h,v 1.372 2010/07/21 09:06:37 hannken Exp $	*/
+/*	$NetBSD: param.h,v 1.373 2010/07/28 11:03:47 hannken Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -63,7 +63,7 @@
  *	2.99.9		(299000900)
  */
 
-#define	__NetBSD_Version__	599003700	/* NetBSD 5.99.37 */
+#define	__NetBSD_Version__	599003800	/* NetBSD 5.99.38 */
 
 #define __NetBSD_Prereq__(M,m,p) (((((M) * 100000000) + \
     (m) * 1000000) + (p) * 100) <= __NetBSD_Version__)

Index: src/sys/sys/vnode.h
diff -u src/sys/sys/vnode.h:1.222 src/sys/sys/vnode.h:1.223
--- src/sys/sys/vnode.h:1.222	Wed Jul 28 09:31:00 2010
+++ src/sys/sys/vnode.h	Wed Jul 28 11:03:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: vnode.h,v 1.222 2010/07/28 09:31:00 hannken Exp $	*/
+/*	$NetBSD: vnode.h,v 1.223 2010/07/28 11:03:47 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -211,7 +211,6 @@
 #define	VI_CLEAN	0x00080000	/* has been reclaimed */
 #define	VI_INACTPEND	0x00100000	/* inactivation is pending */
 #define	VI_INACTREDO	0x00200000	/* need to redo VOP_INACTIVE() */
-#define	VI_FREEING	0x00400000	/* vnode is being freed */
 #define	VI_INACTNOW	0x00800000	/* VOP_INACTIVE() in progress */
 
 /*
@@ -222,7 +221,7 @@
 #define	VNODE_FLAGBITS \
     "\20\1ROOT\2SYSTEM\3ISTTY\4MAPPED\5MPSAFE\6LOCKSWORK\11TEXT\12EXECMAP" \
     "\13WRMAP\14WRMAPDIRTY\15XLOCK\17ONWORKLST\20MARKER" \
-    "\22LAYER\24CLEAN\25INACTPEND\26INACTREDO\27FREEING" \
+    "\22LAYER\24CLEAN\25INACTPEND\26INACTREDO" \
     "\30INACTNOW\31DIROP" 
 
 #define	VSIZENOTSET	((voff_t)-1)

Index: src/sys/ufs/ext2fs/ext2fs_inode.c
diff -u src/sys/ufs/ext2fs/ext2fs_inode.c:1.72 src/sys/ufs/ext2fs/ext2fs_inode.c:1.73
--- src/sys/ufs/ext2fs/ext2fs_inode.c:1.72	Thu Jun 24 13:03:18 2010
+++ src/sys/ufs/ext2fs/ext2fs_inode.c	Wed Jul 28 11:03:48 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: ext2fs_inode.c,v 1.72 2010/06/24 13:03:18 hannken Exp $	*/
+/*	$NetBSD: ext2fs_inode.c,v 1.73 2010/07/28 11:03:48 hannken Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_inode.c,v 1.72 2010/06/24 13:03:18 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_inode.c,v 1.73 2010/07/28 11:03:48 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -156,10 +156,7 @@
 		}
 		ip->i_e2fs_dtime = time_second;
 		ip->i_flag |= IN_CHANGE | IN_UPDATE;
-		mutex_enter(&vp->v_interlock);
-		vp->v_iflag |= VI_FREEING;
-		mutex_exit(&vp->v_interlock);
-		ext2fs_vfree(vp, ip->i_number, ip->i_e2fs_mode);
+		ip->i_omode = 1;
 	}
 	if (ip->i_flag & (IN_CHANGE | IN_UPDATE | IN_MODIFIED)) {
 		ext2fs_update(vp, NULL, NULL, 0);

Index: src/sys/ufs/ext2fs/ext2fs_vnops.c
diff -u src/sys/ufs/ext2fs/ext2fs_vnops.c:1.93 src/sys/ufs/ext2fs/ext2fs_vnops.c:1.94
--- src/sys/ufs/ext2fs/ext2fs_vnops.c:1.93	Thu Jun 24 13:03:18 2010
+++ src/sys/ufs/ext2fs/ext2fs_vnops.c	Wed Jul 28 11:03:48 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: ext2fs_vnops.c,v 1.93 2010/06/24 13:03:18 hannken Exp $	*/
+/*	$NetBSD: ext2fs_vnops.c,v 1.94 2010/07/28 11:03:48 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.93 2010/06/24 13:03:18 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_vnops.c,v 1.94 2010/07/28 11:03:48 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1502,6 +1502,13 @@
 	struct inode *ip = VTOI(vp);
 	int error;
 
+	/*
+	 * The inode must be freed and updated before being removed
+	 * from its hash chain.  Other threads trying to gain a hold
+	 * on the inode will be stalled because it is locked (VI_XLOCK).
+	 */
+	if (ip->i_omode == 1 && (vp->v_mount->mnt_flag & MNT_RDONLY) == 0)
+		ext2fs_vfree(vp, ip->i_number, ip->i_e2fs_mode);
 	if ((error = ufs_reclaim(vp)) != 0)
 		return (error);
 	if (ip->i_din.e2fs_din != NULL)

Index: src/sys/ufs/ffs/ffs_vnops.c
diff -u src/sys/ufs/ffs/ffs_vnops.c:1.114 src/sys/ufs/ffs/ffs_vnops.c:1.115
--- src/sys/ufs/ffs/ffs_vnops.c:1.114	Mon Mar 29 13:11:33 2010
+++ src/sys/ufs/ffs/ffs_vnops.c	Wed Jul 28 11:03:48 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffs_vnops.c,v 1.114 2010/03/29 13:11:33 pooka Exp $	*/
+/*	$NetBSD: ffs_vnops.c,v 1.115 2010/07/28 11:03:48 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffs_vnops.c,v 1.114 2010/03/29 13:11:33 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_vnops.c,v 1.115 2010/07/28 11:03:48 hannken Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ffs.h"
@@ -584,6 +584,19 @@
 	int error;
 
 	fstrans_start(mp, FSTRANS_LAZY);
+	/*
+	 * The inode must be freed and updated before being removed
+	 * from its hash chain.  Other threads trying to gain a hold
+	 * on the inode will be stalled because it is locked (VI_XLOCK).
+	 */
+	error = UFS_WAPBL_BEGIN(mp);
+	if (error) {
+		fstrans_done(mp);
+		return error;
+	}
+	if (ip->i_nlink <= 0 && (vp->v_mount->mnt_flag & MNT_RDONLY) == 0)
+		ffs_vfree(vp, ip->i_number, ip->i_omode);
+	UFS_WAPBL_END(mp);
 	if ((error = ufs_reclaim(vp)) != 0) {
 		fstrans_done(mp);
 		return (error);

Index: src/sys/ufs/ufs/inode.h
diff -u src/sys/ufs/ufs/inode.h:1.56 src/sys/ufs/ufs/inode.h:1.57
--- src/sys/ufs/ufs/inode.h:1.56	Sun Feb 22 20:28:07 2009
+++ src/sys/ufs/ufs/inode.h	Wed Jul 28 11:03:48 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: inode.h,v 1.56 2009/02/22 20:28:07 ad Exp $	*/
+/*	$NetBSD: inode.h,v 1.57 2010/07/28 11:03:48 hannken Exp $	*/
 
 /*
  * Copyright (c) 1982, 1989, 1993
@@ -133,6 +133,7 @@
 	int32_t   i_gen;	/* Generation number. */
 	u_int32_t i_uid;	/* File owner. */
 	u_int32_t i_gid;	/* File group. */
+	u_int16_t i_omode;	/* Old mode, for ufs_reclaim. */
 
 	struct dirhash *i_dirhash;	/* Hashing for large directories */
 

Index: src/sys/ufs/ufs/ufs_inode.c
diff -u src/sys/ufs/ufs/ufs_inode.c:1.81 src/sys/ufs/ufs/ufs_inode.c:1.82
--- src/sys/ufs/ufs/ufs_inode.c:1.81	Thu Jun 24 13:03:20 2010
+++ src/sys/ufs/ufs/ufs_inode.c	Wed Jul 28 11:03:48 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_inode.c,v 1.81 2010/06/24 13:03:20 hannken Exp $	*/
+/*	$NetBSD: ufs_inode.c,v 1.82 2010/07/28 11:03:48 hannken Exp $	*/
 
 /*
  * Copyright (c) 1991, 1993
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ufs_inode.c,v 1.81 2010/06/24 13:03:20 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_inode.c,v 1.82 2010/07/28 11:03:48 hannken Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ffs.h"
@@ -143,12 +143,12 @@
 		DIP_ASSIGN(ip, rdev, 0);
 		mode = ip->i_mode;
 		ip->i_mode = 0;
+		ip->i_omode = mode;
 		DIP_ASSIGN(ip, mode, 0);
 		ip->i_flag |= IN_CHANGE | IN_UPDATE;
-		mutex_enter(&vp->v_interlock);
-		vp->v_iflag |= VI_FREEING;
-		mutex_exit(&vp->v_interlock);
-		UFS_VFREE(vp, ip->i_number, mode);
+		/*
+		 * Defer final inode free and update to ufs_reclaim().
+		 */
 	}
 
 	if (ip->i_flag & (IN_CHANGE | IN_UPDATE | IN_MODIFIED)) {

Reply via email to