diff options
author | alc <alc@FreeBSD.org> | 2003-05-01 03:10:38 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-05-01 03:10:38 +0000 |
commit | e9c4374a870ff015fdecd6820a2b46caaa97bb4f (patch) | |
tree | af46420678fd6678ceea0a334d14a87c51ef73da /sys/kern/vfs_subr.c | |
parent | 931edfc6d007c35c9546e10655e4f6b2af480c15 (diff) | |
download | FreeBSD-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.c | 14 |
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)) { /* |