+ assert( e != NULL );
+
+ /* NOTE: this should never happen, but it actually happens
+ * when using back-relay; until we find a better way to
+ * preserve entry's private information while rewriting it,
+ * let's disable the hasSubordinate feature for back-relay.
+ */
+ if ( BEI( e ) == NULL ) {
+ Entry *ee = NULL;
+ rc = be_entry_get_rw( op, &e->e_nname, NULL, NULL, 0, &ee );
+ if ( rc != LDAP_SUCCESS || ee == NULL ) {
+ rc = LDAP_OTHER;
+ goto done;
+ }
+ e = ee;
+ release = 1;
+ if ( BEI( ee ) == NULL ) {
+ rc = LDAP_OTHER;
+ goto done;
+ }
+ }
+
+ /* Check for a txn in a parent op, otherwise use reader txn */
+ LDAP_SLIST_FOREACH( oex, &op->o_extra, oe_next ) {
+ if ( oex->oe_key == bdb )
+ break;
+ }
+ opinfo = (struct bdb_op_info *) oex;
+ if ( opinfo && opinfo->boi_txn ) {
+ rtxn = opinfo->boi_txn;
+ } else {
+ rc = bdb_reader_get(op, bdb->bi_dbenv, &rtxn);
+ if ( rc ) {
+ rc = LDAP_OTHER;
+ goto done;
+ }
+ }