From: Jeffrey Altman Date: Sat, 14 Mar 2009 04:45:22 +0000 (+0000) Subject: windows-afsd-btree-20090313 X-Git-Tag: openafs-devel-1_5_61~502 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=15d4dd0f70925eaf2af333f2215235cb90637457 windows-afsd-btree-20090313 LICENSE MIT Change cm_BPlusDirEnumerate interface to include a 'FetchStatus' parameter. When set to 0, we do not fetch status for fids for which we do not already have status info. This avoids unnecessary recycling of cm_scache_t objects. --- diff --git a/src/WINNT/afsd/cm_btree.c b/src/WINNT/afsd/cm_btree.c index 766997e..9e5777b 100644 --- a/src/WINNT/afsd/cm_btree.c +++ b/src/WINNT/afsd/cm_btree.c @@ -2171,7 +2171,8 @@ cm_BPlusEnumAlloc(afs_uint32 entries) long cm_BPlusDirEnumerate(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp, - afs_uint32 locked, clientchar_t * maskp, cm_direnum_t **enumpp) + afs_uint32 locked, clientchar_t * maskp, + afs_uint32 fetchStatus, cm_direnum_t **enumpp) { afs_uint32 count = 0, slot, numentries; Nptr leafNode = NONODE, nextLeafNode; @@ -2295,6 +2296,7 @@ cm_BPlusDirEnumerate(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp, enump->dscp = scp; enump->userp = userp; enump->reqFlags = reqp->flags; + enump->fetchStatus = fetchStatus; done: if (!locked) @@ -2451,7 +2453,8 @@ cm_BPlusDirNextEnumEntry(cm_direnum_t *enump, cm_direnum_entry_t **entrypp) return CM_ERROR_INVAL; } - if (!(enump->entry[enump->next].flags & CM_DIRENUM_FLAG_GOT_STATUS)) + if (enump->fetchStatus && + !(enump->entry[enump->next].flags & CM_DIRENUM_FLAG_GOT_STATUS)) cm_BPlusDirEnumBulkStatNext(enump); *entrypp = &enump->entry[enump->next++]; @@ -2495,7 +2498,7 @@ cm_BPlusDirEnumTest(cm_scache_t * dscp, cm_user_t *userp, cm_req_t *reqp, afs_ui osi_Log0(afsd_logp, "cm_BPlusDirEnumTest start"); - for (code = cm_BPlusDirEnumerate(dscp, userp, reqp, locked, NULL, &enump); code == 0; ) { + for (code = cm_BPlusDirEnumerate(dscp, userp, reqp, locked, NULL, 1, &enump); code == 0; ) { code = cm_BPlusDirNextEnumEntry(enump, &entryp); if (code == 0 || code == CM_ERROR_STOPNOW) { char buffer[1024]; diff --git a/src/WINNT/afsd/cm_btree.h b/src/WINNT/afsd/cm_btree.h index f5c897d..5c167f1 100644 --- a/src/WINNT/afsd/cm_btree.h +++ b/src/WINNT/afsd/cm_btree.h @@ -167,11 +167,12 @@ typedef struct cm_direnum { afs_uint32 reqFlags; afs_uint32 count; afs_uint32 next; + afs_uint32 fetchStatus; cm_direnum_entry_t entry[1]; } cm_direnum_t; long cm_BPlusDirEnumerate(cm_scache_t *dscp, cm_user_t *userp, cm_req_t *reqp, - afs_uint32 locked, clientchar_t *maskp, cm_direnum_t **enumpp); + afs_uint32 locked, clientchar_t *maskp, afs_uint32 fetchStatus, cm_direnum_t **enumpp); long cm_BPlusDirNextEnumEntry(cm_direnum_t *enump, cm_direnum_entry_t **entrypp); long cm_BPlusDirFreeEnumeration(cm_direnum_t *enump); long cm_BPlusDirEnumTest(cm_scache_t * dscp, cm_user_t *userp, cm_req_t *reqp, afs_uint32 locked);