windows: pass cm_req_t through background ops

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().

Change-Id: I8f805c2860e33df37040ee3785f18358e1a9b762
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>
This commit is contained in:
Jeffrey Altman 2011-09-03 19:14:11 -04:00 committed by Jeffrey Altman
parent 1d6593e952
commit 722843e2df
9 changed files with 35 additions and 29 deletions

View File

@ -1345,7 +1345,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");

View 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);

View File

@ -144,7 +144,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
@ -192,7 +192,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;
@ -208,6 +208,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++;

View 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

View File

@ -726,20 +726,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;
@ -747,9 +745,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;
}
/*
@ -771,6 +771,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;
}
@ -793,7 +794,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;
@ -804,12 +805,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;
@ -833,7 +833,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;
@ -854,7 +854,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);
@ -889,6 +889,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;
}
@ -977,7 +979,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.
@ -1246,6 +1248,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;

View 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,

View File

@ -326,7 +326,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;
@ -350,7 +350,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 */

View File

@ -7459,7 +7459,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;
@ -7509,7 +7509,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 {

View File

@ -8270,7 +8270,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,
@ -9024,7 +9024,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);