]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
windows: pass cm_req_t through background ops
authorJeffrey Altman <jaltman@your-file-system.com>
Sat, 3 Sep 2011 23:14:11 +0000 (19:14 -0400)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Tue, 15 Nov 2011 13:48:27 +0000 (05:48 -0800)
add cm_req_t object to background daemon operations in order to
permit request source to be propagated to the background daemon.

pass a cm_req_t into buf_SetDirty().

Reviewed-on: http://gerrit.openafs.org/5348
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>
Tested-by: Jeffrey Altman <jaltman@openafs.org>
(cherry picked from commit 722843e2df533e8fcf245f2a3b10ef686992deb2)

Change-Id: I2fbc78cf765c534fc6fc673695634fcf946dca0b
Reviewed-on: http://gerrit.openafs.org/6026
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@secure-endpoints.com>
Tested-by: Jeffrey Altman <jaltman@secure-endpoints.com>
src/WINNT/afsd/cm_buf.c
src/WINNT/afsd/cm_buf.h
src/WINNT/afsd/cm_daemon.c
src/WINNT/afsd/cm_daemon.h
src/WINNT/afsd/cm_dcache.c
src/WINNT/afsd/cm_dcache.h
src/WINNT/afsd/rawops.c
src/WINNT/afsd/smb.c
src/WINNT/afsd/smb3.c

index 04ff03ac067201f62211b400f700770f5fa96cab..0dc0f4b3bdc29b623e0394c94f2e7c815970d166 100644 (file)
@@ -1342,7 +1342,7 @@ void buf_CleanWait(cm_scache_t * scp, cm_buf_t *bp, afs_uint32 locked)
  *
  * The buffer must be locked before calling this routine.
  */
