mirror of
https://github.com/samba-team/samba.git
synced 2024-12-24 21:34:56 +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:
parent
617c1fcfa4
commit
1664702d2f
@ -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,
|
|||||||
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,
|
|||||||
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:
|
|||||||
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)
|
|||||||
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
|
||||||
|
@ -310,9 +310,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;
|
||||||
|
|
||||||
@ -337,6 +334,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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user