From 00d56c519be35f690e4cf26eddc8143304d38bdd Mon Sep 17 00:00:00 2001 From: Derrick Brashear Date: Wed, 24 Feb 2010 00:57:23 -0500 Subject: [PATCH] background daemon genericization previously only "just enough" of the background daemon request object was exposed. expose the rest of the generic pointers Change-Id: Ifcadf53675598bc102208700ff34a768474174ec Reviewed-on: http://gerrit.openafs.org/1384 Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- src/afs/IRIX/osi_vnodeops.c | 3 +- src/afs/SOLARIS/osi_vnodeops.c | 3 +- src/afs/VNOPS/afs_vnop_open.c | 3 +- src/afs/VNOPS/afs_vnop_read.c | 7 ++-- src/afs/VNOPS/afs_vnop_write.c | 2 +- src/afs/afs_bypasscache.c | 2 +- src/afs/afs_daemons.c | 65 +++++++++++++++++++++------------- src/afs/afs_pioctl.c | 2 +- src/afs/afs_prototypes.h | 3 +- 9 files changed, 56 insertions(+), 34 deletions(-) diff --git a/src/afs/IRIX/osi_vnodeops.c b/src/afs/IRIX/osi_vnodeops.c index 987cfc9fb..f90fd28f6 100644 --- a/src/afs/IRIX/osi_vnodeops.c +++ b/src/afs/IRIX/osi_vnodeops.c @@ -976,7 +976,8 @@ OSI_VC_DECL(avc); /* 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; diff --git a/src/afs/SOLARIS/osi_vnodeops.c b/src/afs/SOLARIS/osi_vnodeops.c index 90ee351f9..f02d19f12 100644 --- a/src/afs/SOLARIS/osi_vnodeops.c +++ b/src/afs/SOLARIS/osi_vnodeops.c @@ -245,7 +245,8 @@ afs_GetOnePage(struct vnode *vp, u_int off, u_int alen, u_int *protp, 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; diff --git a/src/afs/VNOPS/afs_vnop_open.c b/src/afs/VNOPS/afs_vnop_open.c index 1d5dd6347..1682f2f46 100644 --- a/src/afs/VNOPS/afs_vnop_open.c +++ b/src/afs/VNOPS/afs_vnop_open.c @@ -186,7 +186,8 @@ afs_open(struct vcache **avcp, afs_int32 aflags, afs_ucred_t *acred) 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; } diff --git a/src/afs/VNOPS/afs_vnop_read.c b/src/afs/VNOPS/afs_vnop_read.c index 6ca652b60..f2a9ed615 100644 --- a/src/afs/VNOPS/afs_vnop_read.c +++ b/src/afs/VNOPS/afs_vnop_read.c @@ -196,7 +196,7 @@ afs_MemRead(register struct vcache *avc, struct uio *auio, 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 */ @@ -454,7 +454,8 @@ afs_PrefetchChunk(struct vcache *avc, struct dcache *adc, * 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; @@ -652,7 +653,7 @@ afs_UFSRead(register struct vcache *avc, struct uio *auio, 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; diff --git a/src/afs/VNOPS/afs_vnop_write.c b/src/afs/VNOPS/afs_vnop_write.c index 33437d056..3bb53e280 100644 --- a/src/afs/VNOPS/afs_vnop_write.c +++ b/src/afs/VNOPS/afs_vnop_write.c @@ -746,7 +746,7 @@ afs_close(OSI_VC_DECL(avc), afs_int32 aflags, afs_ucred_t *acred) * 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; diff --git a/src/afs/afs_bypasscache.c b/src/afs/afs_bypasscache.c index dc1f3bd0c..9decac003 100644 --- a/src/afs/afs_bypasscache.c +++ b/src/afs/afs_bypasscache.c @@ -501,7 +501,7 @@ afs_ReadNoCache(register struct vcache *avc, 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; diff --git a/src/afs/afs_daemons.c b/src/afs/afs_daemons.c index 65dcd24a6..826011f1b 100644 --- a/src/afs/afs_daemons.c +++ b/src/afs/afs_daemons.c @@ -634,7 +634,8 @@ afs_BBusy(void) 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; @@ -660,6 +661,8 @@ afs_BQueue(register short aopcode, register struct vcache *avc, 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++; @@ -960,6 +963,38 @@ afs_BioDaemon(afs_int32 nbiods) 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) { @@ -968,20 +1003,10 @@ 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); @@ -1029,15 +1054,7 @@ afs_BackgroundDaemon(void) 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) { diff --git a/src/afs/afs_pioctl.c b/src/afs/afs_pioctl.c index 1a387936d..5b140ef73 100644 --- a/src/afs/afs_pioctl.c +++ b/src/afs/afs_pioctl.c @@ -2625,7 +2625,7 @@ Prefetch(uparmtype apath, struct afs_ioctl *adata, int afollow, 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; } diff --git a/src/afs/afs_prototypes.h b/src/afs/afs_prototypes.h index 40e9ec854..e43f895bd 100644 --- a/src/afs/afs_prototypes.h +++ b/src/afs/afs_prototypes.h @@ -210,7 +210,8 @@ extern struct brequest *afs_BQueue(register short aopcode, 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); -- 2.39.5