From 23fa416581568c2c58c6f2739139b9486ba8fa10 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 3 Jan 2013 14:11:31 -0500 Subject: [PATCH] Windows: Update Bulk I/O Descriptor Update the cm_bulkIO_t and associated functions such that the 'reserved' field is no longer a boolean indicated whether or not buffers have been reserved but instead becomes a count of the number of buffers that have been reserved. buf_TryReserveBuffers is modified to return an afs_uint64 count of the number of buffers reserved instead of a boolean. cm_SetupStoreBIOD, cm_SetupFetchBIOD, and cm_ReleaseBIOD altered to store the reserved buffer count and use it when freeing the BIOD. Prior to this change it was not possible to reserve a count other than the number of buffers it takes to store one chunkSize of data. Change-Id: I78d71c77ffddd7f34278314fcfe9ee568b835a8b Reviewed-on: http://gerrit.openafs.org/8951 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsd/cm_buf.c | 11 ++++++----- src/WINNT/afsd/cm_buf.h | 2 +- src/WINNT/afsd/cm_dcache.c | 7 +++---- src/WINNT/afsd/cm_dcache.h | 13 ++++++++----- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/WINNT/afsd/cm_buf.c b/src/WINNT/afsd/cm_buf.c index cc7072be2..bea66082d 100644 --- a/src/WINNT/afsd/cm_buf.c +++ b/src/WINNT/afsd/cm_buf.c @@ -1877,20 +1877,21 @@ void buf_ReserveBuffers(afs_uint64 nbuffers) lock_ReleaseWrite(&buf_globalLock); } -int buf_TryReserveBuffers(afs_uint64 nbuffers) +afs_uint64 +buf_TryReserveBuffers(afs_uint64 nbuffers) { - int code; + afs_uint64 reserved; lock_ObtainWrite(&buf_globalLock); if (cm_data.buf_reservedBufs + nbuffers > cm_data.buf_maxReservedBufs) { - code = 0; + reserved = 0; } else { cm_data.buf_reservedBufs += nbuffers; - code = 1; + reserved = nbuffers; } lock_ReleaseWrite(&buf_globalLock); - return code; + return reserved; } /* called without global lock held, releases reservation held by diff --git a/src/WINNT/afsd/cm_buf.h b/src/WINNT/afsd/cm_buf.h index 09801b5a1..02dcbe710 100644 --- a/src/WINNT/afsd/cm_buf.h +++ b/src/WINNT/afsd/cm_buf.h @@ -189,7 +189,7 @@ extern long buf_CleanAndReset(void); extern void buf_ReserveBuffers(afs_uint64); -extern int buf_TryReserveBuffers(afs_uint64); +extern afs_uint64 buf_TryReserveBuffers(afs_uint64); extern void buf_UnreserveBuffers(afs_uint64); diff --git a/src/WINNT/afsd/cm_dcache.c b/src/WINNT/afsd/cm_dcache.c index a3ad77a59..8eaef8214 100644 --- a/src/WINNT/afsd/cm_dcache.c +++ b/src/WINNT/afsd/cm_dcache.c @@ -1026,7 +1026,8 @@ long cm_SetupStoreBIOD(cm_scache_t *scp, osi_hyper_t *inOffsetp, long inSize, /* reserve a chunk's worth of buffers */ lock_ReleaseWrite(&scp->rw); - buf_ReserveBuffers(cm_chunkSize / cm_data.buf_blockSize); + biop->reserved = (cm_chunkSize / cm_data.buf_blockSize); + buf_ReserveBuffers(biop->reserved); lock_ObtainWrite(&scp->rw); bufp = NULL; @@ -1074,8 +1075,6 @@ long cm_SetupStoreBIOD(cm_scache_t *scp, osi_hyper_t *inOffsetp, long inSize, } } - biop->reserved = 1; - /* if we get here, if bufp is null, we didn't find any dirty buffers * that weren't already being stored back, so we just quit now. */ @@ -1485,7 +1484,7 @@ void cm_ReleaseBIOD(cm_bulkIO_t *biop, int isStore, long code, int scp_locked) /* Give back reserved buffers */ if (biop->reserved) - buf_UnreserveBuffers(cm_chunkSize / cm_data.buf_blockSize); + buf_UnreserveBuffers(biop->reserved); if (isStore) flags = CM_SCACHESYNC_STOREDATA; diff --git a/src/WINNT/afsd/cm_dcache.h b/src/WINNT/afsd/cm_dcache.h index 5fea18374..8cf0ec408 100644 --- a/src/WINNT/afsd/cm_dcache.h +++ b/src/WINNT/afsd/cm_dcache.h @@ -16,11 +16,14 @@ typedef struct cm_bulkIO { struct cm_user *userp; /* the user of the request */ 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? */ - - /* all of these buffers are held */ - osi_queueData_t *bufListp; /* list of buffers involved in I/O */ + afs_uint32 length; /* # of bytes to be transferred */ + afs_uint64 reserved; /* # of reserved buffers? */ + + /* + * all of these buffers are held. + * the lowest offset buffer is at the end of the list. + */ + osi_queueData_t *bufListp; /* list of buffers involved in I/O */ osi_queueData_t *bufListEndp; /* list of buffers involved in I/O */ } cm_bulkIO_t; -- 2.39.5