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;