X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-bdb%2Fmodrdn.c;h=9cc47c1ea9e1fa17706665a380000f72285518fb;hb=6661a26e9bc2f2fa8dd14f573a9d72acd0c5bfae;hp=1bdebe513366690d75209887d1b6a82d77ec599f;hpb=d71500e67b51a6ad2341074782ba34a6cae1e03f;p=openldap diff --git a/servers/slapd/back-bdb/modrdn.c b/servers/slapd/back-bdb/modrdn.c index 1bdebe5133..9cc47c1ea9 100644 --- a/servers/slapd/back-bdb/modrdn.c +++ b/servers/slapd/back-bdb/modrdn.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2000-2005 The OpenLDAP Foundation. + * Copyright 2000-2008 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -108,7 +108,6 @@ retry: /* transaction retry */ } parent_is_glue = 0; parent_is_leaf = 0; - ldap_pvt_thread_yield(); bdb_trans_backoff( ++num_retries ); } @@ -511,7 +510,7 @@ retry: /* transaction retry */ /* Shortcut the search */ nei = neip ? neip : eip; - rs->sr_err = bdb_cache_find_ndn ( op, ltid, &new_ndn, &nei ); + rs->sr_err = bdb_cache_find_ndn ( op, locker, &new_ndn, &nei ); if ( nei ) bdb_cache_entryinfo_unlock( nei ); switch( rs->sr_err ) { case DB_LOCK_DEADLOCK: @@ -520,6 +519,9 @@ retry: /* transaction retry */ case DB_NOTFOUND: break; case 0: + /* Allow rename to same DN */ + if ( nei == ei ) + break; rs->sr_err = LDAP_ALREADY_EXISTS; goto return_results; default: @@ -728,7 +730,10 @@ retry: /* transaction retry */ if(( rs->sr_err=TXN_ABORT( ltid )) != 0 ) { rs->sr_text = "txn_abort (no-op) failed"; } else { - rs->sr_err = LDAP_SUCCESS; + rs->sr_err = LDAP_X_NO_OPERATION; + ltid = NULL; + /* Only free attrs if they were dup'd. */ + if ( dummy.e_attrs == e->e_attrs ) dummy.e_attrs = NULL; goto return_results; } @@ -778,7 +783,6 @@ return_results: send_ldap_result( op, rs ); if( rs->sr_err == LDAP_SUCCESS && bdb->bi_txn_cp ) { - ldap_pvt_thread_yield(); TXN_CHECKPOINT( bdb->bi_dbenv, bdb->bi_txn_cp_kbyte, bdb->bi_txn_cp_min, 0 ); } @@ -788,6 +792,8 @@ return_results: } done: + slap_graduate_commit_csn( op ); + if( new_dn.bv_val != NULL ) free( new_dn.bv_val ); if( new_ndn.bv_val != NULL ) free( new_ndn.bv_val ); @@ -795,22 +801,13 @@ done: if ( new_rdn != NULL ) { ldap_rdnfree_x( new_rdn, op->o_tmpmemctx ); } + if ( old_rdn != NULL ) { ldap_rdnfree_x( old_rdn, op->o_tmpmemctx ); } + if( mod != NULL ) { - Modifications *tmp; - for (; mod; mod=tmp ) { - tmp = mod->sml_next; - /* slap_modrdn2mods does things one way, - * slap_mods_opattrs does it differently - */ - if ( mod->sml_op != SLAP_MOD_SOFTADD && - mod->sml_op != LDAP_MOD_DELETE ) break; - if ( mod->sml_nvalues ) free( mod->sml_nvalues[0].bv_val ); - free( mod ); - } - slap_mods_free( mod, 1 ); + slap_modrdn2mods_free( mod ); } /* LDAP v3 Support */ @@ -831,14 +828,14 @@ done: if( ltid != NULL ) { TXN_ABORT( ltid ); - op->o_private = NULL; } + op->o_private = NULL; - if( preread_ctrl != NULL ) { + if( preread_ctrl != NULL && (*preread_ctrl) != NULL ) { slap_sl_free( (*preread_ctrl)->ldctl_value.bv_val, op->o_tmpmemctx ); slap_sl_free( *preread_ctrl, op->o_tmpmemctx ); } - if( postread_ctrl != NULL ) { + if( postread_ctrl != NULL && (*postread_ctrl) != NULL ) { slap_sl_free( (*postread_ctrl)->ldctl_value.bv_val, op->o_tmpmemctx ); slap_sl_free( *postread_ctrl, op->o_tmpmemctx ); }