summaryrefslogtreecommitdiff
path: root/lib/tdb/common/open.c
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2009-07-30 11:52:39 +0930
committerStefan Metzmacher <metze@samba.org>2009-07-31 14:40:28 +0200
commita207cca1d33b510e699a84d4d1a19b7c759bfbfd (patch)
tree02f2ea174d46946850c55e1acdcd620665ad0b24 /lib/tdb/common/open.c
parent3b2f074bda8734a0b30a3e31117c0217d890809c (diff)
downloadsamba-a207cca1d33b510e699a84d4d1a19b7c759bfbfd.tar.gz
samba-a207cca1d33b510e699a84d4d1a19b7c759bfbfd.tar.bz2
samba-a207cca1d33b510e699a84d4d1a19b7c759bfbfd.zip
tdb: don't alter tdb->flags in tdb_reopen_all()
The flags are user-visible, via tdb_get_flags/add_flags/remove_flags. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Stefan Metzmacher <metze@samba.org>
Diffstat (limited to 'lib/tdb/common/open.c')
-rw-r--r--lib/tdb/common/open.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/lib/tdb/common/open.c b/lib/tdb/common/open.c
index 49b8e85f12..2dcdd4bde7 100644
--- a/lib/tdb/common/open.c
+++ b/lib/tdb/common/open.c
@@ -405,9 +405,7 @@ void *tdb_get_logging_private(struct tdb_context *tdb)
return tdb->log.log_private;
}
-/* reopen a tdb - this can be used after a fork to ensure that we have an independent
- seek pointer from our parent and to re-establish locks */
-int tdb_reopen(struct tdb_context *tdb)
+static int tdb_reopen_internal(struct tdb_context *tdb, bool active_lock)
{
struct stat st;
@@ -450,7 +448,7 @@ int tdb_reopen(struct tdb_context *tdb)
tdb_mmap(tdb);
#endif /* fake pread or pwrite */
- if ((tdb->flags & TDB_CLEAR_IF_FIRST) &&
+ if (active_lock &&
(tdb->methods->tdb_brlock(tdb, ACTIVE_LOCK, F_RDLCK, F_SETLKW, 0, 1) == -1)) {
TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: failed to obtain active lock\n"));
goto fail;
@@ -463,12 +461,21 @@ fail:
return -1;
}
+/* reopen a tdb - this can be used after a fork to ensure that we have an independent
+ seek pointer from our parent and to re-establish locks */
+int tdb_reopen(struct tdb_context *tdb)
+{
+ return tdb_reopen_internal(tdb, tdb->flags & TDB_CLEAR_IF_FIRST);
+}
+
/* reopen all tdb's */
int tdb_reopen_all(int parent_longlived)
{
struct tdb_context *tdb;
for (tdb=tdbs; tdb; tdb = tdb->next) {
+ bool active_lock = (tdb->flags & TDB_CLEAR_IF_FIRST);
+
/*
* If the parent is longlived (ie. a
* parent daemon architecture), we know
@@ -482,10 +489,10 @@ int tdb_reopen_all(int parent_longlived)
*/
if (parent_longlived) {
/* Ensure no clear-if-first. */
- tdb->flags &= ~TDB_CLEAR_IF_FIRST;
+ active_lock = false;
}
- if (tdb_reopen(tdb) != 0)
+ if (tdb_reopen_internal(tdb, active_lock) != 0)
return -1;
}