long code;
cm_fid_t tfid;
cm_scache_t *aclScp;
+ int got_cb = 0;
/* pretty easy: just force a pass through the fetch status code */
/* first, start by finding out whether we have a directory or something
* else, so we can find what object's ACL we need.
*/
- code = cm_SyncOp(scp, NULL, up, reqp, 0,
- CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
- if (code)
- return code;
+ if (!cm_HaveCallback(scp)) {
+ code = cm_SyncOp(scp, NULL, up, reqp, 0,
+ CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
+ if (code)
+ return code;
+
+ got_cb = 1;
+ }
if (scp->fileType != CM_SCACHETYPE_DIRECTORY) {
/* not a dir, use parent dir's acl */
osi_Log1(afsd_logp, "GetAccess parent scp %x user %x", aclScp, up);
lock_ObtainMutex(&aclScp->mx);
- code = cm_SyncOp(aclScp, NULL, up, reqp, 0,
- CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
- lock_ReleaseMutex(&aclScp->mx);
+ code = cm_GetCallback(aclScp, up, reqp, 1);
+ lock_ReleaseMutex(&aclScp->mx);
cm_ReleaseSCache(aclScp);
lock_ObtainMutex(&scp->mx);
+ } else if (!got_cb) {
+ code = cm_GetCallback(scp, up, reqp, 1);
}
return code;
/* otherwise, we have to make an RPC to get the status */
sflags = CM_SCACHESYNC_FETCHSTATUS | CM_SCACHESYNC_GETCALLBACK;
- cm_SyncOp(scp, NULL, NULL, NULL, 0, sflags);
+ cm_SyncOp(scp, NULL, userp, reqp, 0, sflags);
cm_StartCallbackGrantingCall(scp, &cbr);
sfid = scp->fid;
lock_ReleaseMutex(&scp->mx);