summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_subr.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2003-05-01 03:10:38 +0000
committeralc <alc@FreeBSD.org>2003-05-01 03:10:38 +0000
commite9c4374a870ff015fdecd6820a2b46caaa97bb4f (patch)
treeaf46420678fd6678ceea0a334d14a87c51ef73da /sys/kern/vfs_subr.c
parent931edfc6d007c35c9546e10655e4f6b2af480c15 (diff)
downloadFreeBSD-src-e9c4374a870ff015fdecd6820a2b46caaa97bb4f.zip
FreeBSD-src-e9c4374a870ff015fdecd6820a2b46caaa97bb4f.tar.gz
Lock accesses to the vm_object's ref_count and resident_page_count.
Diffstat (limited to 'sys/kern/vfs_subr.c')
-rw-r--r--sys/kern/vfs_subr.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index bd02030..ea958ac 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -829,11 +829,15 @@ vcanrecycle(struct vnode *vp, struct mount **vnmpp)
/*
* Don't recycle if we still have cached pages.
*/
- if (VOP_GETVOBJECT(vp, &object) == 0 &&
- (object->resident_page_count ||
- object->ref_count)) {
- error = EBUSY;
- goto done;
+ if (VOP_GETVOBJECT(vp, &object) == 0) {
+ VM_OBJECT_LOCK(object);
+ if (object->resident_page_count ||
+ object->ref_count) {
+ VM_OBJECT_UNLOCK(object);
+ error = EBUSY;
+ goto done;
+ }
+ VM_OBJECT_UNLOCK(object);
}
if (LIST_FIRST(&vp->v_cache_src)) {
/*
OpenPOWER on IntegriCloud