From c91704d811a73c700500b6f46640445c6328fe14 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Thu, 1 May 2008 12:49:35 +0000 Subject: [PATCH] Use o_extra instead of o_private --- servers/slapd/back-bdb/add.c | 17 ++++++++++------- servers/slapd/back-bdb/back-bdb.h | 2 +- servers/slapd/back-bdb/delete.c | 14 +++++++++----- servers/slapd/back-bdb/id2entry.c | 25 +++++++++++++++++-------- servers/slapd/back-bdb/modify.c | 14 +++++++++----- servers/slapd/back-bdb/modrdn.c | 14 +++++++++----- servers/slapd/back-bdb/search.c | 7 ++++++- 7 files changed, 61 insertions(+), 32 deletions(-) diff --git a/servers/slapd/back-bdb/add.c b/servers/slapd/back-bdb/add.c index b10f7d239e..3405756970 100644 --- a/servers/slapd/back-bdb/add.c +++ b/servers/slapd/back-bdb/add.c @@ -93,7 +93,6 @@ txnReturn: ctrls[num_ctrls] = 0; - /* check entry's schema */ rs->sr_err = entry_schema_check( op, op->oq_add.rs_e, NULL, get_relax(op), 1, &rs->sr_text, textbuf, textlen ); @@ -130,7 +129,8 @@ retry: /* transaction retry */ } rs->sr_err = TXN_ABORT( ltid ); ltid = NULL; - op->o_private = NULL; + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); + opinfo.boi_oe.oe_key = NULL; op->o_do_not_cache = opinfo.boi_acl_cache; if( rs->sr_err != 0 ) { rs->sr_err = LDAP_OTHER; @@ -159,12 +159,12 @@ retry: /* transaction retry */ locker = TXN_ID ( ltid ); - opinfo.boi_bdb = op->o_bd; + opinfo.boi_oe.oe_key = op->o_bd->bd_self; opinfo.boi_txn = ltid; opinfo.boi_err = 0; opinfo.boi_acl_cache = op->o_do_not_cache; - op->o_private = &opinfo; - + LDAP_SLIST_INSERT_HEAD( &op->o_extra, &opinfo.boi_oe, oe_next ); + /* * Get the parent dn and see if the corresponding entry exists. */ @@ -439,7 +439,8 @@ retry: /* transaction retry */ } ltid = NULL; - op->o_private = NULL; + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); + opinfo.boi_oe.oe_key = NULL; if ( rs->sr_err != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_TRACE, @@ -465,7 +466,9 @@ return_results: if( ltid != NULL ) { TXN_ABORT( ltid ); } - op->o_private = NULL; + if ( opinfo.boi_oe.oe_key ) { + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); + } if( success == LDAP_SUCCESS ) { /* We own the entry now, and it can be purged at will diff --git a/servers/slapd/back-bdb/back-bdb.h b/servers/slapd/back-bdb/back-bdb.h index 7368847749..2d0109fccd 100644 --- a/servers/slapd/back-bdb/back-bdb.h +++ b/servers/slapd/back-bdb/back-bdb.h @@ -267,7 +267,7 @@ struct bdb_lock_info { }; struct bdb_op_info { - BackendDB* boi_bdb; + OpExtra boi_oe; DB_TXN* boi_txn; u_int32_t boi_err; int boi_acl_cache; diff --git a/servers/slapd/back-bdb/delete.c b/servers/slapd/back-bdb/delete.c index 5008be4344..00b3a9409a 100644 --- a/servers/slapd/back-bdb/delete.c +++ b/servers/slapd/back-bdb/delete.c @@ -124,7 +124,8 @@ retry: /* transaction retry */ 0, 0, 0 ); rs->sr_err = TXN_ABORT( ltid ); ltid = NULL; - op->o_private = NULL; + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); + opinfo.boi_oe.oe_key = NULL; op->o_do_not_cache = opinfo.boi_acl_cache; if( rs->sr_err != 0 ) { rs->sr_err = LDAP_OTHER; @@ -155,11 +156,11 @@ retry: /* transaction retry */ locker = TXN_ID ( ltid ); - opinfo.boi_bdb = op->o_bd; + opinfo.boi_oe.oe_key = op->o_bd->bd_self; opinfo.boi_txn = ltid; opinfo.boi_err = 0; opinfo.boi_acl_cache = op->o_do_not_cache; - op->o_private = &opinfo; + LDAP_SLIST_INSERT_HEAD( &op->o_extra, &opinfo.boi_oe, oe_next ); if ( !be_issuffix( op->o_bd, &op->o_req_ndn ) ) { dnParent( &op->o_req_ndn, &pdn ); @@ -536,7 +537,8 @@ retry: /* transaction retry */ rs->sr_err = TXN_COMMIT( ltid, 0 ); } ltid = NULL; - op->o_private = NULL; + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); + opinfo.boi_oe.oe_key = NULL; BDB_LOG_PRINTF( bdb->bi_dbenv, NULL, "slapd Committed delete %s(%d)", e->e_nname.bv_val, e->e_id ); @@ -582,7 +584,9 @@ return_results: if( ltid != NULL ) { TXN_ABORT( ltid ); } - op->o_private = NULL; + if ( opinfo.boi_oe.oe_key ) { + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); + } send_ldap_result( op, rs ); slap_graduate_commit_csn( op ); diff --git a/servers/slapd/back-bdb/id2entry.c b/servers/slapd/back-bdb/id2entry.c index ee61272275..5059e06270 100644 --- a/servers/slapd/back-bdb/id2entry.c +++ b/servers/slapd/back-bdb/id2entry.c @@ -242,7 +242,8 @@ int bdb_entry_release( int rw ) { struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private; - struct bdb_op_info *boi = NULL; + struct bdb_op_info *boi; + OpExtra *oex; /* slapMode : SLAP_SERVER_MODE, SLAP_TOOL_MODE, SLAP_TRUNCATE_MODE, SLAP_UNDEFINED_MODE */ @@ -257,7 +258,10 @@ int bdb_entry_release( #endif } /* free entry and reader or writer lock */ - boi = (struct bdb_op_info *)op->o_private; + LDAP_SLIST_FOREACH( oex, &op->o_extra, oe_next ) { + if ( oex->oe_key == op->o_bd->bd_self ) break; + } + boi = (struct bdb_op_info *)oex; /* lock is freed with txn */ if ( !boi || boi->boi_txn ) { @@ -274,8 +278,8 @@ int bdb_entry_release( } } if ( !boi->boi_locks ) { + LDAP_SLIST_REMOVE( &op->o_extra, &boi->boi_oe, OpExtra, oe_next ); op->o_tmpfree( boi, op->o_tmpmemctx ); - op->o_private = NULL; } } } else { @@ -328,9 +332,14 @@ int bdb_entry_get( "=> bdb_entry_get: oc: \"%s\", at: \"%s\"\n", oc ? oc->soc_cname.bv_val : "(null)", at_name, 0); - if( op ) boi = (struct bdb_op_info *) op->o_private; - if( boi != NULL && op->o_bd->be_private == boi->boi_bdb->be_private ) { - txn = boi->boi_txn; + if( op ) { + OpExtra *oex; + LDAP_SLIST_FOREACH( oex, &op->o_extra, oe_next ) { + if ( oex->oe_key == op->o_bd->bd_self ) break; + } + boi = (struct bdb_op_info *)oex; + if ( boi ) + txn = boi->boi_txn; } if ( txn != NULL ) { @@ -407,8 +416,8 @@ return_results: if ( op ) { if ( !boi ) { boi = op->o_tmpcalloc(1,sizeof(struct bdb_op_info),op->o_tmpmemctx); - boi->boi_bdb = op->o_bd; - op->o_private = boi; + boi->boi_oe.oe_key = op->o_bd; + LDAP_SLIST_INSERT_HEAD( &op->o_extra, &boi->boi_oe, oe_next ); } if ( !boi->boi_txn ) { struct bdb_lock_info *bli; diff --git a/servers/slapd/back-bdb/modify.c b/servers/slapd/back-bdb/modify.c index 8e63506598..9fdb85d4de 100644 --- a/servers/slapd/back-bdb/modify.c +++ b/servers/slapd/back-bdb/modify.c @@ -410,7 +410,8 @@ retry: /* transaction retry */ rs->sr_err = TXN_ABORT( ltid ); ltid = NULL; - op->o_private = NULL; + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); + opinfo.boi_oe.oe_key = NULL; op->o_do_not_cache = opinfo.boi_acl_cache; if( rs->sr_err != 0 ) { rs->sr_err = LDAP_OTHER; @@ -439,11 +440,11 @@ retry: /* transaction retry */ locker = TXN_ID ( ltid ); - opinfo.boi_bdb = op->o_bd; + opinfo.boi_oe.oe_key = op->o_bd->bd_self; opinfo.boi_txn = ltid; opinfo.boi_err = 0; opinfo.boi_acl_cache = op->o_do_not_cache; - op->o_private = &opinfo; + LDAP_SLIST_INSERT_HEAD( &op->o_extra, &opinfo.boi_oe, oe_next ); /* get entry or ancestor */ rs->sr_err = bdb_dn2entry( op, ltid, &op->o_req_ndn, &ei, 1, @@ -666,7 +667,8 @@ retry: /* transaction retry */ rs->sr_err = TXN_COMMIT( ltid, 0 ); } ltid = NULL; - op->o_private = NULL; + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); + opinfo.boi_oe.oe_key = NULL; if( rs->sr_err != 0 ) { Debug( LDAP_DEBUG_TRACE, @@ -705,7 +707,9 @@ done: if( ltid != NULL ) { TXN_ABORT( ltid ); } - op->o_private = NULL; + if ( opinfo.boi_oe.oe_key ) { + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); + } if( e != NULL ) { bdb_unlocked_cache_return_entry_w (&bdb->bi_cache, e); diff --git a/servers/slapd/back-bdb/modrdn.c b/servers/slapd/back-bdb/modrdn.c index 117cb05c25..6b31e416b5 100644 --- a/servers/slapd/back-bdb/modrdn.c +++ b/servers/slapd/back-bdb/modrdn.c @@ -134,7 +134,8 @@ retry: /* transaction retry */ rs->sr_err = TXN_ABORT( ltid ); ltid = NULL; - op->o_private = NULL; + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); + opinfo.boi_oe.oe_key = NULL; op->o_do_not_cache = opinfo.boi_acl_cache; if( rs->sr_err != 0 ) { rs->sr_err = LDAP_OTHER; @@ -165,11 +166,11 @@ retry: /* transaction retry */ locker = TXN_ID ( ltid ); - opinfo.boi_bdb = op->o_bd; + opinfo.boi_oe.oe_key = op->o_bd->bd_self; opinfo.boi_txn = ltid; opinfo.boi_err = 0; opinfo.boi_acl_cache = op->o_do_not_cache; - op->o_private = &opinfo; + LDAP_SLIST_INSERT_HEAD( &op->o_extra, &opinfo.boi_oe, oe_next ); /* get entry */ rs->sr_err = bdb_dn2entry( op, ltid, &op->o_req_ndn, &ei, 1, @@ -764,7 +765,8 @@ retry: /* transaction retry */ } ltid = NULL; - op->o_private = NULL; + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); + opinfo.boi_oe.oe_key = NULL; if( rs->sr_err != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_TRACE, @@ -823,7 +825,9 @@ done: if( ltid != NULL ) { TXN_ABORT( ltid ); } - op->o_private = NULL; + if ( opinfo.boi_oe.oe_key ) { + LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.boi_oe, OpExtra, oe_next ); + } if( preread_ctrl != NULL && (*preread_ctrl) != NULL ) { slap_sl_free( (*preread_ctrl)->ldctl_value.bv_val, op->o_tmpmemctx ); diff --git a/servers/slapd/back-bdb/search.c b/servers/slapd/back-bdb/search.c index 3bbe0a7abc..fe4890b77b 100644 --- a/servers/slapd/back-bdb/search.c +++ b/servers/slapd/back-bdb/search.c @@ -322,11 +322,16 @@ bdb_search( Operation *op, SlapReply *rs ) DB_LOCK lock; struct bdb_op_info *opinfo = NULL; DB_TXN *ltid = NULL; + OpExtra *oex; Debug( LDAP_DEBUG_TRACE, "=> " LDAP_XSTRING(bdb_search) "\n", 0, 0, 0); attrs = op->oq_search.rs_attrs; - opinfo = (struct bdb_op_info *) op->o_private; + LDAP_SLIST_FOREACH( oex, &op->o_extra, oe_next ) { + if ( oex->oe_key == (void *)op->o_bd->bd_self ) + break; + } + opinfo = (struct bdb_op_info *) oex; manageDSAit = get_manageDSAit( op ); -- 2.39.5