summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2011-09-14 07:19:13 +0930
committerRusty Russell <rusty@rustcorp.com.au>2011-09-14 07:19:13 +0930
commit1664702d2f0755a3caf7ba8dd433e34bb8d340b0 (patch)
tree2d9ecae020d34ac645b55c2df516045359ba7df2 /lib
parent617c1fcfa476d65320dc2c14b21016b6b438c090 (diff)
downloadsamba-1664702d2f0755a3caf7ba8dd433e34bb8d340b0.tar.gz
samba-1664702d2f0755a3caf7ba8dd433e34bb8d340b0.tar.bz2
samba-1664702d2f0755a3caf7ba8dd433e34bb8d340b0.zip
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(). Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (Imported from CCAN commit 2414f261918b4fb8a549dd385dba32118e37bf85)
Diffstat (limited to 'lib')
-rw-r--r--lib/tdb2/open.c41
-rw-r--r--lib/tdb2/private.h6
2 files changed, 22 insertions, 25 deletions
diff --git a/lib/tdb2/open.c b/lib/tdb2/open.c
index 95ed558c57..0f29d7a1fb 100644
--- a/lib/tdb2/open.c
+++ b/lib/tdb2/open.c
@@ -19,20 +19,20 @@
#include <ccan/hash/hash.h>
#include <assert.h>
-/* all lock info, to detect double-opens (fcntl file don't nest!) */
-static struct tdb_file *files = NULL;
+/* all tdbs, to detect double-opens (fcntl file don't nest!) */
+static struct tdb_context *tdbs = NULL;
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) {
- if (i->device == device && i->inode == ino) {
- i->refcnt++;
- break;
+ for (i = tdbs; i; i = i->next) {
+ if (i->file->device == device && i->file->inode == ino) {
+ i->file->refcnt++;
+ return i->file;
}
}
- return i;
+ return NULL;
}
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,
goto fail;
}
- tdb->file->next = files;
tdb->file->fd = fd;
tdb->file->device = st.st_dev;
tdb->file->inode = st.st_ino;
@@ -596,9 +595,8 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
goto fail;
}
- /* Add to linked list if we're new. */
- if (tdb->file->refcnt == 1)
- files = tdb->file;
+ tdb->next = tdbs;
+ tdbs = tdb;
return tdb;
fail:
@@ -653,6 +651,7 @@ fail_errno:
int tdb_close(struct tdb_context *tdb)
{
int ret = 0;
+ struct tdb_context **i;
tdb_trace(tdb, "tdb_close");
@@ -667,24 +666,22 @@ int tdb_close(struct tdb_context *tdb)
tdb_munmap(tdb->file);
}
if (tdb->file) {
- struct tdb_file **i;
-
tdb_lock_cleanup(tdb);
if (--tdb->file->refcnt == 0) {
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);
}
}
+ /* Remove from tdbs list */
+ for (i = &tdbs; *i; i = &(*i)->next) {
+ if (*i == tdb) {
+ *i = tdb->next;
+ break;
+ }
+ }
+
#ifdef TDB_TRACE
close(tdb->tracefd);
#endif
diff --git a/lib/tdb2/private.h b/lib/tdb2/private.h
index d7db41bf74..7c051121d7 100644
--- a/lib/tdb2/private.h
+++ b/lib/tdb2/private.h
@@ -310,9 +310,6 @@ struct tdb_access_hdr {
};
struct tdb_file {
- /* Single list of all TDBs, to detect multiple opens. */
- struct tdb_file *next;
-
/* How many are sharing us? */
unsigned int refcnt;
@@ -337,6 +334,9 @@ struct tdb_file {
};
struct tdb_context {
+ /* Single list of all TDBs, to detect multiple opens. */
+ struct tdb_context *next;
+
/* Filename of the database. */
const char *name;