tdb: use tdb_nest_lock() for open lock.
[ira/wip.git] / lib / tdb / common / open.c
index 13d5c94e377216092e4bc05682b5bb6ea9f9eb9b..1f948ff158f5efc48dd8239882ea263d7193dfc4 100644 (file)
@@ -241,8 +241,8 @@ struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
         fcntl(tdb->fd, F_SETFD, v | FD_CLOEXEC);
 
        /* ensure there is only one process initialising at once */
-       if (tdb->methods->brlock(tdb, F_WRLCK, GLOBAL_LOCK, 1, TDB_LOCK_WAIT) == -1) {
-               TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_open_ex: failed to get global lock on %s: %s\n",
+       if (tdb_nest_lock(tdb, OPEN_LOCK, F_WRLCK, TDB_LOCK_WAIT) == -1) {
+               TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_open_ex: failed to get open lock on %s: %s\n",
                         name, strerror(errno)));
                goto fail;      /* errno set by tdb_brlock */
        }
@@ -356,9 +356,10 @@ struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
  internal:
        /* Internal (memory-only) databases skip all the code above to
         * do with disk files, and resume here by releasing their
-        * global lock and hooking into the active list. */
-       if (tdb->methods->brunlock(tdb, F_WRLCK, GLOBAL_LOCK, 1) == -1)
+        * open lock and hooking into the active list. */
+       if (tdb_nest_unlock(tdb, OPEN_LOCK, F_WRLCK, false) == -1) {
                goto fail;
+       }
        tdb->next = tdbs;
        tdbs = tdb;
        return tdb;
@@ -465,7 +466,7 @@ static int tdb_reopen_internal(struct tdb_context *tdb, bool active_lock)
                return 0; /* Nothing to do. */
        }
 
-       if (tdb->num_locks != 0 || tdb->global_lock.count) {
+       if (tdb_have_extra_locks(tdb)) {
                TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_reopen: reopen not allowed with locks held\n"));
                goto fail;
        }