mirror of
https://github.com/samba-team/samba.git
synced 2024-12-28 07:21:54 +03:00
merged changes from v3-2-test
This commit is contained in:
parent
c54c087a19
commit
7077df3e2e
@ -179,9 +179,7 @@ struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
|
||||
tdb->page_size = 0x2000;
|
||||
}
|
||||
|
||||
if (open_flags & TDB_VOLATILE) {
|
||||
tdb->max_dead_records = 5;
|
||||
}
|
||||
tdb->max_dead_records = (tdb_flags & TDB_VOLATILE) ? 5 : 0;
|
||||
|
||||
if ((open_flags & O_ACCMODE) == O_WRONLY) {
|
||||
TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_open_ex: can't open tdb %s write-only\n",
|
||||
@ -229,6 +227,7 @@ struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
|
||||
|
||||
/* we need to zero database if we are the only one with it open */
|
||||
if ((tdb_flags & TDB_CLEAR_IF_FIRST) &&
|
||||
(!tdb->read_only) &&
|
||||
(locked = (tdb->methods->tdb_brlock(tdb, ACTIVE_LOCK, F_WRLCK, F_SETLK, 0, 1) == 0))) {
|
||||
open_flags |= O_CREAT;
|
||||
if (ftruncate(tdb->fd, 0) == -1) {
|
||||
@ -288,7 +287,6 @@ struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
|
||||
tdb->map_size = st.st_size;
|
||||
tdb->device = st.st_dev;
|
||||
tdb->inode = st.st_ino;
|
||||
tdb->max_dead_records = 0;
|
||||
tdb_mmap(tdb);
|
||||
if (locked) {
|
||||
if (tdb->methods->tdb_brlock(tdb, ACTIVE_LOCK, F_UNLCK, F_SETLK, 0, 1) == -1) {
|
||||
|
@ -743,45 +743,3 @@ failed:
|
||||
tdb_unlockall(tdb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
validate the integrity of all tdb hash chains. Useful when debugging
|
||||
*/
|
||||
int tdb_validate(struct tdb_context *tdb)
|
||||
{
|
||||
int h;
|
||||
for (h=-1;h<(int)tdb->header.hash_size;h++) {
|
||||
tdb_off_t rec_ptr;
|
||||
uint32_t count = 0;
|
||||
if (tdb_ofs_read(tdb, TDB_HASH_TOP(h), &rec_ptr) == -1) {
|
||||
TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_validate: failed ofs_read at top of hash %d\n", h));
|
||||
return -1;
|
||||
}
|
||||
while (rec_ptr) {
|
||||
struct list_struct r;
|
||||
tdb_off_t size;
|
||||
|
||||
if (tdb_rec_read(tdb, rec_ptr, &r) == -1) {
|
||||
TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_validate: failed rec_read h=%d rec_ptr=%u count=%u\n",
|
||||
h, rec_ptr, count));
|
||||
return -1;
|
||||
}
|
||||
if (tdb_ofs_read(tdb, rec_ptr + sizeof(r) + r.rec_len - sizeof(tdb_off_t), &size) == -1) {
|
||||
TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_validate: failed ofs_read h=%d rec_ptr=%u count=%u\n",
|
||||
h, rec_ptr, count));
|
||||
return -1;
|
||||
}
|
||||
if (size != r.rec_len + sizeof(r)) {
|
||||
TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_validate: failed size check size=%u h=%d rec_ptr=%u count=%u\n",
|
||||
size, h, rec_ptr, count));
|
||||
return -1;
|
||||
}
|
||||
rec_ptr = r.next;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -177,6 +177,7 @@ struct tdb_context {
|
||||
int tdb_munmap(struct tdb_context *tdb);
|
||||
void tdb_mmap(struct tdb_context *tdb);
|
||||
int tdb_lock(struct tdb_context *tdb, int list, int ltype);
|
||||
int tdb_lock_nonblock(struct tdb_context *tdb, int list, int ltype);
|
||||
int tdb_unlock(struct tdb_context *tdb, int list, int ltype);
|
||||
int tdb_brlock(struct tdb_context *tdb, tdb_off_t offset, int rw_type, int lck_type, int probe, size_t len);
|
||||
int tdb_transaction_lock(struct tdb_context *tdb, int ltype);
|
||||
|
@ -219,9 +219,12 @@ static int transaction_write(struct tdb_context *tdb, tdb_off_t off,
|
||||
uint8_t **new_blocks;
|
||||
/* expand the blocks array */
|
||||
if (tdb->transaction->blocks == NULL) {
|
||||
new_blocks = malloc((blk+1)*sizeof(uint8_t *));
|
||||
new_blocks = (uint8_t **)malloc(
|
||||
(blk+1)*sizeof(uint8_t *));
|
||||
} else {
|
||||
new_blocks = realloc(tdb->transaction->blocks, (blk+1)*sizeof(uint8_t *));
|
||||
new_blocks = (uint8_t **)realloc(
|
||||
tdb->transaction->blocks,
|
||||
(blk+1)*sizeof(uint8_t *));
|
||||
}
|
||||
if (new_blocks == NULL) {
|
||||
tdb->ecode = TDB_ERR_OOM;
|
||||
|
@ -223,6 +223,9 @@ int tdb_traverse_read(struct tdb_context *tdb,
|
||||
/*
|
||||
a write style traverse - needs to get the transaction lock to
|
||||
prevent deadlocks
|
||||
|
||||
WARNING: The data buffer given to the callback fn does NOT meet the
|
||||
alignment restrictions malloc gives you.
|
||||
*/
|
||||
int tdb_traverse(struct tdb_context *tdb,
|
||||
tdb_traverse_func fn, void *private_data)
|
||||
|
@ -130,6 +130,9 @@ int tdb_traverse(TDB_CONTEXT *tdb, int (*fn)(TDB_CONTEXT *tdb,
|
||||
a non-zero return value from fn() indicates that the traversal
|
||||
should stop. Traversal callbacks may not start transactions.
|
||||
|
||||
WARNING: The data buffer given to the callback fn does NOT meet the
|
||||
alignment restrictions malloc gives you.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
int tdb_traverse_read(TDB_CONTEXT *tdb, int (*fn)(TDB_CONTEXT *tdb,
|
||||
TDB_DATA key, TDB_DATA dbuf, void *state), void *state);
|
||||
|
@ -32,9 +32,9 @@ extern "C" {
|
||||
|
||||
|
||||
/* flags to tdb_store() */
|
||||
#define TDB_REPLACE 1
|
||||
#define TDB_INSERT 2
|
||||
#define TDB_MODIFY 3
|
||||
#define TDB_REPLACE 1 /* Unused */
|
||||
#define TDB_INSERT 2 /* Don't overwrite an existing entry */
|
||||
#define TDB_MODIFY 3 /* Don't create an existing entry */
|
||||
|
||||
/* flags for tdb_open() */
|
||||
#define TDB_DEFAULT 0 /* just a readability place holder */
|
||||
@ -157,7 +157,6 @@ int tdb_printfreelist(struct tdb_context *tdb);
|
||||
int tdb_validate_freelist(struct tdb_context *tdb, int *pnum_entries);
|
||||
int tdb_wipe_all(struct tdb_context *tdb);
|
||||
int tdb_freelist_size(struct tdb_context *tdb);
|
||||
int tdb_validate(struct tdb_context *tdb);
|
||||
|
||||
extern TDB_DATA tdb_null;
|
||||
|
||||
|
@ -135,7 +135,7 @@ static void print_data(const char *buf,int len)
|
||||
if (len<=0) return;
|
||||
printf("[%03X] ",i);
|
||||
for (i=0;i<len;) {
|
||||
printf("%02X ",(int)buf[i]);
|
||||
printf("%02X ",(int)((unsigned char)buf[i]));
|
||||
i++;
|
||||
if (i%8 == 0) printf(" ");
|
||||
if (i%16 == 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user