clientchar_t path[AFSPATHMAX];
afs_uint32 rights;
afs_int32 mustFake = 0;
+ afs_int32 nobulkstat = 0;
lock_ObtainWrite(&dscp->rw);
code = cm_FindACLCache(dscp, userp, &rights);
memset(bsp, 0, sizeof(cm_bulkStat_t));
bsp->userp = userp;
+ restart_patchset:
for (patchp = *dirPatchespp, count=0;
patchp;
patchp = (smb_dirListPatch_t *) osi_QNext(&patchp->q)) {
cm_ReleaseSCache(tscp);
continue;
}
+
+ if (nobulkstat) {
+ code = cm_SyncOp(tscp, NULL, userp, reqp, 0,
+ CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
+ lock_ReleaseWrite(&tscp->rw);
+ cm_ReleaseSCache(tscp);
+ continue;
+ }
+
lock_ReleaseWrite(&tscp->rw);
} /* got lock */
cm_ReleaseSCache(tscp);
code = cm_TryBulkStatRPC(dscp, bsp, userp, reqp);
memset(bsp, 0, sizeof(cm_bulkStat_t));
bsp->userp = userp;
+
+ if (code == CM_ERROR_BULKSTAT_FAILURE) {
+ /*
+ * If bulk stat cannot be used for this directory
+ * we must perform individual fetch status calls.
+ * Restart from the beginning of the patch series.
+ */
+ nobulkstat = 1;
+ goto restart_patchset;
+ }
}
}