windows-afsd-btree-20090313
authorJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 14 Mar 2009 04:45:22 +0000 (04:45 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 14 Mar 2009 04:45:22 +0000 (04:45 +0000)
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.

src/WINNT/afsd/cm_btree.c
src/WINNT/afsd/cm_btree.h

index 766997e..9e5777b 100644 (file)
@@ -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];
index f5c897d..5c167f1 100644 (file)
@@ -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);