- LDAP_STAILQ_FOREACH( o, &conn->c_pending_ops, o_next ) {
- if ( o->o_msgid == id ) {
- LDAP_STAILQ_REMOVE( &conn->c_pending_ops, o, slap_op, o_next );
- slap_op_free( o );
- goto done;
+ if ( o ) {
+ op->orn_msgid = id;
+
+ op->o_bd = frontendDB;
+ rs->sr_err = frontendDB->be_abandon( op, rs );
+
+ } else {
+ LDAP_STAILQ_FOREACH( o, &op->o_conn->c_pending_ops, o_next ) {
+ if ( o->o_msgid == id ) {
+ LDAP_STAILQ_REMOVE( &op->o_conn->c_pending_ops,
+ o, Operation, o_next );
+ LDAP_STAILQ_NEXT(o, o_next) = NULL;
+ op->o_conn->c_n_ops_pending--;
+ slap_op_free( o, NULL );
+ break;
+ }
+ }
+ }
+
+ ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
+
+ Debug( LDAP_DEBUG_TRACE, "%s do_abandon: op=%ld %sfound\n",
+ op->o_log_prefix,
+ (long) id, o ? "" : "not " );
+ return rs->sr_err;
+}
+
+int
+fe_op_abandon( Operation *op, SlapReply *rs )
+{
+ LDAP_STAILQ_FOREACH( op->o_bd, &backendDB, be_next ) {
+ if ( op->o_bd->be_abandon ) {
+ (void)op->o_bd->be_abandon( op, rs );