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 <[email protected]>
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)) {