/* at least one daemon is idle, so ask it to do the store.
* Also, note that we don't lock it any more... */
tb = afs_BQueue(BOP_STORE, avc, 0, 1, acred,
- (afs_size_t) afs_cr_uid(acred), 0L, (void *)0);
+ (afs_size_t) afs_cr_uid(acred), 0L, (void *)0,
+ (void *)0, (void *)0);
/* sleep waiting for the store to start, then retrieve error code */
while ((tb->flags & BUVALID) == 0) {
tb->flags |= BUWAIT;
tdc->mflags |= DFFetchReq;
bp = afs_BQueue(BOP_FETCH, avc, B_DONTWAIT, 0, acred,
- (afs_size_t) off, (afs_size_t) 1, tdc);
+ (afs_size_t) off, (afs_size_t) 1, tdc,
+ (void *)0, (void *)0);
if (!bp) {
/* Unable to start background fetch; might as well stop */
tdc->mflags &= ~DFFetchReq;
doing so ourselves.
*/
bp = afs_BQueue(BOP_FETCH, tvc, B_DONTWAIT, 0, acred,
- (afs_size_t) 0, (afs_size_t) 1, tdc);
+ (afs_size_t) 0, (afs_size_t) 1, tdc,
+ (void *)0, (void *)0);
if (!bp) {
tdc->mflags &= ~DFFetchReq;
}
tdc->mflags |= DFFetchReq;
bp = afs_BQueue(BOP_FETCH, avc, B_DONTWAIT, 0, acred,
(afs_size_t) filePos, (afs_size_t) 0,
- tdc);
+ tdc, (void *)0, (void *)0);
if (!bp) {
tdc->mflags &= ~DFFetchReq;
trybusy = 0; /* Avoid bkg daemon since they're too busy */
* since we don't want to wait for it to finish before doing so ourselves.
*/
bp = afs_BQueue(BOP_FETCH, avc, B_DONTWAIT, 0, acred,
- (afs_size_t) offset, (afs_size_t) 1, tdc);
+ (afs_size_t) offset, (afs_size_t) 1, tdc,
+ (void *)0, (void *)0);
if (!bp) {
/* Bkg table full; just abort non-important prefetching to avoid deadlocks */
tdc->mflags &= ~DFFetchReq;
tdc->mflags |= DFFetchReq;
bp = afs_BQueue(BOP_FETCH, avc, B_DONTWAIT, 0, acred,
(afs_size_t) filePos, (afs_size_t) 0,
- tdc);
+ tdc, (void *)0, (void *)0);
if (!bp) {
/* Bkg table full; retry deadlocks */
tdc->mflags &= ~DFFetchReq;
* Also, note that we don't lock it any more... */
tb = afs_BQueue(BOP_STORE, avc, 0, 1, acred,
(afs_size_t) afs_cr_uid(acred), (afs_size_t) 0,
- (void *)0);
+ (void *)0, (void *)0, (void *)0);
/* sleep waiting for the store to start, then retrieve error code */
while ((tb->flags & BUVALID) == 0) {
tb->flags |= BUWAIT;
AFS_GLOCK();
while(bcnt < 20) {
breq = afs_BQueue(BOP_FETCH_NOCACHE, avc, B_DONTWAIT, 0, acred, 1, 1,
- bparms);
+ bparms, (void *)0, (void *)0);
if(breq != 0) {
code = 0;
break;
struct brequest *
afs_BQueue(register short aopcode, register struct vcache *avc,
afs_int32 dontwait, afs_int32 ause, afs_ucred_t *acred,
- afs_size_t asparm0, afs_size_t asparm1, void *apparm0)
+ afs_size_t asparm0, afs_size_t asparm1, void *apparm0,
+ void *apparm1, void *apparm2)
{
register int i;
register struct brequest *tb;
tb->size_parm[0] = asparm0;
tb->size_parm[1] = asparm1;
tb->ptr_parm[0] = apparm0;
+ tb->ptr_parm[1] = apparm1;
+ tb->ptr_parm[2] = apparm2;
tb->flags = 0;
tb->code = 0;
tb->ts = afs_brs_count++;
int afs_nbrs = 0;
+static_inline void
+afs_BackgroundDaemon_once(void)
+{
+ LOCK_INIT(&afs_xbrs, "afs_xbrs");
+ memset(afs_brs, 0, sizeof(afs_brs));
+ brsInit = 1;
+#if defined (AFS_SGI_ENV) && defined(AFS_SGI_SHORTSTACK)
+ /*
+ * steal the first daemon for doing delayed DSlot flushing
+ * (see afs_GetDownDSlot)
+ */
+ AFS_GUNLOCK();
+ afs_sgidaemon();
+ exit(CLD_EXITED, 0);
+#endif
+}
+
+static_inline void
+brequest_release(struct brequest *tb)
+{
+ if (tb->vc) {
+ AFS_RELE(AFSTOV(tb->vc)); /* MUST call vnode layer or could lose vnodes */
+ tb->vc = NULL;
+ }
+ if (tb->cred) {
+ crfree(tb->cred);
+ tb->cred = (afs_ucred_t *)0;
+ }
+ tb->code = 0;
+ afs_BRelease(tb); /* this grabs and releases afs_xbrs lock */
+}
+
void
afs_BackgroundDaemon(void)
{
AFS_STATCNT(afs_BackgroundDaemon);
/* initialize subsystem */
- if (brsInit == 0) {
- LOCK_INIT(&afs_xbrs, "afs_xbrs");
- memset(afs_brs, 0, sizeof(afs_brs));
- brsInit = 1;
-#if defined (AFS_SGI_ENV) && defined(AFS_SGI_SHORTSTACK)
- /*
- * steal the first daemon for doing delayed DSlot flushing
- * (see afs_GetDownDSlot)
- */
- AFS_GUNLOCK();
- afs_sgidaemon();
- return;
-#endif
- }
+ if (brsInit == 0)
+ /* Irix with "short stack" exits */
+ afs_BackgroundDaemon_once();
+
afs_nbrs++;
ObtainWriteLock(&afs_xbrs, 302);
BPath(tb);
else
panic("background bop");
- if (tb->vc) {
- AFS_RELE(AFSTOV(tb->vc)); /* MUST call vnode layer or could lose vnodes */
- tb->vc = NULL;
- }
- if (tb->cred) {
- crfree(tb->cred);
- tb->cred = (afs_ucred_t *)0;
- }
- afs_BRelease(tb); /* this grabs and releases afs_xbrs lock */
+ brequest_release(tb);
ObtainWriteLock(&afs_xbrs, 305);
}
if (!foundAny) {
return EWOULDBLOCK; /* pretty close */
}
afs_BQueue(BOP_PATH, (struct vcache *)0, 0, 0, acred, (afs_size_t) 0,
- (afs_size_t) 0, tp);
+ (afs_size_t) 0, tp, (void *)0, (void *)0);
return 0;
}
afs_int32 dontwait, afs_int32 ause,
afs_ucred_t *acred,
afs_size_t asparm0, afs_size_t asparm1,
- void *apparm0);
+ void *apparm0, void *apparm1,
+ void *apparm2);
extern void afs_SetCheckServerNATmode(int isnat);
extern void afs_CheckServerDaemon(void);
extern int afs_CheckRootVolume(void);