2 RID allocation helper functions
4 Copyright (C) Andrew Bartlett 2010
5 Copyright (C) Andrew Tridgell 2010
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
24 * Component: RID allocation logic
26 * Description: manage RID Set and RID Manager objects
31 #include "ldb_module.h"
32 #include "dsdb/samdb/samdb.h"
33 #include "dsdb/samdb/ldb_modules/util.h"
34 #include "lib/messaging/irpc.h"
35 #include "param/param.h"
36 #include "librpc/gen_ndr/ndr_misc.h"
39 Note: the RID allocation attributes in AD are very badly named. Here
40 is what we think they really do:
43 - rIDPreviousAllocationPool: the pool which a DC is currently
44 pulling RIDs from. Managed by client DC
46 - rIDAllocationPool: the pool that the DC will switch to next,
47 when rIDPreviousAllocationPool is exhausted. Managed by RID Manager.
49 - rIDNextRID: the last RID allocated by this DC. Managed by client DC
51 in RID Manager object:
52 - rIDAvailablePool: the pool where the RID Manager gets new rID
53 pools from when it gets a EXOP_RID_ALLOC getncchanges call (or
54 locally when the DC is the RID Manager)
59 allocate a new range of RIDs in the RID Manager object
61 static int ridalloc_rid_manager_allocate(struct ldb_module *module, struct ldb_dn *rid_manager_dn, uint64_t *new_pool)
64 TALLOC_CTX *tmp_ctx = talloc_new(module);
65 const char *attrs[] = { "rIDAvailablePool", NULL };
66 uint64_t rid_pool, new_rid_pool, dc_pool;
67 uint32_t rid_pool_lo, rid_pool_hi;
68 struct ldb_result *res;
69 struct ldb_context *ldb = ldb_module_get_ctx(module);
70 const unsigned alloc_size = 500;
72 ret = dsdb_module_search_dn(module, tmp_ctx, &res, rid_manager_dn, attrs, 0);
73 if (ret != LDB_SUCCESS) {
74 ldb_asprintf_errstring(ldb, "Failed to find rIDAvailablePool in %s - %s",
75 ldb_dn_get_linearized(rid_manager_dn), ldb_errstring(ldb));
80 rid_pool = ldb_msg_find_attr_as_uint64(res->msgs[0], "rIDAvailablePool", 0);
81 rid_pool_lo = rid_pool & 0xFFFFFFFF;
82 rid_pool_hi = rid_pool >> 32;
83 if (rid_pool_lo >= rid_pool_hi) {
84 ldb_asprintf_errstring(ldb, "Out of RIDs in RID Manager - rIDAvailablePool is %u-%u",
85 rid_pool_lo, rid_pool_hi);
90 /* lower part of new pool is the low part of the rIDAvailablePool */
91 dc_pool = rid_pool_lo;
93 /* allocate 500 RIDs to this DC */
94 rid_pool_lo = MIN(rid_pool_hi, rid_pool_lo + alloc_size);
96 /* work out upper part of new pool */
97 dc_pool |= (((uint64_t)rid_pool_lo-1)<<32);
99 /* and new rIDAvailablePool value */
100 new_rid_pool = rid_pool_lo | (((uint64_t)rid_pool_hi)<<32);
102 ret = dsdb_module_constrainted_update_integer(module, rid_manager_dn, "rIDAvailablePool",
103 rid_pool, new_rid_pool);
104 if (ret != LDB_SUCCESS) {
105 ldb_asprintf_errstring(ldb, "Failed to update rIDAvailablePool - %s",
107 talloc_free(tmp_ctx);
111 (*new_pool) = dc_pool;
112 talloc_free(tmp_ctx);
117 create a RID Set object for the specified DC
119 static int ridalloc_create_rid_set_ntds(struct ldb_module *module, TALLOC_CTX *mem_ctx,
120 struct ldb_dn *rid_manager_dn,
121 struct ldb_dn *ntds_dn, struct ldb_dn **dn)
123 TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
124 struct ldb_dn *server_dn, *machine_dn, *rid_set_dn;
127 struct ldb_message *msg;
128 struct ldb_context *ldb = ldb_module_get_ctx(module);
133 find the machine object for the DC
134 construct the RID Set DN
135 load rIDAvailablePool to find next available set
136 modify RID Manager object to update rIDAvailablePool
137 add the RID Set object
138 link to the RID Set object in machine object
141 server_dn = ldb_dn_get_parent(tmp_ctx, ntds_dn);
143 ldb_module_oom(module);
144 talloc_free(tmp_ctx);
145 return LDB_ERR_OPERATIONS_ERROR;
148 ret = dsdb_module_reference_dn(module, tmp_ctx, server_dn, "serverReference", &machine_dn);
149 if (ret != LDB_SUCCESS) {
150 ldb_asprintf_errstring(ldb, "Failed to find serverReference in %s - %s",
151 ldb_dn_get_linearized(server_dn), ldb_errstring(ldb));
152 talloc_free(tmp_ctx);
156 rid_set_dn = ldb_dn_copy(tmp_ctx, machine_dn);
157 if (rid_set_dn == NULL) {
158 ldb_module_oom(module);
159 return LDB_ERR_OPERATIONS_ERROR;
162 if (! ldb_dn_add_child_fmt(rid_set_dn, "CN=RID Set")) {
163 ldb_module_oom(module);
164 return LDB_ERR_OPERATIONS_ERROR;
167 /* grab a pool from the RID Manager object */
168 ret = ridalloc_rid_manager_allocate(module, rid_manager_dn, &dc_pool);
169 if (ret != LDB_SUCCESS) {
170 talloc_free(tmp_ctx);
174 /* create the RID Set object */
175 msg = ldb_msg_new(tmp_ctx);
176 msg->dn = rid_set_dn;
178 ret = ldb_msg_add_string(msg, "objectClass", "top");
179 if (ret != LDB_SUCCESS) {
180 talloc_free(tmp_ctx);
183 ret = ldb_msg_add_string(msg, "objectClass", "rIDSet");
184 if (ret != LDB_SUCCESS) {
185 talloc_free(tmp_ctx);
188 ret = ldb_msg_add_string(msg, "cn", "RID Set");
189 if (ret != LDB_SUCCESS) {
190 talloc_free(tmp_ctx);
193 ret = ldb_msg_add_string(msg, "name", "RID Set");
194 if (ret != LDB_SUCCESS) {
195 talloc_free(tmp_ctx);
198 ret = ldb_msg_add_fmt(msg, "rIDAllocationPool", "%llu", (unsigned long long)dc_pool);
199 if (ret != LDB_SUCCESS) {
200 talloc_free(tmp_ctx);
204 /* w2k8-r2 sets these to zero when first created */
205 ret = ldb_msg_add_fmt(msg, "rIDPreviousAllocationPool", "0");
206 if (ret != LDB_SUCCESS) {
207 talloc_free(tmp_ctx);
210 ret = ldb_msg_add_fmt(msg, "rIDUsedPool", "0");
211 if (ret != LDB_SUCCESS) {
212 talloc_free(tmp_ctx);
215 ret = ldb_msg_add_fmt(msg, "rIDNextRID", "0");
216 if (ret != LDB_SUCCESS) {
217 talloc_free(tmp_ctx);
221 ret = dsdb_module_add(module, msg, 0);
222 if (ret != LDB_SUCCESS) {
223 ldb_asprintf_errstring(ldb, "Failed to add RID Set %s - %s",
224 ldb_dn_get_linearized(msg->dn),
226 talloc_free(tmp_ctx);
230 /* add the rIDSetReferences link */
231 msg = ldb_msg_new(tmp_ctx);
232 msg->dn = machine_dn;
234 ret = ldb_msg_add_string(msg, "rIDSetReferences", ldb_dn_get_linearized(rid_set_dn));
235 if (ret != LDB_SUCCESS) {
236 talloc_free(tmp_ctx);
239 msg->elements[0].flags = LDB_FLAG_MOD_ADD;
241 ret = dsdb_module_modify(module, msg, 0);
242 if (ret != LDB_SUCCESS) {
243 ldb_asprintf_errstring(ldb, "Failed to add rIDSetReferences to %s - %s",
244 ldb_dn_get_linearized(msg->dn),
246 talloc_free(tmp_ctx);
250 (*dn) = talloc_steal(mem_ctx, rid_set_dn);
252 talloc_free(tmp_ctx);
258 create a RID Set object for this DC
260 static int ridalloc_create_own_rid_set(struct ldb_module *module, TALLOC_CTX *mem_ctx,
263 TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
264 struct ldb_dn *rid_manager_dn, *fsmo_role_dn;
266 struct ldb_context *ldb = ldb_module_get_ctx(module);
268 /* work out who is the RID Manager */
269 ret = dsdb_module_rid_manager_dn(module, tmp_ctx, &rid_manager_dn);
270 if (ret != LDB_SUCCESS) {
271 ldb_asprintf_errstring(ldb, "Failed to find RID Manager object - %s",
273 talloc_free(tmp_ctx);
277 /* find the DN of the RID Manager */
278 ret = dsdb_module_reference_dn(module, tmp_ctx, rid_manager_dn, "fSMORoleOwner", &fsmo_role_dn);
279 if (ret != LDB_SUCCESS) {
280 ldb_asprintf_errstring(ldb, "Failed to find fSMORoleOwner in RID Manager object - %s",
282 talloc_free(tmp_ctx);
286 if (ldb_dn_compare(samdb_ntds_settings_dn(ldb), fsmo_role_dn) != 0) {
287 ldb_asprintf_errstring(ldb, "Remote RID Set allocation needs refresh");
288 talloc_free(tmp_ctx);
289 return LDB_ERR_UNWILLING_TO_PERFORM;
292 ret = ridalloc_create_rid_set_ntds(module, mem_ctx, rid_manager_dn, fsmo_role_dn, dn);
293 talloc_free(tmp_ctx);
298 refresh a RID Set object for the specified DC
299 also returns the first RID for the new pool
301 static int ridalloc_refresh_rid_set_ntds(struct ldb_module *module,
302 struct ldb_dn *rid_manager_dn,
303 struct ldb_dn *ntds_dn, uint64_t *new_pool)
305 TALLOC_CTX *tmp_ctx = talloc_new(module);
306 struct ldb_dn *server_dn, *machine_dn, *rid_set_dn;
307 struct ldb_context *ldb = ldb_module_get_ctx(module);
310 /* grab a pool from the RID Manager object */
311 ret = ridalloc_rid_manager_allocate(module, rid_manager_dn, new_pool);
312 if (ret != LDB_SUCCESS) {
313 talloc_free(tmp_ctx);
317 server_dn = ldb_dn_get_parent(tmp_ctx, ntds_dn);
319 ldb_module_oom(module);
320 talloc_free(tmp_ctx);
321 return LDB_ERR_OPERATIONS_ERROR;
324 ret = dsdb_module_reference_dn(module, tmp_ctx, server_dn, "serverReference", &machine_dn);
325 if (ret != LDB_SUCCESS) {
326 ldb_asprintf_errstring(ldb, "Failed to find serverReference in %s - %s",
327 ldb_dn_get_linearized(server_dn), ldb_errstring(ldb));
328 talloc_free(tmp_ctx);
332 ret = dsdb_module_reference_dn(module, tmp_ctx, machine_dn, "rIDSetReferences", &rid_set_dn);
333 if (ret != LDB_SUCCESS) {
334 ldb_asprintf_errstring(ldb, "Failed to find rIDSetReferences in %s - %s",
335 ldb_dn_get_linearized(machine_dn), ldb_errstring(ldb));
336 talloc_free(tmp_ctx);
340 ret = dsdb_module_set_integer(module, rid_set_dn, "rIDAllocationPool", *new_pool);
341 if (ret != LDB_SUCCESS) {
342 ldb_asprintf_errstring(ldb, "Failed to modify RID Set object %s - %s",
343 ldb_dn_get_linearized(rid_set_dn), ldb_errstring(ldb));
344 talloc_free(tmp_ctx);
348 talloc_free(tmp_ctx);
354 make a IRPC call to the drepl task to ask it to get the RID
355 Manager to give us another RID pool.
357 This function just sends the message to the drepl task then
358 returns immediately. It should be called well before we
359 completely run out of RIDs
361 static void ridalloc_poke_rid_manager(struct ldb_module *module)
363 struct messaging_context *msg;
364 struct server_id *server;
365 struct ldb_context *ldb = ldb_module_get_ctx(module);
366 struct loadparm_context *lp_ctx = ldb_get_opaque(ldb, "loadparm");
367 TALLOC_CTX *tmp_ctx = talloc_new(module);
369 msg = messaging_client_init(tmp_ctx, lp_messaging_path(tmp_ctx, lp_ctx),
370 lp_iconv_convenience(lp_ctx),
371 ldb_get_event_context(ldb));
373 DEBUG(3,(__location__ ": Failed to create messaging context\n"));
374 talloc_free(tmp_ctx);
378 server = irpc_servers_byname(msg, msg, "dreplsrv");
380 /* this means the drepl service is not running */
381 talloc_free(tmp_ctx);
385 messaging_send(msg, server[0], MSG_DREPL_ALLOCATE_RID, NULL);
387 /* we don't care if the message got through */
388 talloc_free(tmp_ctx);
392 get a new RID pool for ourselves
393 also returns the first rid for the new pool
395 static int ridalloc_refresh_own_pool(struct ldb_module *module, uint64_t *new_pool)
397 TALLOC_CTX *tmp_ctx = talloc_new(module);
398 struct ldb_dn *rid_manager_dn, *fsmo_role_dn;
400 struct ldb_context *ldb = ldb_module_get_ctx(module);
402 /* work out who is the RID Manager */
403 ret = dsdb_module_rid_manager_dn(module, tmp_ctx, &rid_manager_dn);
404 if (ret != LDB_SUCCESS) {
405 ldb_asprintf_errstring(ldb, "Failed to find RID Manager object - %s",
407 talloc_free(tmp_ctx);
411 /* find the DN of the RID Manager */
412 ret = dsdb_module_reference_dn(module, tmp_ctx, rid_manager_dn, "fSMORoleOwner", &fsmo_role_dn);
413 if (ret != LDB_SUCCESS) {
414 ldb_asprintf_errstring(ldb, "Failed to find fSMORoleOwner in RID Manager object - %s",
416 talloc_free(tmp_ctx);
420 if (ldb_dn_compare(samdb_ntds_settings_dn(ldb), fsmo_role_dn) != 0) {
421 ldb_asprintf_errstring(ldb, "Remote RID Set allocation needs refresh");
422 talloc_free(tmp_ctx);
423 return LDB_ERR_UNWILLING_TO_PERFORM;
426 ret = ridalloc_refresh_rid_set_ntds(module, rid_manager_dn, fsmo_role_dn, new_pool);
427 talloc_free(tmp_ctx);
432 /* allocate a RID using our RID Set
433 If we run out of RIDs then allocate a new pool
434 either locally or by contacting the RID Manager
436 int ridalloc_allocate_rid(struct ldb_module *module, uint32_t *rid)
438 struct ldb_context *ldb;
439 static const char * const attrs[] = { "rIDAllocationPool", "rIDPreviousAllocationPool",
440 "rIDNextRID" , "rIDUsedPool", NULL };
442 struct ldb_dn *rid_set_dn;
443 struct ldb_result *res;
444 uint64_t alloc_pool, prev_alloc_pool;
445 uint32_t prev_alloc_pool_lo, prev_alloc_pool_hi;
446 uint32_t rid_used_pool;
448 TALLOC_CTX *tmp_ctx = talloc_new(module);
451 ldb = ldb_module_get_ctx(module);
453 ret = samdb_rid_set_dn(ldb, tmp_ctx, &rid_set_dn);
454 if (ret == LDB_ERR_NO_SUCH_ATTRIBUTE) {
455 ret = ridalloc_create_own_rid_set(module, tmp_ctx, &rid_set_dn);
457 if (ret != LDB_SUCCESS) {
458 ldb_asprintf_errstring(ldb, __location__ ": No RID Set DN - %s",
460 talloc_free(tmp_ctx);
464 ret = dsdb_module_search_dn(module, tmp_ctx, &res, rid_set_dn, attrs, 0);
465 if (ret != LDB_SUCCESS) {
466 ldb_asprintf_errstring(ldb, __location__ ": No RID Set %s",
467 ldb_dn_get_linearized(rid_set_dn));
468 talloc_free(tmp_ctx);
472 prev_alloc_pool = ldb_msg_find_attr_as_uint64(res->msgs[0], "rIDPreviousAllocationPool", 0);
473 alloc_pool = ldb_msg_find_attr_as_uint64(res->msgs[0], "rIDAllocationPool", 0);
474 prev_rid = ldb_msg_find_attr_as_int(res->msgs[0], "rIDNextRID", 0);
475 rid_used_pool = ldb_msg_find_attr_as_int(res->msgs[0], "rIDUsedPool", 0);
476 if (alloc_pool == 0) {
477 ldb_asprintf_errstring(ldb, __location__ ": Bad RID Set %s",
478 ldb_dn_get_linearized(rid_set_dn));
479 talloc_free(tmp_ctx);
480 return LDB_ERR_OPERATIONS_ERROR;
483 prev_alloc_pool_lo = prev_alloc_pool & 0xFFFFFFFF;
484 prev_alloc_pool_hi = prev_alloc_pool >> 32;
485 if (prev_rid >= prev_alloc_pool_hi) {
486 if (prev_alloc_pool == 0) {
487 ret = dsdb_module_set_integer(module, rid_set_dn, "rIDPreviousAllocationPool", alloc_pool);
489 ret = dsdb_module_constrainted_update_integer(module, rid_set_dn, "rIDPreviousAllocationPool",
490 prev_alloc_pool, alloc_pool);
492 if (ret != LDB_SUCCESS) {
493 ldb_asprintf_errstring(ldb, __location__ ": Failed to update rIDPreviousAllocationPool on %s - %s",
494 ldb_dn_get_linearized(rid_set_dn), ldb_errstring(ldb));
495 talloc_free(tmp_ctx);
498 prev_alloc_pool = alloc_pool;
499 prev_alloc_pool_lo = prev_alloc_pool & 0xFFFFFFFF;
500 prev_alloc_pool_hi = prev_alloc_pool >> 32;
502 /* update the rIDUsedPool attribute */
503 ret = dsdb_module_set_integer(module, rid_set_dn, "rIDUsedPool", rid_used_pool+1);
504 if (ret != LDB_SUCCESS) {
505 ldb_asprintf_errstring(ldb, __location__ ": Failed to update rIDUsedPool on %s - %s",
506 ldb_dn_get_linearized(rid_set_dn), ldb_errstring(ldb));
507 talloc_free(tmp_ctx);
511 (*rid) = prev_alloc_pool_lo;
514 /* see if we are still out of RIDs, and if so then ask
515 the RID Manager to give us more */
516 if (prev_rid >= prev_alloc_pool_hi) {
518 ret = ridalloc_refresh_own_pool(module, &new_pool);
519 if (ret != LDB_SUCCESS) {
522 ret = dsdb_module_constrainted_update_integer(module, rid_set_dn, "rIDPreviousAllocationPool",
523 prev_alloc_pool, new_pool);
524 if (ret != LDB_SUCCESS) {
525 ldb_asprintf_errstring(ldb, __location__ ": Failed to update rIDPreviousAllocationPool on %s - %s",
526 ldb_dn_get_linearized(rid_set_dn), ldb_errstring(ldb));
527 talloc_free(tmp_ctx);
530 prev_alloc_pool = new_pool;
531 prev_alloc_pool_lo = prev_alloc_pool & 0xFFFFFFFF;
532 prev_alloc_pool_hi = prev_alloc_pool >> 32;
533 (*rid) = prev_alloc_pool_lo;
535 /* despite the name, rIDNextRID is the value of the last user
536 * added by this DC, not the next available RID */
538 (*rid) = prev_rid + 1;
542 if (*rid < prev_alloc_pool_lo || *rid > prev_alloc_pool_hi) {
543 ldb_asprintf_errstring(ldb, __location__ ": Bad rid chosen %u from range %u-%u",
544 (unsigned)*rid, (unsigned)prev_alloc_pool_lo,
545 (unsigned)prev_alloc_pool_hi);
546 talloc_free(tmp_ctx);
547 return LDB_ERR_OPERATIONS_ERROR;
550 /* now modify the RID Set to use up this RID using a
551 * constrained delete/add if possible */
553 ret = dsdb_module_set_integer(module, rid_set_dn, "rIDNextRID", *rid);
555 ret = dsdb_module_constrainted_update_integer(module, rid_set_dn, "rIDNextRID", prev_rid, *rid);
558 /* if we are half-exhausted then ask the repl task to start
559 * getting another one */
560 if (*rid > (prev_alloc_pool_hi + prev_alloc_pool_lo)/2) {
561 ridalloc_poke_rid_manager(module);
564 talloc_free(tmp_ctx);
571 called by DSDB_EXTENDED_ALLOCATE_RID_POOL extended operation in samldb
573 int ridalloc_allocate_rid_pool_fsmo(struct ldb_module *module, struct dsdb_fsmo_extended_op *exop)
575 struct ldb_dn *ntds_dn, *server_dn, *machine_dn, *rid_set_dn;
576 struct ldb_dn *rid_manager_dn;
577 TALLOC_CTX *tmp_ctx = talloc_new(module);
579 struct ldb_context *ldb = ldb_module_get_ctx(module);
582 ret = dsdb_module_dn_by_guid(module, tmp_ctx, &exop->destination_dsa_guid, &ntds_dn);
583 if (ret != LDB_SUCCESS) {
584 ldb_asprintf_errstring(ldb, __location__ ": Unable to find NTDS object for guid %s - %s\n",
585 GUID_string(tmp_ctx, &exop->destination_dsa_guid), ldb_errstring(ldb));
586 talloc_free(tmp_ctx);
590 server_dn = ldb_dn_get_parent(tmp_ctx, ntds_dn);
592 ldb_module_oom(module);
593 talloc_free(tmp_ctx);
594 return LDB_ERR_OPERATIONS_ERROR;
597 ret = dsdb_module_reference_dn(module, tmp_ctx, server_dn, "serverReference", &machine_dn);
598 if (ret != LDB_SUCCESS) {
599 ldb_asprintf_errstring(ldb, __location__ ": Failed to find serverReference in %s - %s",
600 ldb_dn_get_linearized(server_dn), ldb_errstring(ldb));
601 talloc_free(tmp_ctx);
606 ret = dsdb_module_rid_manager_dn(module, tmp_ctx, &rid_manager_dn);
607 if (ret != LDB_SUCCESS) {
608 ldb_asprintf_errstring(ldb, __location__ ": Failed to find RID Manager object - %s",
610 talloc_free(tmp_ctx);
614 ret = dsdb_module_reference_dn(module, tmp_ctx, machine_dn, "rIDSetReferences", &rid_set_dn);
615 if (ret == LDB_ERR_NO_SUCH_ATTRIBUTE) {
616 ret = ridalloc_create_rid_set_ntds(module, tmp_ctx, rid_manager_dn, ntds_dn, &rid_set_dn);
617 talloc_free(tmp_ctx);
621 if (ret != LDB_SUCCESS) {
622 ldb_asprintf_errstring(ldb, "Failed to find rIDSetReferences in %s - %s",
623 ldb_dn_get_linearized(machine_dn), ldb_errstring(ldb));
624 talloc_free(tmp_ctx);
628 if (exop->fsmo_info != 0) {
629 const char *attrs[] = { "rIDAllocationPool", NULL };
630 struct ldb_result *res;
633 ret = dsdb_module_search_dn(module, tmp_ctx, &res, rid_set_dn, attrs, 0);
634 if (ret != LDB_SUCCESS) {
635 ldb_asprintf_errstring(ldb, __location__ ": No RID Set %s",
636 ldb_dn_get_linearized(rid_set_dn));
637 talloc_free(tmp_ctx);
641 alloc_pool = ldb_msg_find_attr_as_uint64(res->msgs[0], "rIDAllocationPool", 0);
642 if (alloc_pool != exop->fsmo_info) {
643 /* it has already been updated */
644 DEBUG(2,(__location__ ": rIDAllocationPool fsmo_info mismatch - already changed (0x%llx 0x%llx)\n",
645 (unsigned long long)exop->fsmo_info,
646 (unsigned long long)alloc_pool));
647 talloc_free(tmp_ctx);
652 ret = ridalloc_refresh_rid_set_ntds(module, rid_manager_dn, ntds_dn, &new_pool);
653 talloc_free(tmp_ctx);