summaryrefslogtreecommitdiffstats
path: root/sys/ufs/ffs/ffs_alloc.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2011-04-24 10:47:56 +0000
committerkib <kib@FreeBSD.org>2011-04-24 10:47:56 +0000
commit38508e2c9106805f11c061609135bbe11e934d67 (patch)
tree0d608ac56aebd6ed577365a58f9e733bb4b382ab /sys/ufs/ffs/ffs_alloc.c
parent96e417f7418b0ca583aab76927500e0e94afb15b (diff)
downloadFreeBSD-src-38508e2c9106805f11c061609135bbe11e934d67.zip
FreeBSD-src-38508e2c9106805f11c061609135bbe11e934d67.tar.gz
VFS sometimes is unable to inactivate a vnode when vnode use count
goes to zero. E.g., the vnode might be only shared-locked at the time of vput() call. Such vnodes are kept in the hash, so they can be found later. If ffs_valloc() allocated an inode that has its vnode cached in hash, and still owing the inactivation, then vget() call from ffs_valloc() clears VI_OWEINACT, and then the vnode is reused for the newly allocated inode. The problem is, the vnode is not reclaimed before it is put to the new use. ffs_valloc() recycles vnode vm object, but this is not enough. In particular, at least v_vflag should be cleared, and several bits of UFS state need to be removed. It is very inconvenient to call vgone() at this point. Instead, move some parts of ufs_reclaim() into helper function ufs_prepare_reclaim(), and call the helper from VOP_RECLAIM and ffs_valloc(). Reviewed by: mckusick Tested by: pho MFC after: 3 weeks
Diffstat (limited to 'sys/ufs/ffs/ffs_alloc.c')
-rw-r--r--sys/ufs/ffs/ffs_alloc.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c
index 1795161..e60514d 100644
--- a/sys/ufs/ffs/ffs_alloc.c
+++ b/sys/ufs/ffs/ffs_alloc.c
@@ -1012,8 +1012,9 @@ dup_alloc:
ip->i_din2->di_birthtime = ts.tv_sec;
ip->i_din2->di_birthnsec = ts.tv_nsec;
}
+ ufs_prepare_reclaim(*vpp);
ip->i_flag = 0;
- vnode_destroy_vobject(*vpp);
+ (*vpp)->v_vflag = 0;
(*vpp)->v_type = VNON;
if (fs->fs_magic == FS_UFS2_MAGIC)
(*vpp)->v_op = &ffs_vnodeops2;
OpenPOWER on IntegriCloud