From: Andrew Bartlett Date: Thu, 16 May 2019 02:35:00 +0000 (+1200) Subject: dsdb/partition: Ensure metadata.tdb is opened early in partition_reload_if_required() X-Git-Tag: ldb-2.0.5~761 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7567f29211f7da35a785bd8c8cee999b0b24a078;p=thirdparty%2Fsamba.git 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 --- 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);