diff options
author | Volker Lendecke <vl@samba.org> | 2010-03-25 16:02:54 +0100 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2010-03-25 16:40:44 +0100 |
commit | 5a88e43c693f9e0c5dd93e4fd238364262643b5a (patch) | |
tree | ad3d17a1ea68bc7a6923e1441defdd316023b552 /source3 | |
parent | ed189459b9d7776700ffd353f81b283232940199 (diff) | |
download | samba-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.h | 5 | ||||
-rw-r--r-- | source3/lib/serverid.c | 16 | ||||
-rw-r--r-- | source3/smbd/server.c | 4 |
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())) |