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)) {