From ed189459b9d7776700ffd353f81b283232940199 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 25 Mar 2010 16:01:54 +0100 Subject: s3: Make sure our CLEAR_IF_FIRST optimization works for the notify tdbs The notify tdb files are opened at tconX time, which leads to one fcntl lock for CLEAR_IF_FIRST detection per smbd. This opens the tdbs in the parent and holds it, so that tdb_reopen_all correctly catches the CLEAR_IF_FIRST bit. --- source3/smbd/notify_internal.c | 27 +++++++++++++++++++++++++++ source3/smbd/server.c | 4 ++++ 2 files changed, 31 insertions(+) (limited to 'source3/smbd') diff --git a/source3/smbd/notify_internal.c b/source3/smbd/notify_internal.c index 0467e672c1..0e38da6a8c 100644 --- a/source3/smbd/notify_internal.c +++ b/source3/smbd/notify_internal.c @@ -128,6 +128,33 @@ struct notify_context *notify_init(TALLOC_CTX *mem_ctx, struct server_id server, return notify; } +bool notify_internal_parent_init(void) +{ + struct tdb_wrap *db1, *db2; + + if (lp_clustering()) { + return true; + } + + db1 = tdb_wrap_open(talloc_autofree_context(), lock_path("notify.tdb"), + 0, TDB_SEQNUM|TDB_CLEAR_IF_FIRST, + O_RDWR|O_CREAT, 0644); + if (db1 == NULL) { + DEBUG(1, ("could not open notify.tdb: %s\n", strerror(errno))); + return false; + } + db2 = tdb_wrap_open(talloc_autofree_context(), + lock_path("notify_onelevel.tdb"), + 0, TDB_CLEAR_IF_FIRST, O_RDWR|O_CREAT, 0644); + if (db2 == NULL) { + DEBUG(1, ("could not open notify_onelevel.tdb: %s\n", + strerror(errno))); + TALLOC_FREE(db1); + return false; + } + return true; +} + /* lock and fetch the record */ diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 0a6d66c180..145dd5f5d5 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -1300,6 +1300,10 @@ extern void build_options(bool screen); exit(1); } + if (!notify_internal_parent_init()) { + exit(1); + } + namecache_enable(); if (!W_ERROR_IS_OK(registry_init_full())) -- cgit