background daemon genericization
authorDerrick Brashear <shadow@dementia.org>
Wed, 24 Feb 2010 05:57:23 +0000 (00:57 -0500)
committerDerrick Brashear <shadow@dementia.org>
Fri, 26 Feb 2010 04:58:40 +0000 (20:58 -0800)
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 <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/afs/IRIX/osi_vnodeops.c
src/afs/SOLARIS/osi_vnodeops.c
src/afs/VNOPS/afs_vnop_open.c
src/afs/VNOPS/afs_vnop_read.c
src/afs/VNOPS/afs_vnop_write.c
src/afs/afs_bypasscache.c
src/afs/afs_daemons.c
src/afs/afs_pioctl.c
src/afs/afs_prototypes.h

index 987cfc9..f90fd28 100644 (file)
@@ -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;
index 90ee351..f02d19f 100644 (file)
@@ -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;
index 1d5dd63..1682f2f 100644 (file)
@@ -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;
            }
index 6ca652b..f2a9ed6 100644 (file)
@@ -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;
index 33437d0..3bb53e2 100644 (file)
@@ -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;
index dc1f3bd..9decac0 100644 (file)
@@ -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;
index 65dcd24..826011f 100644 (file)
@@ -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) {
index 1a38793..5b140ef 100644 (file)
@@ -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;
 }
 
index 40e9ec8..e43f895 100644 (file)
@@ -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);