]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/search.c
Sync with HEAD as of 14-March-2004
[openldap] / servers / slapd / back-bdb / search.c
index 76f0dbec4ba4afff7f0a40ad10e603523182ef48..b63b953e59dc48ed31245d82cdd05661759aa80e 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2000-2003 The OpenLDAP Foundation.
+ * Copyright 2000-2004 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -282,7 +282,7 @@ nextido:
                ei = NULL;
                rs->sr_err = bdb_cache_find_id(op, NULL, ido, &ei,
                        0, locker, &locka );
-               if (rs->sr_err != LDAP_SUCCESS) goto nextido;
+               if ( rs->sr_err != LDAP_SUCCESS ) goto nextido;
                e = ei->bei_e;
        }
        return rs->sr_err;
@@ -386,7 +386,8 @@ bdb_do_search( Operation *op, SlapReply *rs, Operation *sop,
        ID              lastid = NOID;
        AttributeName   *attrs;
 
-       Filter          contextcsnand, contextcsnle, cookief, csnfnot, csnfeq, csnfand, csnfge;
+       Filter contextcsnand, contextcsnle, cookief, csnfnot,
+               csnfeq, csnfand, csnfge;
        AttributeAssertion aa_ge, aa_eq, aa_le;
        int             entry_count = 0;
        struct berval *search_context_csn = NULL;
@@ -398,8 +399,6 @@ bdb_do_search( Operation *op, SlapReply *rs, Operation *sop,
        int             entry_sync_state = -1;
        AttributeName   null_attr;
        int             no_sync_state_change = 0;
-       struct slap_limits_set *limit = NULL;
-       int isroot = 0;
 
        u_int32_t       locker = 0;
        DB_LOCK         lock;
@@ -437,12 +436,14 @@ bdb_do_search( Operation *op, SlapReply *rs, Operation *sop,
        /* psearch needs to be registered before refresh begins */
        /* psearch and refresh transmission is serialized in send_ldap_ber() */
        if ( !IS_PSEARCH && sop->o_sync_mode & SLAP_SYNC_PERSIST ) {
-               ldap_pvt_thread_mutex_lock( &bdb->bi_pslist_mutex );
+               ldap_pvt_thread_rdwr_wlock( &bdb->bi_pslist_rwlock );
                LDAP_LIST_INSERT_HEAD( &bdb->bi_psearch_list, sop, o_ps_link );
-               ldap_pvt_thread_mutex_unlock( &bdb->bi_pslist_mutex );
+               ldap_pvt_thread_rdwr_wunlock( &bdb->bi_pslist_rwlock );
+
        } else if ( !IS_PSEARCH && sop->o_sync_mode & SLAP_SYNC_REFRESH_AND_PERSIST
-                               && sop->o_sync_slog_size >= 0 ) {
-               ldap_pvt_thread_mutex_lock( &bdb->bi_pslist_mutex );
+               && sop->o_sync_slog_size >= 0 )
+       {
+               ldap_pvt_thread_rdwr_wlock( &bdb->bi_pslist_rwlock );
                LDAP_LIST_FOREACH( ps_list, &bdb->bi_psearch_list, o_ps_link ) {
                        if ( ps_list->o_sync_slog_size >= 0 ) {
                                if ( ps_list->o_sync_state.sid == sop->o_sync_state.sid ) {
@@ -456,12 +457,13 @@ bdb_do_search( Operation *op, SlapReply *rs, Operation *sop,
                        if ( ps_list->o_sync_slog_omitcsn.bv_len != 0 ) {
                                mr = slap_schema.si_ad_entryCSN->ad_type->sat_ordering;
                                if ( sop->o_sync_state.ctxcsn &&
-                                        sop->o_sync_state.ctxcsn->bv_val != NULL ) {
-                                        value_match( &match, slap_schema.si_ad_entryCSN, mr,
-                                                               SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX,
-                                                               sop->o_sync_state.ctxcsn,
-                                                               &ps_list->o_sync_slog_omitcsn,
-                                                               &text );
+                                       sop->o_sync_state.ctxcsn->bv_val != NULL )
+                               {
+                                       value_match( &match, slap_schema.si_ad_entryCSN, mr,
+                                               SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX,
+                                               sop->o_sync_state.ctxcsn,
+                                               &ps_list->o_sync_slog_omitcsn,
+                                               &text );
                                } else {
                                        match = -1;
                                }
@@ -476,11 +478,12 @@ bdb_do_search( Operation *op, SlapReply *rs, Operation *sop,
                } else {
                        sop->o_sync_state.sid = -1;
                }
-               ldap_pvt_thread_mutex_unlock( &bdb->bi_pslist_mutex );
+               ldap_pvt_thread_rdwr_wunlock( &bdb->bi_pslist_rwlock );
        }
 
        null_attr.an_desc = NULL;
        null_attr.an_oc = NULL;
+       null_attr.an_oc_exclude = 0;
        null_attr.an_name.bv_len = 0;
        null_attr.an_name.bv_val = NULL;
 
@@ -493,6 +496,7 @@ bdb_do_search( Operation *op, SlapReply *rs, Operation *sop,
                attrs = uuid_attr;
                attrs[0].an_desc = NULL;
                attrs[0].an_oc = NULL;
+               attrs[0].an_oc_exclude = 0;
                attrs[0].an_name.bv_len = 0;
                attrs[0].an_name.bv_val = NULL;
        }
@@ -500,16 +504,17 @@ bdb_do_search( Operation *op, SlapReply *rs, Operation *sop,
        manageDSAit = get_manageDSAit( sop );
 
        /* Sync control overrides manageDSAit */
-
        if ( !IS_PSEARCH && sop->o_sync_mode & SLAP_SYNC_REFRESH ) {
-               if ( manageDSAit == SLAP_NO_CONTROL )
+               if ( manageDSAit == SLAP_NO_CONTROL ) {
                        manageDSAit = SLAP_CRITICAL_CONTROL;
+               }
        } else if ( IS_PSEARCH ) {
-               if ( manageDSAit == SLAP_NO_CONTROL )
+               if ( manageDSAit == SLAP_NO_CONTROL ) {
                        manageDSAit = SLAP_CRITICAL_CONTROL;
+               }
        }
 
-       rs->sr_err = LOCK_ID (bdb->bi_dbenv, &locker );
+       rs->sr_err = LOCK_IDbdb->bi_dbenv, &locker );
 
        switch(rs->sr_err) {
        case 0:
@@ -532,9 +537,11 @@ dn2entry_retry:
 
        switch(rs->sr_err) {
        case DB_NOTFOUND:
-               matched = ei->bei_e; break;
+               matched = ei->bei_e;
+               break;
        case 0:
-               e = ei->bei_e; break;
+               e = ei->bei_e;
+               break;
        case LDAP_BUSY:
                send_ldap_error( sop, rs, LDAP_BUSY, "ldap server busy" );
                LOCK_ID_FREE (bdb->bi_dbenv, locker );
@@ -596,7 +603,7 @@ dn2entry_retry:
                return rs->sr_err;
        }
 
-       if (!manageDSAit && e != &slap_entry_root && is_entry_referral( e ) ) {
+       if ( !manageDSAit && e != &slap_entry_root && is_entry_referral( e ) ) {
                /* entry is a referral, don't allow add */
                struct berval matched_dn;
                BerVarray erefs;
@@ -642,81 +649,8 @@ dn2entry_retry:
                return 1;
        }
 
-       /* if not root, get appropriate limits */
-       if ( be_isroot( op->o_bd, &sop->o_ndn ) ) {
-               isroot = 1;
-       } else {
-               ( void ) get_limits( op->o_bd, &sop->o_ndn, &limit );
-       }
-
-       /* The time/size limits come first because they require very little
-        * effort, so there's no chance the candidates are selected and then 
-        * the request is not honored only because of time/size constraints */
-
-       /* if no time limit requested, use soft limit (unless root!) */
-       if ( isroot ) {
-               if ( sop->oq_search.rs_tlimit == 0 ) {
-                       sop->oq_search.rs_tlimit = -1;  /* allow root to set no limit */
-               }
-
-               if ( sop->oq_search.rs_slimit == 0 ) {
-                       sop->oq_search.rs_slimit = -1;
-               }
-
-       } else {
-               /* if no limit is required, use soft limit */
-               if ( sop->oq_search.rs_tlimit <= 0 ) {
-                       sop->oq_search.rs_tlimit = limit->lms_t_soft;
-
-               /* if requested limit higher than hard limit, abort */
-               } else if ( sop->oq_search.rs_tlimit > limit->lms_t_hard ) {
-                       /* no hard limit means use soft instead */
-                       if ( limit->lms_t_hard == 0
-                                       && limit->lms_t_soft > -1
-                                       && sop->oq_search.rs_tlimit > limit->lms_t_soft ) {
-                               sop->oq_search.rs_tlimit = limit->lms_t_soft;
-
-                       /* positive hard limit means abort */
-                       } else if ( limit->lms_t_hard > 0 ) {
-                               rs->sr_err = LDAP_ADMINLIMIT_EXCEEDED;
-                               send_ldap_result( sop, rs );
-                               rs->sr_err = LDAP_SUCCESS;
-                               goto done;
-                       }
-               
-                       /* negative hard limit means no limit */
-               }
-               
-               /* if no limit is required, use soft limit */
-               if ( sop->oq_search.rs_slimit <= 0 ) {
-                       if ( get_pagedresults(sop) && limit->lms_s_pr != 0 ) {
-                               sop->oq_search.rs_slimit = limit->lms_s_pr;
-                       } else {
-                               sop->oq_search.rs_slimit = limit->lms_s_soft;
-                       }
-
-               /* if requested limit higher than hard limit, abort */
-               } else if ( sop->oq_search.rs_slimit > limit->lms_s_hard ) {
-                       /* no hard limit means use soft instead */
-                       if ( limit->lms_s_hard == 0
-                                       && limit->lms_s_soft > -1
-                                       && sop->oq_search.rs_slimit > limit->lms_s_soft ) {
-                               sop->oq_search.rs_slimit = limit->lms_s_soft;
-
-                       /* positive hard limit means abort */
-                       } else if ( limit->lms_s_hard > 0 ) {
-                               rs->sr_err = LDAP_ADMINLIMIT_EXCEEDED;
-                               send_ldap_result( sop, rs );
-                               rs->sr_err = LDAP_SUCCESS;      
-                               goto done;
-                       }
-                       
-                       /* negative hard limit means no limit */
-               }
-       }
-
        /* compute it anyway; root does not use it */
-       stoptime = op->o_time + sop->oq_search.rs_tlimit;
+       stoptime = op->o_time + sop->ors_tlimit;
 
        /* need normalized dn below */
        ber_dupbv( &realbase, &e->e_nname );
@@ -733,19 +667,26 @@ dn2entry_retry:
        }
        e = NULL;
 
-       rs->sr_err = bdb_get_commit_csn( sop, rs, &search_context_csn, locker, &ctxcsn_lock );
+       if ( !IS_PSEARCH ) {
+               rs->sr_err = bdb_get_commit_csn( sop, rs, &search_context_csn,
+                       locker, &ctxcsn_lock );
 
-       if ( rs->sr_err != LDAP_SUCCESS ) {
-               send_ldap_error( sop, rs, rs->sr_err, "error in csn management in search" );
-               goto done;
-       }
+               if ( rs->sr_err != LDAP_SUCCESS ) {
+                       send_ldap_error( sop, rs, rs->sr_err,
+                               "error in csn management in search" );
+                       goto done;
+               }
 
-       if ( sop->o_sync_mode != SLAP_SYNC_NONE && sop->o_sync_state.ctxcsn &&
-                sop->o_sync_state.ctxcsn->bv_val &&
-                ber_bvcmp( &sop->o_sync_state.ctxcsn[0], search_context_csn ) == 0 )
-       {
-               bdb_cache_entry_db_unlock( bdb->bi_dbenv, &ctxcsn_lock );
-               goto nochange;
+               if ( sop->o_sync_mode != SLAP_SYNC_NONE &&
+                       sop->o_sync_state.ctxcsn &&
+                       sop->o_sync_state.ctxcsn->bv_val &&
+                       ber_bvcmp( &sop->o_sync_state.ctxcsn[0], search_context_csn ) == 0 )
+               {
+                       bdb_cache_entry_db_unlock( bdb->bi_dbenv, &ctxcsn_lock );
+                       goto nochange;
+               }
+       } else {
+               search_context_csn = ber_dupbv( NULL, &op->o_sync_csn );        
        }
 
        /* select candidates */
@@ -755,10 +696,11 @@ dn2entry_retry:
        } else {
                BDB_IDL_ZERO( candidates );
                BDB_IDL_ZERO( scopes );
-               rs->sr_err = search_candidates( op, sop, rs, &base, locker, candidates, scopes );
+               rs->sr_err = search_candidates( op, sop, rs, &base,
+                       locker, candidates, scopes );
        }
 
-       if ( sop->o_sync_mode != SLAP_SYNC_NONE ) {
+       if ( !IS_PSEARCH && sop->o_sync_mode != SLAP_SYNC_NONE ) {
                bdb_cache_entry_db_unlock( bdb->bi_dbenv, &ctxcsn_lock );
        }
 
@@ -772,12 +714,11 @@ dn2entry_retry:
                                rs->sr_err = LDAP_SUCCESS;
                                goto done;
                        }
-               } else {
-                       if ( ps_e->e_id < BDB_IDL_RANGE_FIRST(candidates)
-                          || ps_e->e_id > BDB_IDL_RANGE_LAST(candidates)){
-                               rs->sr_err = LDAP_SUCCESS;
-                               goto done;
-                       }
+               } else if ( ps_e->e_id < BDB_IDL_RANGE_FIRST( candidates ) ||
+                       ps_e->e_id > BDB_IDL_RANGE_LAST( candidates ))
+               {
+                       rs->sr_err = LDAP_SUCCESS;
+                       goto done;
                }
                candidates[0] = 1;
                candidates[1] = ps_e->e_id;
@@ -792,27 +733,25 @@ dn2entry_retry:
                        0, 0, 0 );
 #endif
 
-               rs->sr_err = LDAP_SUCCESS;
-               rs->sr_entry = NULL;
-               send_ldap_result( sop, rs );
-               goto done;
+               goto nochange;
        }
 
        /* if not root and candidates exceed to-be-checked entries, abort */
-       if ( !isroot && limit->lms_s_unchecked != -1 ) {
-               if ( BDB_IDL_N(candidates) > (unsigned) limit->lms_s_unchecked ) {
-                       rs->sr_err = LDAP_ADMINLIMIT_EXCEEDED;
-                       send_ldap_result( sop, rs );
-                       rs->sr_err = LDAP_SUCCESS;
-                       goto done;
-               }
+       if ( sop->ors_limit     /* isroot == TRUE */
+                       && sop->ors_limit->lms_s_unchecked != -1
+                       && BDB_IDL_N(candidates) > (unsigned) sop->ors_limit->lms_s_unchecked )
+       {
+               rs->sr_err = LDAP_ADMINLIMIT_EXCEEDED;
+               send_ldap_result( sop, rs );
+               rs->sr_err = LDAP_SUCCESS;
+               goto done;
        }
 
-       if ( isroot || !limit->lms_s_pr_hide ) {
+       if ( sop->ors_limit == NULL     /* isroot == FALSE */
+                       || !sop->ors_limit->lms_s_pr_hide ) {
                tentries = BDB_IDL_N(candidates);
        }
 
-#ifdef LDAP_CONTROL_PAGEDRESULTS
        if ( get_pagedresults(sop) ) {
                if ( sop->o_pagedresults_state.ps_cookie == 0 ) {
                        id = 0;
@@ -825,7 +764,7 @@ dn2entry_retry:
                        }
                        for ( id = bdb_idl_first( candidates, &cursor );
                                id != NOID && id <= (ID)( sop->o_pagedresults_state.ps_cookie );
-                               id = bdb_idl_next( candidates, &cursor ) );
+                               id = bdb_idl_next( candidates, &cursor ) ) /* empty */;
                }
                if ( cursor == NOID ) {
 #ifdef NEW_LOGGING
@@ -844,11 +783,9 @@ dn2entry_retry:
                }
                goto loop_begin;
        }
-#endif
 
-       if ( (sop->o_sync_mode & SLAP_SYNC_REFRESH) || IS_PSEARCH )
-       {
-               int                             match;
+       if (( sop->o_sync_mode & SLAP_SYNC_REFRESH ) || IS_PSEARCH ) {
+               int match;
 
                cookief.f_choice = LDAP_FILTER_AND;
                cookief.f_and = &csnfnot;
@@ -895,7 +832,8 @@ dn2entry_retry:
 
                        mr = slap_schema.si_ad_entryCSN->ad_type->sat_ordering;
                        if ( sop->o_sync_state.ctxcsn &&
-                                sop->o_sync_state.ctxcsn->bv_val != NULL ) {
+                               sop->o_sync_state.ctxcsn->bv_val != NULL )
+                       {
                                value_match( &match, slap_schema.si_ad_entryCSN, mr,
                                                SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX,
                                                &sop->o_sync_state.ctxcsn[0], search_context_csn,
@@ -925,7 +863,6 @@ loop_begin:
                        goto done;
                }
 
-#ifdef LDAP_EXOP_X_CANCEL
                if ( sop->o_cancel ) {
                        assert( sop->o_cancel == SLAP_CANCEL_REQ );
                        rs->sr_err = LDAP_CANCELLED;
@@ -934,10 +871,9 @@ loop_begin:
                        rs->sr_err = LDAP_SUCCESS;
                        goto done;
                }
-#endif
 
                /* check time limit */
-               if ( sop->oq_search.rs_tlimit != -1 && slap_get_time() > stoptime ) {
+               if ( sop->ors_tlimit != -1 && slap_get_time() > stoptime ) {
                        rs->sr_err = LDAP_TIMELIMIT_EXCEEDED;
                        rs->sr_ref = rs->sr_v2ref;
                        send_ldap_result( sop, rs );
@@ -945,7 +881,6 @@ loop_begin:
                        goto done;
                }
 
-
                if (!IS_PSEARCH) {
 id2entry_retry:
                        /* get the entry with reader lock */
@@ -991,10 +926,13 @@ id2entry_retry:
                }
 
                rs->sr_entry = e;
+
 #ifdef BDB_SUBENTRIES
-               /* FIXME: send all but syncrepl
-               if ( !is_sync_protocol( sop ) ) {
-               */
+               /* FIXME: send all but syncrepl */
+#if 0
+               if ( !is_sync_protocol( sop ) )
+#endif
+               {
                        if ( is_entry_subentry( e ) ) {
                                if( sop->oq_search.rs_scope != LDAP_SCOPE_BASE ) {
                                        if(!get_subentries_visibility( sop )) {
@@ -1013,10 +951,8 @@ id2entry_retry:
                                /* only subentries are visible */
                                goto loop_continue;
                        }
-               /*
                }
-               */
-#endif
+#endif /* BDB_SUBENTRIES */
 
                /* Does this candidate actually satisfy the search scope?
                 *
@@ -1030,23 +966,23 @@ id2entry_retry:
                switch( sop->ors_scope ) {
                case LDAP_SCOPE_BASE:
                        /* This is always true, yes? */
-                       if ( id == base.e_id )
-                               scopeok = 1;
+                       if ( id == base.e_id ) scopeok = 1;
                        break;
+
                case LDAP_SCOPE_ONELEVEL:
-                       if ( ei->bei_parent->bei_id == base.e_id )
-                               scopeok = 1;
+                       if ( ei->bei_parent->bei_id == base.e_id ) scopeok = 1;
                        break;
-               case LDAP_SCOPE_SUBTREE:
-                       { EntryInfo *tmp;
-                       for ( tmp = BEI(e); tmp->bei_parent;
-                               tmp = tmp->bei_parent ) {
+
+               case LDAP_SCOPE_SUBTREE: {
+                       EntryInfo *tmp;
+                       for (tmp = BEI(e); tmp->bei_parent;
+                                tmp = tmp->bei_parent ) {
                                if ( tmp->bei_id == base.e_id ) {
                                        scopeok = 1;
                                        break;
                                }
-                       } }
-                       break;
+                       }
+                       break;
                }
 
 #ifdef BDB_ALIASES
@@ -1056,8 +992,8 @@ id2entry_retry:
                         * deref it when finding, return it.
                         */
                        if ( is_entry_alias(e) &&
-                               ((sop->ors_deref & LDAP_DEREF_FINDING)
-                                 || !bvmatch(&e->e_nname, &op->o_req_ndn)))
+                               ((sop->ors_deref & LDAP_DEREF_FINDING) ||
+                                       !bvmatch(&e->e_nname, &op->o_req_ndn)))
                        {
                                goto loop_continue;
                        }
@@ -1073,10 +1009,8 @@ id2entry_retry:
                                } else {
                                /* subtree, walk up the tree */
                                        EntryInfo *tmp = BEI(e);
-                                       for (;tmp->bei_parent;
-                                               tmp=tmp->bei_parent) {
-                                               x = bdb_idl_search(
-                                                       scopes, tmp->bei_id );
+                                       for (;tmp->bei_parent; tmp=tmp->bei_parent) {
+                                               x = bdb_idl_search( scopes, tmp->bei_id );
                                                if ( scopes[x] == tmp->bei_id ) {
                                                        scopeok = 1;
                                                        break;
@@ -1169,8 +1103,9 @@ id2entry_retry:
 
                if ( rs->sr_err == LDAP_COMPARE_TRUE ) {
                        /* check size limit */
-            if ( --sop->oq_search.rs_slimit == -1 &&
-                 sop->o_sync_slog_size == -1 ) {
+            if ( --sop->ors_slimit == -1 &&
+                               sop->o_sync_slog_size == -1 )
+                       {
                                if (!IS_PSEARCH) {
                                        bdb_cache_return_entry_r( bdb->bi_dbenv,
                                                &bdb->bi_cache, e, &lock );
@@ -1184,7 +1119,6 @@ id2entry_retry:
                                goto done;
                        }
 
-#ifdef LDAP_CONTROL_PAGEDRESULTS
                        if ( get_pagedresults(sop) ) {
                                if ( rs->sr_nentries >= sop->o_pagedresults_size ) {
                                        send_pagerequest_response( sop, rs,
@@ -1193,17 +1127,11 @@ id2entry_retry:
                                }
                                lastid = id;
                        }
-#endif
 
                        if (e) {
                                /* safe default */
                                int result = -1;
                                
-#if 0  /* noop is masked SLAP_CTRL_UPDATE */
-                               if( op->o_noop ) {
-                                       result = 0;
-                               } else
-#endif
                                if (IS_PSEARCH) {
                                        int premodify_found = 0;
                                        int entry_sync_state;
@@ -1410,7 +1338,7 @@ nochange:
                                } else {
                                        if ( !no_sync_state_change ) {
                                                int slog_found = 0;
-                                               ldap_pvt_thread_mutex_lock( &bdb->bi_pslist_mutex );
+                                               ldap_pvt_thread_rdwr_rlock( &bdb->bi_pslist_rwlock );
                                                LDAP_LIST_FOREACH( ps_list, &bdb->bi_psearch_list, o_ps_link ) {
                                                        if ( ps_list->o_sync_slog_size > 0 ) {
                                                                if ( ps_list->o_sync_state.sid == sop->o_sync_state.sid ) {
@@ -1426,7 +1354,7 @@ nochange:
                                                        rs->sr_ctrls = NULL;
                                                        slap_send_session_log( op, ps_list, rs );
                                                }
-                                               ldap_pvt_thread_mutex_unlock( &bdb->bi_pslist_mutex );
+                                               ldap_pvt_thread_rdwr_runlock( &bdb->bi_pslist_rwlock );
                                        }
                                        rs->sr_err = LDAP_SUCCESS;
                                        rs->sr_rspoid = LDAP_SYNC_INFO;
@@ -1452,7 +1380,7 @@ nochange:
                                } else {
                                        if ( !no_sync_state_change ) {
                                                int slog_found = 0;
-                                               ldap_pvt_thread_mutex_lock( &bdb->bi_pslist_mutex );
+                                               ldap_pvt_thread_rdwr_rlock( &bdb->bi_pslist_rwlock );
                                                LDAP_LIST_FOREACH( ps_list, &bdb->bi_psearch_list,
                                                                o_ps_link ) {
                                                        if ( ps_list->o_sync_slog_size > 0 ) {
@@ -1467,7 +1395,7 @@ nochange:
                                                if ( slog_found ) {
                                                        slap_send_session_log( op, ps_list, rs );
                                                }
-                                               ldap_pvt_thread_mutex_unlock( &bdb->bi_pslist_mutex );
+                                               ldap_pvt_thread_rdwr_runlock( &bdb->bi_pslist_rwlock );
                                        }
                                        slap_build_sync_done_ctrl( sop, rs, ctrls,
                                                num_ctrls++, 1, &cookie, LDAP_SYNC_REFRESH_DELETES );
@@ -1547,6 +1475,8 @@ static int oc_filter(
 {
        int rc = 0;
 
+       assert( f );
+
        if( cur > *max ) *max = cur;
 
        switch(f->f_choice) {
@@ -1575,9 +1505,7 @@ static void search_stack_free( void *key, void *data )
        ber_memfree_x(data, NULL);
 }
 
-static void *search_stack(
-       Operation *op
-)
+static void *search_stack( Operation *op )
 {
        struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
        void *ret = NULL;
@@ -1735,7 +1663,6 @@ static int search_candidates(
        return rc;
 }
 
-#ifdef LDAP_CONTROL_PAGEDRESULTS
 static void
 send_pagerequest_response( 
        Operation       *op,
@@ -1790,4 +1717,3 @@ send_pagerequest_response(
 done:
        (void) ber_free_buf( ber );
 }                      
-#endif