From 5a88e43c693f9e0c5dd93e4fd238364262643b5a Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 25 Mar 2010 16:02:54 +0100 Subject: s3: Make sure our CLEAR_IF_FIRST optimization works for serverid.tdb In the child, we fully re-open serverid.tdb, which leads to one fcntl lock for CLEAR_IF_FIRST detection per smbd. This opens the tdb in the parent and holds it, so that tdb_reopen_all correctly catches the CLEAR_IF_FIRST bit. --- source3/include/serverid.h | 5 +++++ source3/lib/serverid.c | 16 ++++++++++++++++ source3/smbd/server.c | 4 ++++ 3 files changed, 25 insertions(+) diff --git a/source3/include/serverid.h b/source3/include/serverid.h index 9ef778cdc0..e60fc47afe 100644 --- a/source3/include/serverid.h +++ b/source3/include/serverid.h @@ -63,4 +63,9 @@ bool serverid_traverse_read(int (*fn)(const struct server_id *id, uint32_t msg_flags, void *private_data), void *private_data); +/* + * Ensure CLEAR_IF_FIRST works fine, to be called from the parent smbd + */ +bool serverid_parent_init(void); + #endif diff --git a/source3/lib/serverid.c b/source3/lib/serverid.c index 9842ead103..5401eed974 100644 --- a/source3/lib/serverid.c +++ b/source3/lib/serverid.c @@ -27,6 +27,22 @@ struct serverid_key { #endif }; +bool serverid_parent_init(void) +{ + struct tdb_wrap *db; + + db = tdb_wrap_open(talloc_autofree_context(), + lock_path("serverid.tdb"), + 0, TDB_DEFAULT|TDB_CLEAR_IF_FIRST, O_RDWR|O_CREAT, + 0644); + if (db == NULL) { + DEBUG(1, ("could not open serverid.tdb: %s\n", + strerror(errno))); + return false; + } + return true; +} + struct serverid_data { uint64_t unique_id; uint32_t msg_flags; diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 145dd5f5d5..e5cfc27794 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -1304,6 +1304,10 @@ extern void build_options(bool screen); exit(1); } + if (!serverid_parent_init()) { + exit(1); + } + namecache_enable(); if (!W_ERROR_IS_OK(registry_init_full())) -- cgit