ubc_release(vp);
ubc_info_free(vp);
}
+#else
+ /* This is literally clean_up_name_parent_ptrs() */
+ /* Critical to clean up any state attached to the vnode here since it's
+ being recycled, and we're not letting refcnt drop to 0 to trigger
+ normal recycling. */
+ if (VNAME(vp) || VPARENT(vp)) {
+ char *tmp1;
+ struct vnode *tmp2;
+
+ /* do it this way so we don't block before clearing
+ these fields. */
+ tmp1 = VNAME(vp);
+ tmp2 = VPARENT(vp);
+ VNAME(vp) = NULL;
+ VPARENT(vp) = NULL;
+
+ if (tmp1) {
+ remove_name(tmp1);
+ }
+
+ if (tmp2) {
+ vrele(tmp2);
+ }
+ }
#endif
AFS_GLOCK();
AFS_RELE(vp);
return;
}
+ if (ISSET(vp->v_flag, VUINACTIVE)) {
+ simple_unlock(&vp->v_interlock);
+ AFS_RELE(vp);
+ printf("vnode %x still inactive!", vp);
+ return;
+ }
#ifdef AFS_DARWIN14_ENV
if (vp->v_ubcinfo->ui_refcount > 1 || vp->v_ubcinfo->ui_mapped) {
simple_unlock(&vp->v_interlock);
vp = AFSTOV(vcp); /* always get a node if no error */
vp->v_vfsp = dvp->v_vfsp;
+ if (UBCINFOMISSING(vp) ||
+ UBCINFORECLAIMED(vp)) {
+#ifdef AFS_DARWIN14_ENV
+ if (UBCINFORECLAIMED(vp) && ISSET(vp->v_flag, (VXLOCK|VORECLAIM))) {
+ DROPNAME();
+ return (ENXIO);
+ } else
+#endif
+ ubc_info_init(vp);
+ }
/* The parent directory comes in locked. We unlock it on return
* unless the caller wants it left locked.
* we also always return the vnode locked. */
*ap->a_vpp = AFSTOV(vcp);
(*ap->a_vpp)->v_vfsp = dvp->v_vfsp;
vn_lock(*ap->a_vpp, LK_EXCLUSIVE | LK_RETRY, p);
- if (UBCINFOMISSING(*ap->a_vpp) || UBCINFORECLAIMED(*ap->a_vpp))
- ubc_info_init(*ap->a_vpp);
+ if (UBCINFOMISSING(*ap->a_vpp) || UBCINFORECLAIMED(*ap->a_vpp)) {
+#ifdef AFS_DARWIN14_ENV
+ if (UBCINFORECLAIMED(*ap->a_vpp) && ISSET((*ap->a_vpp)->v_flag,
+ (VXLOCK|VORECLAIM))) {
+ vput(dvp);
+ DROPNAME();
+ return (ENXIO);
+ } else
+#endif
+ ubc_info_init(*ap->a_vpp);
+ }
} else
*ap->a_vpp = 0;
if ((fcnp->cn_flags & SAVESTART) == 0)
panic("afs_rename: lost from startdir");
fcnp->cn_nameiop = DELETE;
- (void)relookup(fdvp, &fvp, fcnp);
- return (VOP_REMOVE(fdvp, fvp, fcnp));
+
+ VREF(fdvp);
+ error=relookup(fdvp, &fvp, fcnp);
+ if (error == 0)
+ vrele(fdvp);
+ if (fvp == NULL) {
+ return (ENOENT);
+ }
+
+ error=VOP_REMOVE(fdvp, fvp, fcnp);
+ if (fdvp == fvp)
+ vrele(fdvp);
+ else
+ vput(fdvp);
+ vput(fvp);
+ return (error);
}
if (error = vn_lock(fvp, LK_EXCLUSIVE, p))
goto abortit;