diff options
| -rw-r--r-- | sys/kern/vfs_default.c | 1 | ||||
| -rw-r--r-- | sys/vm/vm_object.c | 2 | ||||
| -rw-r--r-- | sys/vm/vm_object.h | 1 | ||||
| -rw-r--r-- | sys/vm/vnode_pager.c | 5 |
4 files changed, 7 insertions, 2 deletions
diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c index a2d7a0d5ba81..99b6e4d1a859 100644 --- a/sys/kern/vfs_default.c +++ b/sys/kern/vfs_default.c @@ -424,6 +424,7 @@ retry: VM_OBJECT_LOCK(object); if (object->flags & OBJ_DEAD) { VOP_UNLOCK(vp, 0, td); + vm_object_set_flag(object, OBJ_DISCONNECTWNT); msleep(object, VM_OBJECT_MTX(object), PDROP | PVM, "vodead", 0); vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 3a283256be91..4df862b0cb56 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -642,8 +642,6 @@ vm_object_terminate(vm_object_t object) TAILQ_REMOVE(&vm_object_list, object, object_list); mtx_unlock(&vm_object_list_mtx); - wakeup(object); - /* * Free the space for the object. */ diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h index 64e4d76ff80b..1f1acb6d26bc 100644 --- a/sys/vm/vm_object.h +++ b/sys/vm/vm_object.h @@ -148,6 +148,7 @@ struct vm_object { #define OBJ_MIGHTBEDIRTY 0x0100 /* object might be dirty */ #define OBJ_CLEANING 0x0200 #define OBJ_ONEMAPPING 0x2000 /* One USE (a single, non-forked) mapping flag */ +#define OBJ_DISCONNECTWNT 0x4000 /* disconnect from vnode wanted */ #define IDX_TO_OFF(idx) (((vm_ooffset_t)(idx)) << PAGE_SHIFT) #define OFF_TO_IDX(off) ((vm_pindex_t)(((vm_ooffset_t)(off)) >> PAGE_SHIFT)) diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index b09559b9dcaa..c9634e09cc46 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -143,6 +143,7 @@ vnode_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, VM_OBJECT_LOCK(object); if ((object->flags & OBJ_DEAD) == 0) break; + vm_object_set_flag(object, OBJ_DISCONNECTWNT); msleep(object, VM_OBJECT_MTX(object), PDROP | PVM, "vadead", 0); } @@ -191,6 +192,10 @@ vnode_pager_dealloc(object) object->handle = NULL; object->type = OBJT_DEAD; + if (object->flags & OBJ_DISCONNECTWNT) { + vm_object_clear_flag(object, OBJ_DISCONNECTWNT); + wakeup(object); + } ASSERT_VOP_LOCKED(vp, "vnode_pager_dealloc"); vp->v_object = NULL; vp->v_vflag &= ~(VV_TEXT | VV_OBJBUF); |
