From 7567f29211f7da35a785bd8c8cee999b0b24a078 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 16 May 2019 14:35:00 +1200 Subject: [PATCH] dsdb/partition: Ensure metadata.tdb is opened early in partition_reload_if_required() This allows metadata.tdb to be locked in the correct place in in the lock order, as partition_reload_if_required() implicitly calls partition_lock_read(). Signed-off-by: Andrew Bartlett Reviewed-by: Gary Lockyer --- source4/dsdb/samdb/ldb_modules/partition_init.c | 12 ++++++------ source4/dsdb/samdb/ldb_modules/partition_metadata.c | 4 ++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/source4/dsdb/samdb/ldb_modules/partition_init.c b/source4/dsdb/samdb/ldb_modules/partition_init.c index 9a8bb7e211d..7d076932665 100644 --- a/source4/dsdb/samdb/ldb_modules/partition_init.c +++ b/source4/dsdb/samdb/ldb_modules/partition_init.c @@ -409,6 +409,12 @@ int partition_reload_if_required(struct ldb_module *module, return LDB_SUCCESS; } + /* This loads metadata tdb. If it's missing, creates it */ + ret = partition_metadata_init(module); + if (ret != LDB_SUCCESS) { + return ret; + } + ret = partition_reload_metadata(module, data, mem_ctx, &msg, parent); if (ret != LDB_SUCCESS) { talloc_free(mem_ctx); @@ -890,11 +896,5 @@ int partition_init(struct ldb_module *module) return ldb_operr(ldb); } - /* This loads metadata tdb. If it's missing, creates it */ - ret = partition_metadata_init(module); - if (ret != LDB_SUCCESS) { - return ret; - } - return ldb_next_init(module); } diff --git a/source4/dsdb/samdb/ldb_modules/partition_metadata.c b/source4/dsdb/samdb/ldb_modules/partition_metadata.c index cf44c5d1218..c0800f5e506 100644 --- a/source4/dsdb/samdb/ldb_modules/partition_metadata.c +++ b/source4/dsdb/samdb/ldb_modules/partition_metadata.c @@ -303,6 +303,10 @@ int partition_metadata_init(struct ldb_module *module) data = talloc_get_type_abort(ldb_module_get_private(module), struct partition_private_data); + if (data->metadata != NULL && data->metadata->db != NULL) { + return LDB_SUCCESS; + } + data->metadata = talloc_zero(data, struct partition_metadata); if (data->metadata == NULL) { return ldb_module_oom(module); -- 2.34.1