diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2009-07-30 11:52:39 +0930 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2009-07-31 14:40:28 +0200 |
commit | a207cca1d33b510e699a84d4d1a19b7c759bfbfd (patch) | |
tree | 02f2ea174d46946850c55e1acdcd620665ad0b24 | |
parent | 3b2f074bda8734a0b30a3e31117c0217d890809c (diff) | |
download | samba-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>
-rw-r--r-- | lib/tdb/common/open.c | 19 |
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; } |