-void buf_SetDirty(cm_buf_t *bp, afs_uint32 offset, afs_uint32 length, cm_user_t *userp)
+void buf_SetDirty(cm_buf_t *bp, cm_req_t *reqp, afs_uint32 offset, afs_uint32 length, cm_user_t *userp)
 {
     osi_assertx(bp->magic == CM_BUF_MAGIC, "invalid cm_buf_t magic");
     osi_assertx(bp->refCount > 0, "cm_buf_t refcount 0");
index 5d295fe1be2565ed4fc44a503b5593ed2e9f80b1..8503dbd39fa60a188f77e4803f54a7166b8859e9 100644 (file)
@@ -179,7 +179,7 @@ extern afs_uint32 buf_CleanAsync(cm_scache_t *, cm_buf_t *, cm_req_t *, afs_uint
 
 extern void buf_CleanWait(cm_scache_t *, cm_buf_t *, afs_uint32 locked);
 
-extern void buf_SetDirty(cm_buf_t *, afs_uint32 offset, afs_uint32 length, cm_user_t *);
+extern void buf_SetDirty(cm_buf_t *, cm_req_t *, afs_uint32 offset, afs_uint32 length, cm_user_t *);
 
 extern long buf_CleanAndReset(void);
 
index f5f73e48cac0ffb21d309a30279201f3bcdbe806..12ac24f640c518bf8fcc2ef8b4ab31a3c0a14b60 100644 (file)
@@ -139,7 +139,7 @@ void cm_BkgDaemon(void * parm)
 #ifdef DEBUG_REFCOUNT
             osi_Log2(afsd_logp,"cm_BkgDaemon (before) scp 0x%x ref %d",rp->scp, rp->scp->refCount);
 #endif
-            code = (*rp->procp)(rp->scp, rp->p1, rp->p2, rp->p3, rp->p4, rp->userp);
+            code = (*rp->procp)(rp->scp, rp->p1, rp->p2, rp->p3, rp->p4, rp->userp, &rp->req);
 #ifdef DEBUG_REFCOUNT
             osi_Log2(afsd_logp,"cm_BkgDaemon (after) scp 0x%x ref %d",rp->scp, rp->scp->refCount);
 #endif
@@ -186,7 +186,7 @@ void cm_BkgDaemon(void * parm)
 }
 
 void cm_QueueBKGRequest(cm_scache_t *scp, cm_bkgProc_t *procp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4,
-       cm_user_t *userp)
+       cm_user_t *userp, cm_req_t *reqp)
 {
     cm_bkgRequest_t *rp;
 
@@ -202,6 +202,7 @@ void cm_QueueBKGRequest(cm_scache_t *scp, cm_bkgProc_t *procp, afs_uint32 p1, af
     rp->p2 = p2;
     rp->p3 = p3;
     rp->p4 = p4;
+    rp->req = *reqp;
 
     lock_ObtainWrite(&cm_daemonLock);
     cm_bkgQueueCount++;
index 7d5a0232f873b3229890f5a93f511799763f11ce..087260191ad8b5435e42c14cebeb00fed596c5e4 100644 (file)
@@ -25,7 +25,7 @@ void cm_DaemonShutdown(void);
 void cm_InitDaemon(int nDaemons);
 
 typedef afs_int32 (cm_bkgProc_t)(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3,
-       afs_uint32 p4, struct cm_user *up);
+       afs_uint32 p4, struct cm_user *up, cm_req_t *reqp);
 
 typedef struct cm_bkgRequest {
        osi_queue_t q;
@@ -35,11 +35,12 @@ typedef struct cm_bkgRequest {
         afs_uint32 p2;
         afs_uint32 p3;
         afs_uint32 p4;
-        struct cm_user *userp;
+        cm_user_t *userp;
+        cm_req_t req;
 } cm_bkgRequest_t;
 
 extern void cm_QueueBKGRequest(cm_scache_t *scp, cm_bkgProc_t *procp, afs_uint32 p1,
-       afs_uint32 p2, afs_uint32 p3, afs_uint32 p4, cm_user_t *userp);
+       afs_uint32 p2, afs_uint32 p3, afs_uint32 p4, cm_user_t *userp, cm_req_t *reqp);
 
 #define CM_MAX_DAEMONS 64
 
index 532b8faf91ec785e1bd9a7594b52c13641004f0e..d5db0bb172a969a8f9df9faafbddcb530a252bc7 100644 (file)
@@ -722,20 +722,18 @@ cm_CheckFetchRange(cm_scache_t *scp, osi_hyper_t *startBasep, osi_hyper_t *lengt
 
 afs_int32
 cm_BkgStore(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4,
-           cm_user_t *userp)
+           cm_user_t *userp, cm_req_t *reqp)
 {
     osi_hyper_t toffset;
     long length;
-    cm_req_t req;
     long code = 0;
 
     if (scp->flags & CM_SCACHEFLAG_DELETED) {
        osi_Log4(afsd_logp, "Skipping BKG store - Deleted scp 0x%p, offset 0x%x:%08x, length 0x%x", scp, p2, p1, p3);
     } else {
-       cm_InitReq(&req);
-
        /* Retries will be performed by the BkgDaemon thread if appropriate */
-       req.flags |= CM_REQ_NORETRY;
+        afs_uint32 req_flags = reqp->flags;
+       reqp->flags |= CM_REQ_NORETRY;
 
        toffset.LowPart = p1;
        toffset.HighPart = p2;
@@ -743,9 +741,11 @@ cm_BkgStore(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_u
 
        osi_Log4(afsd_logp, "Starting BKG store scp 0x%p, offset 0x%x:%08x, length 0x%x", scp, p2, p1, p3);
 
-       code = cm_BufWrite(scp, &toffset, length, /* flags */ 0, userp, &req);
+       code = cm_BufWrite(scp, &toffset, length, /* flags */ 0, userp, reqp);
 
        osi_Log4(afsd_logp, "Finished BKG store scp 0x%p, offset 0x%x:%08x, code 0x%x", scp, p2, p1, code);
+
+        reqp->flags = req_flags;
     }
 
     /*
@@ -767,6 +767,7 @@ cm_BkgStore(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_u
         cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_ASYNCSTORE);
         lock_ReleaseWrite(&scp->rw);
     }
+
     return code;
 }
 
@@ -789,7 +790,7 @@ void cm_ClearPrefetchFlag(long code, cm_scache_t *scp, osi_hyper_t *base, osi_hy
  * because there is no harm done.  */
 afs_int32
 cm_BkgPrefetch(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4,
-              cm_user_t *userp)
+              cm_user_t *userp, cm_req_t *reqp)
 {
     osi_hyper_t length;
     osi_hyper_t base;
@@ -800,12 +801,11 @@ cm_BkgPrefetch(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, af
     afs_int32 code;
     int rxheld = 0;
     cm_buf_t *bp = NULL;
-    cm_req_t req;
-
-    cm_InitReq(&req);
+    afs_uint32 req_flags;
 
     /* Retries will be performed by the BkgDaemon thread if appropriate */
-    req.flags |= CM_REQ_NORETRY;
+    req_flags = reqp->flags;
+    reqp->flags |= CM_REQ_NORETRY;
 
     fetched.LowPart = 0;
     fetched.HighPart = 0;
@@ -829,7 +829,7 @@ cm_BkgPrefetch(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, af
             rxheld = 0;
         }
 
-        code = buf_Get(scp, &offset, &req, &bp);
+        code = buf_Get(scp, &offset, reqp, &bp);
         if (code)
             break;
 
@@ -850,7 +850,7 @@ cm_BkgPrefetch(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, af
             rxheld = 1;
         }
 
-        code = cm_GetBuffer(scp, bp, NULL, userp, &req);
+        code = cm_GetBuffer(scp, bp, NULL, userp, reqp);
         if (code == 0)
             fetched = LargeIntegerAdd(fetched, tblocksize);
         buf_Release(bp);
@@ -885,6 +885,8 @@ cm_BkgPrefetch(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, af
 
     osi_Log4(afsd_logp, "Ending BKG prefetch scp 0x%p code 0x%x fetched 0x%x:%x",
              scp, code, fetched.HighPart, fetched.LowPart);
+
+    reqp->flags = req_flags;
     return code;
 }
 
@@ -973,7 +975,7 @@ void cm_ConsiderPrefetch(cm_scache_t *scp, osi_hyper_t *offsetp, afs_uint32 coun
     cm_QueueBKGRequest(scp, cm_BkgPrefetch,
                        realBase.LowPart, realBase.HighPart,
                        readLength.LowPart, readLength.HighPart,
-                       userp);
+                       userp, reqp);
 }
 
 /* scp must be locked; temporarily unlocked during processing.
@@ -1242,6 +1244,7 @@ long cm_SetupFetchBIOD(cm_scache_t *scp, osi_hyper_t *offsetp,
     tblocksize = ConvertLongToLargeInteger(cm_data.buf_blockSize);
 
     biop->scp = scp;                   /* do not hold; held by caller */
+    biop->reqp = reqp;
     biop->offset = *offsetp;
     /* null out the list of buffers */
     biop->bufListp = biop->bufListEndp = NULL;
index 8537f796828c69127f1140d9d26aa6f463999fe2..be5b723cb02093f47e507b6f9c76540f4dae463e 100644 (file)
@@ -13,6 +13,7 @@
 /* bulk I/O descriptor */
 typedef struct cm_bulkIO {
     struct cm_scache *scp;             /* typically unheld vnode ptr */
+    struct cm_req *reqp;                /* the request ptr */
     osi_hyper_t offset;                        /* offset of buffers */
     long length;                       /* # of bytes to be transferred */
     int reserved;                      /* did we reserve multiple buffers? */
@@ -47,10 +48,10 @@ extern long cm_SetupStoreBIOD(cm_scache_t *scp, osi_hyper_t *inOffsetp,
        long inSize, cm_bulkIO_t *biop, cm_user_t *userp, cm_req_t *reqp);
 
 extern afs_int32 cm_BkgPrefetch(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4,
-       struct cm_user *userp);
+       struct cm_user *userp, cm_req_t *reqp);
 
 extern afs_int32 cm_BkgStore(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4,
-       struct cm_user *userp);
+       struct cm_user *userp, cm_req_t *reqp);
 
 extern void cm_ConsiderPrefetch(cm_scache_t *scp, osi_hyper_t *offsetp,
                                 afs_uint32 count,
index 905cf6671079401c9af659232eee49dd40a99c6c..dc054c87277c05e1f9ec6cbbab75ce614ac1020f 100644 (file)
@@ -322,7 +322,7 @@ long WriteData(cm_scache_t *scp, osi_hyper_t offset, long count, char *op,
 
         /* now copy the data */
        memcpy(bufferp->datap + bufIndex, op, nbytes);
-        buf_SetDirty(bufferp, bufIndex, nbytes, userp);
+        buf_SetDirty(bufferp, &req, bufIndex, nbytes, userp);
 
         /* adjust counters, pointers, etc. */
         op += nbytes;
@@ -346,7 +346,7 @@ long WriteData(cm_scache_t *scp, osi_hyper_t offset, long count, char *op,
         lock_ReleaseWrite(&scp->rw);
         if (code == 0)
             cm_QueueBKGRequest(scp, cm_BkgStore, writeBackOffset.LowPart,
-                               writeBackOffset.HighPart, cm_chunkSize, 0, userp);
+                               writeBackOffset.HighPart, cm_chunkSize, 0, userp, &req);
     }
 
     /* cm_SyncOpDone is called when cm_BkgStore completes */
index 2980ce156aa494b264f2510f963f83b48c70736d..90e806cd62b10a7651268127642f74dc9463b70a 100644 (file)
@@ -7456,7 +7456,7 @@ long smb_WriteData(smb_fid_t *fidp, osi_hyper_t *offsetp, afs_uint32 count, char
 
         /* now copy the data */
        memcpy(bufferp->datap + bufIndex, op, nbytes);
-        buf_SetDirty(bufferp, bufIndex, nbytes, userp);
+        buf_SetDirty(bufferp, &req, bufIndex, nbytes, userp);
 
         /* adjust counters, pointers, etc. */
         op += nbytes;
@@ -7506,7 +7506,7 @@ long smb_WriteData(smb_fid_t *fidp, osi_hyper_t *offsetp, afs_uint32 count, char
                 lock_ReleaseWrite(&scp->rw);
                 cm_QueueBKGRequest(scp, cm_BkgStore, writeBackOffset.LowPart,
                                     writeBackOffset.HighPart,
-                                    smb_AsyncStoreSize, 0, userp);
+                                    smb_AsyncStoreSize, 0, userp, &req);
                 /* cm_SyncOpDone is called at the completion of cm_BkgStore */
             }
         } else {
index 5cfb42603144bf11deaa581c38b726b1f006ae3a..53807638a0c0626b818e76a8b99d274861b08156 100644 (file)
@@ -8267,7 +8267,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp)
     if (prefetch)
         cm_QueueBKGRequest(scp, cm_BkgPrefetch, 0, 0,
                            scp->length.LowPart, scp->length.HighPart,
-                           userp);
+                           userp, &req);
 
 
     osi_Log2(smb_logp, "SMB NT CreateX opening fid %d path %S", fidp->fid,
@@ -9021,7 +9021,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out
     if (prefetch)
         cm_QueueBKGRequest(scp, cm_BkgPrefetch, 0, 0,
                            scp->length.LowPart, scp->length.HighPart,
-                           userp);
+                           userp, &req);
 
     osi_Log1(smb_logp, "SMB NTTranCreate opening fid %d", fidp->fid);