Commit 2414f261 authored by Rusty Russell's avatar Rusty Russell

tdb2: keep link of every non-internal tdb.

Instead of a per-file linked list, use a per-tdb list.  This is needed
for tdb_foreach().
parent 937d0bab
...@@ -19,20 +19,20 @@ ...@@ -19,20 +19,20 @@
#include <ccan/hash/hash.h> #include <ccan/hash/hash.h>
#include <assert.h> #include <assert.h>
/* all lock info, to detect double-opens (fcntl file don't nest!) */ /* all tdbs, to detect double-opens (fcntl file don't nest!) */
static struct tdb_file *files = NULL; static struct tdb_context *tdbs = NULL;
static struct tdb_file *find_file(dev_t device, ino_t ino) static struct tdb_file *find_file(dev_t device, ino_t ino)
{ {
struct tdb_file *i; struct tdb_context *i;
for (i = files; i; i = i->next) { for (i = tdbs; i; i = i->next) {
if (i->device == device && i->inode == ino) { if (i->file->device == device && i->file->inode == ino) {
i->refcnt++; i->file->refcnt++;
break; return i->file;
} }
} }
return i; return NULL;
} }
static bool read_all(int fd, void *buf, size_t len) static bool read_all(int fd, void *buf, size_t len)
...@@ -483,7 +483,6 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags, ...@@ -483,7 +483,6 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
goto fail; goto fail;
} }
tdb->file->next = files;
tdb->file->fd = fd; tdb->file->fd = fd;
tdb->file->device = st.st_dev; tdb->file->device = st.st_dev;
tdb->file->inode = st.st_ino; tdb->file->inode = st.st_ino;
...@@ -596,9 +595,8 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags, ...@@ -596,9 +595,8 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
goto fail; goto fail;
} }
/* Add to linked list if we're new. */ tdb->next = tdbs;
if (tdb->file->refcnt == 1) tdbs = tdb;
files = tdb->file;
return tdb; return tdb;
fail: fail:
...@@ -653,6 +651,7 @@ fail_errno: ...@@ -653,6 +651,7 @@ fail_errno:
int tdb_close(struct tdb_context *tdb) int tdb_close(struct tdb_context *tdb)
{ {
int ret = 0; int ret = 0;
struct tdb_context **i;
tdb_trace(tdb, "tdb_close"); tdb_trace(tdb, "tdb_close");
...@@ -667,24 +666,22 @@ int tdb_close(struct tdb_context *tdb) ...@@ -667,24 +666,22 @@ int tdb_close(struct tdb_context *tdb)
tdb_munmap(tdb->file); tdb_munmap(tdb->file);
} }
if (tdb->file) { if (tdb->file) {
struct tdb_file **i;
tdb_lock_cleanup(tdb); tdb_lock_cleanup(tdb);
if (--tdb->file->refcnt == 0) { if (--tdb->file->refcnt == 0) {
ret = close(tdb->file->fd); ret = close(tdb->file->fd);
/* Remove from files list */
for (i = &files; *i; i = &(*i)->next) {
if (*i == tdb->file) {
*i = tdb->file->next;
break;
}
}
free(tdb->file->lockrecs); free(tdb->file->lockrecs);
free(tdb->file); free(tdb->file);
} }
} }
/* Remove from tdbs list */
for (i = &tdbs; *i; i = &(*i)->next) {
if (*i == tdb) {
*i = tdb->next;
break;
}
}
#ifdef TDB_TRACE #ifdef TDB_TRACE
close(tdb->tracefd); close(tdb->tracefd);
#endif #endif
......
...@@ -298,9 +298,6 @@ struct tdb_access_hdr { ...@@ -298,9 +298,6 @@ struct tdb_access_hdr {
}; };
struct tdb_file { struct tdb_file {
/* Single list of all TDBs, to detect multiple opens. */
struct tdb_file *next;
/* How many are sharing us? */ /* How many are sharing us? */
unsigned int refcnt; unsigned int refcnt;
...@@ -325,6 +322,9 @@ struct tdb_file { ...@@ -325,6 +322,9 @@ struct tdb_file {
}; };
struct tdb_context { struct tdb_context {
/* Single list of all TDBs, to detect multiple opens. */
struct tdb_context *next;
/* Filename of the database. */ /* Filename of the database. */
const char *name; const char *name;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment