summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2010-03-25 16:02:54 +0100
committerVolker Lendecke <vl@samba.org>2010-03-25 16:40:44 +0100
commit5a88e43c693f9e0c5dd93e4fd238364262643b5a (patch)
treead3d17a1ea68bc7a6923e1441defdd316023b552 /source3
parented189459b9d7776700ffd353f81b283232940199 (diff)
downloadsamba-5a88e43c693f9e0c5dd93e4fd238364262643b5a.tar.gz
samba-5a88e43c693f9e0c5dd93e4fd238364262643b5a.tar.bz2
samba-5a88e43c693f9e0c5dd93e4fd238364262643b5a.zip
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.
Diffstat (limited to 'source3')
-rw-r--r--source3/include/serverid.h5
-rw-r--r--source3/lib/serverid.c16
-rw-r--r--source3/smbd/server.c4
3 files changed, 25 insertions, 0 deletions
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()))