struct afs_conn *tc;
struct VenusFid newFid;
struct AFSStoreStatus InStatus;
- struct AFSFetchStatus OutFidStatus, OutDirStatus;
+ struct AFSFetchStatus *OutFidStatus, *OutDirStatus;
struct AFSVolSync tsync;
struct AFSCallBack CallBack;
afs_int32 now;
XSTATS_DECLS;
OSI_VC_CONVERT(adp);
-
AFS_STATCNT(afs_create);
+
+ OutFidStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+ OutDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+
if ((code = afs_InitReq(&treq, acred)))
goto done2;
code =
RXAFS_CreateFile(rxconn, (struct AFSFid *)&adp->f.fid.Fid,
aname, &InStatus, (struct AFSFid *)
- &newFid.Fid, &OutFidStatus, &OutDirStatus,
+ &newFid.Fid, OutFidStatus, OutDirStatus,
&CallBack, &tsync);
RX_AFS_GLOCK();
XSTATS_END_TIME;
/* otherwise, we should see if we can make the change to the dir locally */
if (tdc)
UpgradeSToWLock(&tdc->lock, 631);
- if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, &OutDirStatus, 1)) {
+ if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, OutDirStatus, 1)) {
/* we can do it locally */
ObtainWriteLock(&afs_xdcache, 291);
code = afs_dir_Create(tdc, aname, &newFid.Fid);
afs_DisconAddDirty(tvc, VDisconCreate, 0);
afs_GenDisconStatus(adp, tvc, &newFid, attrs, &treq, VREG);
} else {
- afs_ProcessFS(tvc, &OutFidStatus, &treq);
+ afs_ProcessFS(tvc, OutFidStatus, &treq);
}
tvc->f.parent.vnode = adp->f.fid.Fid.Vnode;
code = afs_CheckCode(code, &treq, 20);
done2:
+ osi_FreeSmallSpace(OutFidStatus);
+ osi_FreeSmallSpace(OutDirStatus);
return code;
}
afs_size_t offset, len;
struct vcache *tvc;
struct AFSStoreStatus InStatus;
- struct AFSFetchStatus OutFidStatus, OutDirStatus;
+ struct AFSFetchStatus *OutFidStatus, *OutDirStatus;
struct AFSCallBack CallBack;
struct AFSVolSync tsync;
afs_int32 now;
afs_Trace2(afs_iclSetp, CM_TRACE_MKDIR, ICL_TYPE_POINTER, adp,
ICL_TYPE_STRING, aname);
+ OutFidStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+ OutDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+
if ((code = afs_InitReq(&treq, acred)))
goto done2;
afs_InitFakeStat(&fakestate);
aname,
&InStatus,
(struct AFSFid *)&newFid.Fid,
- &OutFidStatus,
- &OutDirStatus,
+ OutFidStatus,
+ OutDirStatus,
&CallBack,
&tsync);
RX_AFS_GLOCK();
/* otherwise, we should see if we can make the change to the dir locally */
if (tdc)
ObtainWriteLock(&tdc->lock, 632);
- if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, &OutDirStatus, 1)) {
+ if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, OutDirStatus, 1)) {
/* we can do it locally */
ObtainWriteLock(&afs_xdcache, 294);
code = afs_dir_Create(tdc, aname, &newFid.Fid);
/* We will have to settle with the local link count. */
adp->f.m.LinkCount++;
else
- adp->f.m.LinkCount = OutDirStatus.LinkCount;
+ adp->f.m.LinkCount = OutDirStatus->LinkCount;
newFid.Cell = adp->f.fid.Cell;
newFid.Fid.Volume = adp->f.fid.Fid.Volume;
ReleaseWriteLock(&adp->lock);
afs_PutFakeStat(&fakestate);
code = afs_CheckCode(code, &treq, 26);
done2:
+ osi_FreeSmallSpace(OutFidStatus);
+ osi_FreeSmallSpace(OutDirStatus);
return code;
}
afs_int32 code;
struct afs_conn *tc;
afs_size_t offset, len;
- struct AFSFetchStatus OutFidStatus, OutDirStatus;
+ struct AFSFetchStatus *OutFidStatus, *OutDirStatus;
struct AFSVolSync tsync;
struct afs_fakestat_state vfakestate, dfakestate;
struct rx_connection *rxconn;
AFS_STATCNT(afs_link);
afs_Trace3(afs_iclSetp, CM_TRACE_LINK, ICL_TYPE_POINTER, adp,
ICL_TYPE_POINTER, avc, ICL_TYPE_STRING, aname);
+
+ OutFidStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+ OutDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+
/* create a hard link; new entry is aname in dir adp */
if ((code = afs_InitReq(&treq, acred)))
goto done2;
afs_InitFakeStat(&vfakestate);
afs_InitFakeStat(&dfakestate);
-
+
AFS_DISCON_LOCK();
code = afs_EvalFakeStat(&avc, &vfakestate, &treq);
code = EROFS;
goto done;
}
-
+
if (AFS_IS_DISCONNECTED) {
code = ENETDOWN;
goto done;
RX_AFS_GUNLOCK();
code =
RXAFS_Link(rxconn, (struct AFSFid *)&adp->f.fid.Fid, aname,
- (struct AFSFid *)&avc->f.fid.Fid, &OutFidStatus,
- &OutDirStatus, &tsync);
+ (struct AFSFid *)&avc->f.fid.Fid, OutFidStatus,
+ OutDirStatus, &tsync);
RX_AFS_GLOCK();
XSTATS_END_TIME;
}
if (tdc)
ObtainWriteLock(&tdc->lock, 635);
- if (afs_LocalHero(adp, tdc, &OutDirStatus, 1)) {
+ if (afs_LocalHero(adp, tdc, OutDirStatus, 1)) {
/* we can do it locally */
ObtainWriteLock(&afs_xdcache, 290);
code = afs_dir_Create(tdc, aname, &avc->f.fid.Fid);
afs_PutFakeStat(&dfakestate);
AFS_DISCON_UNLOCK();
done2:
+ osi_FreeSmallSpace(OutFidStatus);
+ osi_FreeSmallSpace(OutDirStatus);
return code;
}
struct VenusFid unlinkFid, fileFid;
struct vcache *tvc;
struct dcache *tdc1, *tdc2;
- struct AFSFetchStatus OutOldDirStatus, OutNewDirStatus;
+ struct AFSFetchStatus *OutOldDirStatus, *OutNewDirStatus;
struct AFSVolSync tsync;
struct rx_connection *rxconn;
XSTATS_DECLS;
ICL_TYPE_STRING, aname1, ICL_TYPE_POINTER, andp,
ICL_TYPE_STRING, aname2);
+ OutOldDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+ OutNewDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+
if (strlen(aname1) > AFSNAMEMAX || strlen(aname2) > AFSNAMEMAX) {
code = ENAMETOOLONG;
goto done;
aname1,
(struct AFSFid *)&andp->f.fid.Fid,
aname2,
- &OutOldDirStatus,
- &OutNewDirStatus,
+ OutOldDirStatus,
+ OutNewDirStatus,
&tsync);
RX_AFS_GLOCK();
XSTATS_END_TIME;
if (!AFS_IS_DISCON_RW) {
if (oneDir) {
/* number increases by 1 for whole rename operation */
- if (!afs_LocalHero(aodp, tdc1, &OutOldDirStatus, 1)) {
+ if (!afs_LocalHero(aodp, tdc1, OutOldDirStatus, 1)) {
doLocally = 0;
}
} else {
/* two separate dirs, each increasing by 1 */
- if (!afs_LocalHero(aodp, tdc1, &OutOldDirStatus, 1))
+ if (!afs_LocalHero(aodp, tdc1, OutOldDirStatus, 1))
doLocally = 0;
- if (!afs_LocalHero(andp, tdc2, &OutNewDirStatus, 1))
+ if (!afs_LocalHero(andp, tdc2, OutNewDirStatus, 1))
doLocally = 0;
if (!doLocally) {
if (tdc1) {
}
/* If we're in the same directory, link count doesn't change */
} else {
- aodp->f.m.LinkCount = OutOldDirStatus.LinkCount;
+ aodp->f.m.LinkCount = OutOldDirStatus->LinkCount;
if (!oneDir)
- andp->f.m.LinkCount = OutNewDirStatus.LinkCount;
+ andp->f.m.LinkCount = OutNewDirStatus->LinkCount;
}
} else { /* operation failed (code != 0) */
}
code = returnCode;
done:
+ osi_FreeSmallSpace(OutOldDirStatus);
+ osi_FreeSmallSpace(OutNewDirStatus);
return code;
}
struct server *hostp = 0;
struct vcache *tvc;
struct AFSStoreStatus InStatus;
- struct AFSFetchStatus OutFidStatus, OutDirStatus;
+ struct AFSFetchStatus *OutFidStatus, *OutDirStatus;
struct AFSCallBack CallBack;
struct AFSVolSync tsync;
struct volume *volp = 0;
afs_Trace2(afs_iclSetp, CM_TRACE_SYMLINK, ICL_TYPE_POINTER, adp,
ICL_TYPE_STRING, aname);
+ OutFidStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+ OutDirStatus = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+
if ((code = afs_InitReq(&treq, acred)))
goto done2;
(struct AFSFid *)&adp->f.fid.Fid,
aname, atargetName, &InStatus,
(struct AFSFid *)&newFid.Fid,
- &OutFidStatus, &OutDirStatus,
+ OutFidStatus, OutDirStatus,
&CallBack, &tsync);
RX_AFS_GLOCK();
} else {
RXAFS_Symlink(rxconn, (struct AFSFid *)&adp->f.fid.Fid,
aname, atargetName, &InStatus,
(struct AFSFid *)&newFid.Fid,
- &OutFidStatus, &OutDirStatus, &tsync);
+ OutFidStatus, OutDirStatus, &tsync);
RX_AFS_GLOCK();
}
XSTATS_END_TIME;
goto done;
}
/* otherwise, we should see if we can make the change to the dir locally */
- if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, &OutDirStatus, 1)) {
+ if (AFS_IS_DISCON_RW || afs_LocalHero(adp, tdc, OutDirStatus, 1)) {
/* we can do it locally */
ObtainWriteLock(&afs_xdcache, 293);
/* If the following fails because the name has been created in the meantime, the
}
afs_DisconAddDirty(tvc, VDisconCreate, 0);
} else {
- afs_ProcessFS(tvc, &OutFidStatus, &treq);
+ afs_ProcessFS(tvc, OutFidStatus, &treq);
}
if (!tvc->linkData) {
AFS_DISCON_UNLOCK();
code = afs_CheckCode(code, &treq, 31);
done2:
+ osi_FreeSmallSpace(OutFidStatus);
+ osi_FreeSmallSpace(OutDirStatus);
return code;
}