Fixed a panic that Garrett reported to me...the OBJ_INTERNAL flag wasn't

being cleared in some cases for vnode backed objects; we now do this in
vnode_pager_alloc proper to guarantee it. Also be more careful in the
rcollapse code about messing with busy/bmapped pages.
This commit is contained in:
David Greenman 1995-01-11 20:00:10 +00:00
parent 9e681ba3da
commit a748978457
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=5519
2 changed files with 19 additions and 7 deletions

View file

@ -61,7 +61,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
* $Id: vm_object.c,v 1.14 1995/01/05 04:30:40 davidg Exp $
* $Id: vm_object.c,v 1.15 1995/01/09 16:05:49 davidg Exp $
*/
/*
@ -1152,20 +1152,30 @@ vm_object_rcollapse(object, sobject)
if (backing_object->ref_count != 1)
return;
object->ref_count += 2;
backing_object->ref_count += 2;
s = splbio();
while (backing_object->paging_in_progress) {
tsleep(backing_object, PVM, "rcolow", 0);
}
splx(s);
backing_offset = object->shadow_offset;
size = object->size;
again:
s = splbio();
/* XXX what about object->paging_in_progress? */
while (backing_object->paging_in_progress) {
tsleep(backing_object, PVM, "rcolpp", 0);
}
splx(s);
p = backing_object->memq.tqh_first;
while (p) {
vm_page_t next;
next = p->listq.tqe_next;
if ((p->flags & PG_BUSY) || p->busy || p->bmapped) {
p = next;
continue;
}
pmap_page_protect(VM_PAGE_TO_PHYS(p), VM_PROT_NONE);
new_offset = (p->offset - backing_offset);
if (p->offset < backing_offset ||
@ -1196,6 +1206,7 @@ vm_object_rcollapse(object, sobject)
p = next;
}
backing_object->ref_count -= 2;
object->ref_count -= 2;
}
/*

View file

@ -37,7 +37,7 @@
* SUCH DAMAGE.
*
* from: @(#)vnode_pager.c 7.5 (Berkeley) 4/20/91
* $Id: vnode_pager.c,v 1.18 1994/11/24 14:43:22 davidg Exp $
* $Id: vnode_pager.c,v 1.19 1995/01/09 16:06:01 davidg Exp $
*/
/*
@ -174,6 +174,7 @@ vnode_pager_alloc(handle, size, prot, offset)
*/
if ((rtval = VOP_GETATTR(vp, &vattr, p->p_ucred, p)) == 0) {
object = vm_object_allocate(round_page(vattr.va_size));
object->flags &= ~OBJ_INTERNAL;
vm_object_enter(object, pager);
vm_object_setpager(object, pager, 0, TRUE);
} else {