/*
* Implements:
- * afs_Wire (DUX)
* FetchWholeEnchilada
- * afs_IsWired (DUX)
* afsremove
* afs_remove
* afs_newname
extern afs_rwlock_t afs_xcbhash;
-#ifdef AFS_OSF_ENV
-/*
- * Wire down file in cache: prefetch all data, and turn on CWired flag
- * so that callbacks/callback expirations are (temporarily) ignored
- * and cache file(s) are kept in cache. File will be unwired when
- * afs_inactive is called (ie no one has VN_HOLD on vnode), or when
- * afs_IsWired notices that the file is no longer Active.
- */
-afs_Wire(avc, areq)
-#else /* AFS_OSF_ENV */
static void
-FetchWholeEnchilada(register struct vcache *avc, struct vrequest *areq)
-#endif
+FetchWholeEnchilada(struct vcache *avc, struct vrequest *areq)
{
- register afs_int32 nextChunk;
- register struct dcache *tdc;
+ afs_int32 nextChunk;
+ struct dcache *tdc;
afs_size_t pos, offset, len;
AFS_STATCNT(FetchWholeEnchilada);
return; /* don't know size */
for (nextChunk = 0; nextChunk < 1024; nextChunk++) { /* sanity check on N chunks */
pos = AFS_CHUNKTOBASE(nextChunk);
-#if defined(AFS_OSF_ENV)
- if (pos >= avc->f.m.Length)
- break; /* all done */
-#else /* AFS_OSF_ENV */
if (pos >= avc->f.m.Length)
return; /* all done */
-#endif
tdc = afs_GetDCache(avc, pos, areq, &offset, &len, 0);
if (!tdc)
-#if defined(AFS_OSF_ENV)
- break;
-#else /* AFS_OSF_ENV */
return;
-#endif
afs_PutDCache(tdc);
}
-#if defined(AFS_OSF_ENV)
- avc->f.states |= CWired;
-#endif /* AFS_OSF_ENV */
-}
-
-#if defined(AFS_OSF_ENV)
-/*
- * Tests whether file is wired down, after unwiring the file if it
- * is found to be inactive (ie not open and not being paged from).
- */
-afs_IsWired(register struct vcache *avc)
-{
- if (avc->f.states & CWired) {
- if (osi_Active(avc)) {
- return 1;
- }
- avc->f.states &= ~CWired;
- }
- return 0;
}
-#endif /* AFS_OSF_ENV */
int
-afsremove(register struct vcache *adp, register struct dcache *tdc,
- register struct vcache *tvc, char *aname, struct AFS_UCRED *acred,
+afsremove(struct vcache *adp, struct dcache *tdc,
+ struct vcache *tvc, char *aname, afs_ucred_t *acred,
struct vrequest *treqp)
{
- register afs_int32 code = 0;
- register struct afs_conn *tc;
+ afs_int32 code = 0;
+ struct afs_conn *tc;
struct AFSFetchStatus OutDirStatus;
struct AFSVolSync tsync;
+ struct rx_connection *rxconn;
XSTATS_DECLS;
if (!AFS_IS_DISCONNECTED) {
do {
- tc = afs_Conn(&adp->f.fid, treqp, SHARED_LOCK);
+ tc = afs_Conn(&adp->f.fid, treqp, SHARED_LOCK, &rxconn);
if (tc) {
XSTATS_START_TIME(AFS_STATS_FS_RPCIDX_REMOVEFILE);
RX_AFS_GUNLOCK();
code =
- RXAFS_RemoveFile(tc->id, (struct AFSFid *)&adp->f.fid.Fid,
+ RXAFS_RemoveFile(rxconn, (struct AFSFid *)&adp->f.fid.Fid,
aname, &OutDirStatus, &tsync);
RX_AFS_GLOCK();
XSTATS_END_TIME;
} else
code = -1;
} while (afs_Analyze
- (tc, code, &adp->f.fid, treqp, AFS_STATS_FS_RPCIDX_REMOVEFILE,
+ (tc, rxconn, code, &adp->f.fid, treqp, AFS_STATS_FS_RPCIDX_REMOVEFILE,
SHARED_LOCK, NULL));
}
* call FindVCache instead of GetVCache since if the file's really
* gone, we won't be able to fetch the status info anyway. */
if (tvc) {
-#ifdef AFS_BOZONLOCK_ENV
- afs_BozonLock(&tvc->pvnLock, tvc);
- /* Since afs_TryToSmush will do a pvn_vptrunc */
-#endif
+ if (afs_mariner)
+ afs_MarinerLog("store$Removing", tvc);
ObtainWriteLock(&tvc->lock, 141);
/* note that callback will be broken on the deleted file if there are
* still >0 links left to it, so we'll get the stat right */
afs_TryToSmush(tvc, acred, 0);
}
ReleaseWriteLock(&tvc->lock);
-#ifdef AFS_BOZONLOCK_ENV
- afs_BozonUnlock(&tvc->pvnLock, tvc);
-#endif
afs_PutVCache(tvc);
}
return (0);
/* Note that we don't set CDirty here, this is OK because the unlink
* RPC is called synchronously */
int
-afs_remove(OSI_VC_DECL(adp), char *aname, struct AFS_UCRED *acred)
+afs_remove(OSI_VC_DECL(adp), char *aname, afs_ucred_t *acred)
{
- struct vrequest treq;
- register struct dcache *tdc;
+ struct vrequest *treq = NULL;
+ struct dcache *tdc;
struct VenusFid unlinkFid;
- register afs_int32 code;
- register struct vcache *tvc;
+ afs_int32 code;
+ struct vcache *tvc;
afs_size_t offset, len;
struct afs_fakestat_state fakestate;
OSI_VC_CONVERT(adp);
afs_Trace2(afs_iclSetp, CM_TRACE_REMOVE, ICL_TYPE_POINTER, adp,
ICL_TYPE_STRING, aname);
-#ifdef AFS_OSF_ENV
- tvc = (struct vcache *)ndp->ni_vp; /* should never be null */
-#endif
- if ((code = afs_InitReq(&treq, acred))) {
-#ifdef AFS_OSF_ENV
- afs_PutVCache(tvc);
-#endif
+ if ((code = afs_CreateReq(&treq, acred))) {
return code;
}
afs_InitFakeStat(&fakestate);
- code = afs_EvalFakeStat(&adp, &fakestate, &treq);
- if (code) {
- afs_PutFakeStat(&fakestate);
-#ifdef AFS_OSF_ENV
- afs_PutVCache(tvc);
-#endif
- return code;
- }
+ AFS_DISCON_LOCK();
+ code = afs_EvalFakeStat(&adp, &fakestate, treq);
+ if (code)
+ goto done;
/* Check if this is dynroot */
if (afs_IsDynroot(adp)) {
code = afs_DynrootVOPRemove(adp, acred, aname);
- afs_PutFakeStat(&fakestate);
-#ifdef AFS_OSF_ENV
- afs_PutVCache(tvc);
-#endif
- return code;
+ goto done;
}
if (afs_IsDynrootMount(adp)) {
- return ENOENT;
+ code = ENOENT;
+ goto done;
}
if (strlen(aname) > AFSNAMEMAX) {
- afs_PutFakeStat(&fakestate);
-#ifdef AFS_OSF_ENV
- afs_PutVCache(tvc);
-#endif
- return ENAMETOOLONG;
+ code = ENAMETOOLONG;
+ goto done;
}
tagain:
- code = afs_VerifyVCache(adp, &treq);
-#ifdef AFS_OSF_ENV
- tvc = VTOAFS(ndp->ni_vp); /* should never be null */
- if (code) {
- afs_PutVCache(tvc);
- afs_PutFakeStat(&fakestate);
- return afs_CheckCode(code, &treq, 22);
- }
-#else /* AFS_OSF_ENV */
+ code = afs_VerifyVCache(adp, treq);
tvc = NULL;
if (code) {
- code = afs_CheckCode(code, &treq, 23);
- afs_PutFakeStat(&fakestate);
- return code;
+ code = afs_CheckCode(code, treq, 23);
+ goto done;
}
-#endif
/** If the volume is read-only, return error without making an RPC to the
* fileserver
*/
if (adp->f.states & CRO) {
-#ifdef AFS_OSF_ENV
- afs_PutVCache(tvc);
-#endif
code = EROFS;
- afs_PutFakeStat(&fakestate);
- return code;
+ goto done;
}
/* If we're running disconnected without logging, go no further... */
if (AFS_IS_DISCONNECTED && !AFS_IS_DISCON_RW) {
-#ifdef AFS_OSF_ENV
- afs_PutVCache(tvc);
-#endif
code = ENETDOWN;
- afs_PutFakeStat(&fakestate);
- return code;
+ goto done;
}
- tdc = afs_GetDCache(adp, (afs_size_t) 0, &treq, &offset, &len, 1); /* test for error below */
+ tdc = afs_GetDCache(adp, (afs_size_t) 0, treq, &offset, &len, 1); /* test for error below */
ObtainWriteLock(&adp->lock, 142);
if (tdc)
ObtainSharedLock(&tdc->lock, 638);
unlinkFid.Fid.Volume = adp->f.fid.Fid.Volume;
if (unlinkFid.Fid.Unique == 0) {
tvc =
- afs_LookupVCache(&unlinkFid, &treq, &cached, adp,
+ afs_LookupVCache(&unlinkFid, treq, &cached, adp,
aname);
} else {
ObtainReadLock(&afs_xvcache);
}
}
-#if defined(AFS_DISCON_ENV)
if (AFS_IS_DISCON_RW) {
if (!adp->f.shadow.vnode && !(adp->f.ddirty_flags & VDisconCreate)) {
/* Make shadow copy of parent dir. */
if (tdc)
ObtainSharedLock(&tdc->lock, 714);
}
-#endif
if (tvc && osi_Active(tvc)) {
/* about to delete whole file, prefetch it first */
if (tdc)
ReleaseSharedLock(&tdc->lock);
ObtainWriteLock(&tvc->lock, 143);
-#if defined(AFS_OSF_ENV)
- afs_Wire(tvc, &treq);
-#else /* AFS_OSF_ENV */
- FetchWholeEnchilada(tvc, &treq);
-#endif
+ FetchWholeEnchilada(tvc, treq);
ReleaseWriteLock(&tvc->lock);
ObtainWriteLock(&adp->lock, 144);
/* Technically I don't think we need this back, but let's hold it
ReleaseWriteLock(&adp->lock);
if (tdc)
ReleaseSharedLock(&tdc->lock);
- code = afsrename(adp, aname, adp, unlname, acred, &treq);
+ code = afsrename(adp, aname, adp, unlname, acred, treq);
Tnam1 = unlname;
if (!code) {
- struct VenusFid *oldmvid = NULL;
- if (tvc->mvid)
- oldmvid = tvc->mvid;
- tvc->mvid = (struct VenusFid *)unlname;
+ void *oldmvid = NULL;
+ if (tvc->mvid.silly_name)
+ oldmvid = tvc->mvid.silly_name;
+ tvc->mvid.silly_name = unlname;
if (oldmvid)
osi_FreeSmallSpace(oldmvid);
crhold(acred);
}
tvc->uncred = acred;
tvc->f.states |= CUnlinked;
-#if defined(AFS_DISCON_ENV)
/* if rename succeeded, remove should not */
ObtainWriteLock(&tvc->lock, 715);
if (tvc->f.ddirty_flags & VDisconRemove) {
tvc->f.ddirty_flags &= ~VDisconRemove;
}
ReleaseWriteLock(&tvc->lock);
-#endif
} else {
osi_FreeSmallSpace(unlname);
}
afs_PutDCache(tdc);
afs_PutVCache(tvc);
} else {
- code = afsremove(adp, tdc, tvc, aname, acred, &treq);
+ code = afsremove(adp, tdc, tvc, aname, acred, treq);
}
+ done:
afs_PutFakeStat(&fakestate);
-#ifndef AFS_DARWIN80_ENV
+#if !defined(AFS_DARWIN80_ENV) && !defined(UKERNEL)
/* we can't track by thread, it's not exported in the KPI; only do
this on !macos */
osi_Assert(!WriteLocked(&adp->lock) || (adp->lock.pid_writer != MyPidxx));
#endif
+ AFS_DISCON_UNLOCK();
+ afs_DestroyReq(treq);
return code;
}
* CAUTION -- may be called with avc unheld. */
int
-afs_remunlink(register struct vcache *avc, register int doit)
+afs_remunlink(struct vcache *avc, int doit)
{
- struct AFS_UCRED *cred;
+ afs_ucred_t *cred;
char *unlname;
struct vcache *adp;
- struct vrequest treq;
struct VenusFid dirFid;
- register struct dcache *tdc;
+ struct dcache *tdc;
afs_int32 code = 0;
if (NBObtainWriteLock(&avc->lock, 423))
}
#endif
- if (avc->mvid && (doit || (avc->f.states & CUnlinkedDel))) {
- if ((code = afs_InitReq(&treq, avc->uncred))) {
+ if (avc->mvid.silly_name && (doit || (avc->f.states & CUnlinkedDel))) {
+ struct vrequest *treq = NULL;
+
+ if ((code = afs_CreateReq(&treq, avc->uncred))) {
ReleaseWriteLock(&avc->lock);
} else {
/* Must bump the refCount because GetVCache may block.
* Also clear mvid so no other thread comes here if we block.
*/
- unlname = (char *)avc->mvid;
- avc->mvid = NULL;
+ unlname = avc->mvid.silly_name;
+ avc->mvid.silly_name = NULL;
cred = avc->uncred;
avc->uncred = NULL;
#if defined(AFS_DARWIN_ENV) && !defined(AFS_DARWIN80_ENV)
VREF(AFSTOV(avc));
#else
- VN_HOLD(AFSTOV(avc));
+ AFS_FAST_HOLD(avc);
#endif
/* We'll only try this once. If it fails, just release the vnode.
dirFid.Fid.Volume = avc->f.fid.Fid.Volume;
dirFid.Fid.Vnode = avc->f.parent.vnode;
dirFid.Fid.Unique = avc->f.parent.unique;
- adp = afs_GetVCache(&dirFid, &treq, NULL, NULL);
+ adp = afs_GetVCache(&dirFid, treq, NULL, NULL);
if (adp) {
tdc = afs_FindDCache(adp, (afs_size_t) 0);
ObtainSharedLock(&tdc->lock, 639);
/* afsremove releases the adp & tdc locks, and does vn_rele(avc) */
- code = afsremove(adp, tdc, avc, unlname, cred, &treq);
+ code = afsremove(adp, tdc, avc, unlname, cred, treq);
afs_PutVCache(adp);
} else {
/* we failed - and won't be back to try again. */
}
osi_FreeSmallSpace(unlname);
crfree(cred);
+ afs_DestroyReq(treq);
}
} else {
#if defined(AFS_DARWIN80_ENV)