- if (ISSET(uip->ui_flags, UI_HASOBJREF)) {
- object = _ubc_getobject(vp, UBC_NOREACTIVATE);
- assert(object);
- CLR(uip->ui_flags, UI_HASOBJREF);
- vm_object_deallocate(object);
- return (1);
- } else
- return (0);
+ /*
+ * Terminate the memory object.
+ * memory_object_destroy() will result in
+ * vnode_pager_no_senders().
+ * That will release the pager reference
+ * and the vnode will move to the free list.
+ */
+ control = ubc_getobject(vp, UBC_HOLDOBJECT);
+ if (control != MEMORY_OBJECT_CONTROL_NULL) {
+
+ if (ISSET(vp->v_flag, VTERMINATE))
+ panic("ubc_destroy_named: already teminating");
+ SET(vp->v_flag, VTERMINATE);
+
+ kret = memory_object_destroy(control, 0);
+ if (kret != KERN_SUCCESS)
+ return (0);
+
+ /*
+ * memory_object_destroy() is asynchronous
+ * with respect to vnode_pager_no_senders().
+ * wait for vnode_pager_no_senders() to clear
+ * VTERMINATE
+ */
+ while (ISSET(vp->v_flag, VTERMINATE)) {
+ SET(vp->v_flag, VTERMWANT);
+ (void)tsleep((caddr_t)&vp->v_ubcinfo,
+ PINOD, "ubc_destroy_named", 0);
+ }
+ }
+ return (1);