* afs_IsWired (DUX)
* afsremove
* afs_remove
- *
- * Local:
- * newname
+ * afs_newname
*
*/
#include <afsconfig.h>
register struct conn *tc;
struct AFSFetchStatus OutDirStatus;
struct AFSVolSync tsync;
- XSTATS_DECLS
+ XSTATS_DECLS;
do {
tc = afs_Conn(&adp->fid, treqp, SHARED_LOCK);
if (tc) {
UpgradeSToWLock(&tdc->lock, 637);
if (afs_LocalHero(adp, tdc, &OutDirStatus, 1)) {
/* we can do it locally */
- code = afs_dir_Delete(&tdc->f.inode, aname);
+ code = afs_dir_Delete(tdc, aname);
if (code) {
ZapDCE(tdc); /* surprise error -- invalid value */
- DZap(&tdc->f.inode);
+ DZap(tdc);
}
}
if (tdc) {
return (0);
}
-static char *
-newname(void)
+char *
+afs_newname(void)
{
char *name, *sp, *p = ".__afs";
afs_int32 rd = afs_random() & 0xffff;
struct ucred *acred = ndp->ni_cred;
#else /* AFS_OSF_ENV */
afs_remove(OSI_VC_ARG(adp), aname, acred)
-OSI_VC_DECL(adp);
+ OSI_VC_DECL(adp);
char *aname;
struct AFS_UCRED *acred;
{
register struct vcache *tvc;
afs_size_t offset, len;
struct afs_fakestat_state fakestate;
- OSI_VC_CONVERT(adp)
+ OSI_VC_CONVERT(adp);
- AFS_STATCNT(afs_remove);
+ AFS_STATCNT(afs_remove);
afs_Trace2(afs_iclSetp, CM_TRACE_REMOVE, ICL_TYPE_POINTER, adp,
ICL_TYPE_STRING, aname);
#endif
return code;
}
+#if 0
+ if (adp->mvstat == 2) {
+ afs_PutFakeStat(&fakestate);
+#ifdef AFS_OSF_ENV
+ afs_PutVCache(adp);
+ afs_PutVCache(tvc);
+#endif
+ return EISDIR;
+ }
+#endif
+
if (strlen(aname) > AFSNAMEMAX) {
afs_PutFakeStat(&fakestate);
#ifdef AFS_OSF_ENV
* done the work */
if (!tvc)
if (tdc) {
- code = afs_dir_Lookup(&tdc->f.inode, aname, &unlinkFid.Fid);
+ code = afs_dir_Lookup(tdc, aname, &unlinkFid.Fid);
if (code == 0) {
afs_int32 cached = 0;
Ttvcr = VREFCOUNT(tvc);
#ifdef AFS_AIX_ENV
if (tvc && (VREFCOUNT(tvc) > 2) && tvc->opens > 0
- && !(tvc->states & CUnlinked)) {
+ && !(tvc->states & CUnlinked))
+#else
+#ifdef AFS_DARWIN14_ENV
+ if (tvc && (VREFCOUNT(tvc) > 1 + DARWIN_REFBASE) && tvc->opens > 0
+ && !(tvc->states & CUnlinked))
#else
if (tvc && (VREFCOUNT(tvc) > 1) && tvc->opens > 0
- && !(tvc->states & CUnlinked)) {
+ && !(tvc->states & CUnlinked))
+#endif
#endif
- char *unlname = newname();
+ {
+ char *unlname = afs_newname();
ReleaseWriteLock(&adp->lock);
if (tdc)
struct VenusFid dirFid;
register struct dcache *tdc;
afs_int32 code = 0;
+#ifdef AFS_DARWIN14_ENV
+ int oldref;
+#endif
if (NBObtainWriteLock(&avc->lock, 423))
return 0;
cred = avc->uncred;
avc->uncred = NULL;
-#ifdef AFS_DARWIN_ENV
+#if defined(AFS_DARWIN_ENV) && !defined(AFS_DARWIN14_ENV)
/* this is called by vrele (via VOP_INACTIVE) when the refcount
* is 0. we can't just call VN_HOLD since vref will panic.
* we can't just call osi_vnhold because a later AFS_RELE will call
*/
avc->states &= ~(CUnlinked | CUnlinkedDel);
+#ifdef AFS_DARWIN14_ENV
+ if (VREFCOUNT(avc) < 4) {
+ oldref = 4 - VREFCOUNT(avc);
+ VREFCOUNT_SET(avc, 4);
+ }
+#endif
ReleaseWriteLock(&avc->lock);
dirFid.Cell = avc->fid.Cell;
osi_FreeSmallSpace(unlname);
crfree(cred);
#ifdef AFS_DARWIN_ENV
+#ifndef AFS_DARWIN14_ENV
osi_Assert(VREFCOUNT(avc) == 1);
VREFCOUNT_SET(avc, 0);
+#else
+ if (oldref) {
+ int newref = VREFCOUNT(avc) - oldref;
+ VREFCOUNT_SET(avc, newref);
+ }
+#endif
#endif
}
} else {