tdb: don't alter tdb->flags in tdb_reopen_all()
authorRusty Russell <rusty@rustcorp.com.au>
Thu, 30 Jul 2009 02:22:39 +0000 (11:52 +0930)
committerStefan Metzmacher <metze@samba.org>
Fri, 31 Jul 2009 12:40:28 +0000 (14:40 +0200)
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>
lib/tdb/common/open.c

index 49b8e85f1264f00c57e874916972350712b8a437..2dcdd4bde74aca7cc4c2fcec175a113f475b8ee6 100644 (file)
@@ -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;
        }