1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

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)
This commit is contained in:
Rusty Russell 2011-09-14 07:19:13 +09:30
parent 617c1fcfa4
commit 1664702d2f
2 changed files with 22 additions and 25 deletions

View File

@ -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

View File

@ -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;