The branch, master has been updated via a444bb9 tdb: Add a comment explaining the "check" via 3109b54 tdb: Make tdb_new_database() follow a more conventional style via d972e6f tdb: Fix a typo via c04de8f tdb: Fix a typo via 24755d7 tdb: Use tdb_lock_covered_by_allrecord_lock in tdb_unlock via f8dafe5 tdb: Factor out tdb_lock_covered_by_allrecord_lock from tdb_lock_list via 26b8545 tdb: Simplify logic in tdb_lock_list slightly via 0f4e7a1 tdb: Slightly simplify tdb_lock_list via 116ec13 tdb: Fix blank line endings via 7237fdd tdb: Fix a comment via d2b852d tdb: Fix a typo via 2c3fd8a tdb: Fix a missing CONVERT from 2148d86 Fix bug #9196 - defer_open is triggered multiple times on the same request.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit a444bb95a270ca5b331041c11a7e785c1e0559b7 Author: Volker Lendecke <v...@samba.org> Date: Fri Dec 14 16:07:11 2012 +0100 tdb: Add a comment explaining the "check" I had to ask git blame to find why we have to do it here... Reviewed-by: Rusty Russell <ru...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> Autobuild-User(master): Stefan Metzmacher <me...@samba.org> Autobuild-Date(master): Fri Dec 21 13:54:39 CET 2012 on sn-devel-104 commit 3109b541c9b2f0063e1ccb0cdaec0a8e388b29b4 Author: Volker Lendecke <v...@samba.org> Date: Fri Dec 14 15:53:08 2012 +0100 tdb: Make tdb_new_database() follow a more conventional style We usually "goto fail" on every error and then in normal flow set the return variable to success. This patch removes a comment which from my point of view is now obsolete. It violates the {} rule from README.Coding here in favor of the style used in this function. Reviewed-by: Rusty Russell <ru...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit d972e6fa74b6499403d4c3d3c6a84cbda7eded39 Author: Volker Lendecke <v...@samba.org> Date: Fri Dec 14 14:50:08 2012 +0100 tdb: Fix a typo Reviewed-by: Rusty Russell <ru...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit c04de8f3a4deba0062f8cdbcbe74d3735a80b735 Author: Volker Lendecke <v...@samba.org> Date: Fri Dec 14 14:48:31 2012 +0100 tdb: Fix a typo Reviewed-by: Rusty Russell <ru...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit 24755d75b0ee7170195bc26cf28bab4ffdb6f752 Author: Volker Lendecke <v...@samba.org> Date: Fri Dec 14 09:24:06 2012 +0100 tdb: Use tdb_lock_covered_by_allrecord_lock in tdb_unlock Reviewed-by: Rusty Russell <ru...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit f8dafe5685008671f4f983a4defc90b4a05cf992 Author: Volker Lendecke <v...@samba.org> Date: Fri Dec 14 09:21:42 2012 +0100 tdb: Factor out tdb_lock_covered_by_allrecord_lock from tdb_lock_list Reviewed-by: Rusty Russell <ru...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit 26b8545df44df7e60ba0ba7336ffbdda8a14e423 Author: Volker Lendecke <v...@samba.org> Date: Thu Dec 13 22:14:34 2012 +0100 tdb: Simplify logic in tdb_lock_list slightly Reviewed-by: Rusty Russell <ru...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit 0f4e7a1401998746a6818b9469ab369d70418ac1 Author: Volker Lendecke <v...@samba.org> Date: Thu Dec 13 21:58:00 2012 +0100 tdb: Slightly simplify tdb_lock_list Avoid an else {} branch when we can do an early return Reviewed-by: Rusty Russell <ru...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit 116ec13bb0718eb1de1ac1f4410d5c33f1db616f Author: Volker Lendecke <v...@samba.org> Date: Thu Dec 13 13:31:59 2012 +0100 tdb: Fix blank line endings Reviewed-by: Rusty Russell <ru...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit 7237fdd4ddc0b9c848b5936431b4f8731ce56dba Author: Volker Lendecke <v...@samba.org> Date: Fri Dec 14 08:01:12 2012 +0100 tdb: Fix a comment Reviewed-by: Rusty Russell <ru...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit d2b852d79bd83754d8952a0e3dece00e513549f2 Author: Volker Lendecke <v...@samba.org> Date: Thu Dec 13 12:36:29 2012 +0100 tdb: Fix a typo Reviewed-by: Rusty Russell <ru...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> commit 2c3fd8a13e7dde23a23404cd88078a04c8b338ea Author: Volker Lendecke <v...@samba.org> Date: Tue Dec 11 21:04:58 2012 +0100 tdb: Fix a missing CONVERT methods->tdb_write expects data in on-disk format. For reading that record, methods->tdb_read() has taken care of the on-disk to in-memory representation according to the DOCONV() flag passed down. tdb_rec_write() is a wrapper around methods->tdb_write just doing the CONVERT() on the way to disk. Reviewed-by: Rusty Russell <ru...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> ----------------------------------------------------------------------- Summary of changes: lib/tdb/common/dump.c | 10 +++--- lib/tdb/common/error.c | 2 +- lib/tdb/common/freelist.c | 26 +++++++------- lib/tdb/common/io.c | 18 +++++----- lib/tdb/common/lock.c | 78 ++++++++++++++++++++++++++--------------- lib/tdb/common/open.c | 13 ++++--- lib/tdb/common/summary.c | 4 +- lib/tdb/common/tdb.c | 20 +++++----- lib/tdb/common/tdb_private.h | 2 +- lib/tdb/common/transaction.c | 74 ++++++++++++++++++++-------------------- lib/tdb/common/traverse.c | 16 ++++---- 11 files changed, 142 insertions(+), 121 deletions(-) Changeset truncated at 500 lines: diff --git a/lib/tdb/common/dump.c b/lib/tdb/common/dump.c index 67de04e..207bb24 100644 --- a/lib/tdb/common/dump.c +++ b/lib/tdb/common/dump.c @@ -1,4 +1,4 @@ - /* + /* Unix SMB/CIFS implementation. trivial database library @@ -33,7 +33,7 @@ static tdb_off_t tdb_dump_record(struct tdb_context *tdb, int hash, struct tdb_record rec; tdb_off_t tailer_ofs, tailer; - if (tdb->methods->tdb_read(tdb, offset, (char *)&rec, + if (tdb->methods->tdb_read(tdb, offset, (char *)&rec, sizeof(rec), DOCONV()) == -1) { printf("ERROR: failed to read record at %u\n", offset); return 0; @@ -110,7 +110,7 @@ _PUBLIC_ int tdb_printfreelist(struct tdb_context *tdb) printf("freelist top=[0x%08x]\n", rec_ptr ); while (rec_ptr) { - if (tdb->methods->tdb_read(tdb, rec_ptr, (char *)&rec, + if (tdb->methods->tdb_read(tdb, rec_ptr, (char *)&rec, sizeof(rec), DOCONV()) == -1) { tdb_unlock(tdb, -1, F_WRLCK); return -1; @@ -122,14 +122,14 @@ _PUBLIC_ int tdb_printfreelist(struct tdb_context *tdb) return -1; } - printf("entry offset=[0x%08x], rec.rec_len = [0x%08x (%d)] (end = 0x%08x)\n", + printf("entry offset=[0x%08x], rec.rec_len = [0x%08x (%d)] (end = 0x%08x)\n", rec_ptr, rec.rec_len, rec.rec_len, rec_ptr + rec.rec_len); total_free += rec.rec_len; /* move to the next record */ rec_ptr = rec.next; } - printf("total rec_len = [0x%08x (%d)]\n", (int)total_free, + printf("total rec_len = [0x%08x (%d)]\n", (int)total_free, (int)total_free); return tdb_unlock(tdb, -1, F_WRLCK); diff --git a/lib/tdb/common/error.c b/lib/tdb/common/error.c index 2aaaa81..478eb88 100644 --- a/lib/tdb/common/error.c +++ b/lib/tdb/common/error.c @@ -1,4 +1,4 @@ - /* + /* Unix SMB/CIFS implementation. trivial database library diff --git a/lib/tdb/common/freelist.c b/lib/tdb/common/freelist.c index 6358f64..0de1fb4 100644 --- a/lib/tdb/common/freelist.c +++ b/lib/tdb/common/freelist.c @@ -1,4 +1,4 @@ - /* + /* Unix SMB/CIFS implementation. trivial database library @@ -28,7 +28,7 @@ #include "tdb_private.h" /* 'right' merges can involve O(n^2) cost when combined with a - traverse, so they are disabled until we find a way to do them in + traverse, so they are disabled until we find a way to do them in O(1) time */ #define USE_RIGHT_MERGES 0 @@ -42,17 +42,17 @@ int tdb_rec_free_read(struct tdb_context *tdb, tdb_off_t off, struct tdb_record if (rec->magic == TDB_MAGIC) { /* this happens when a app is showdown while deleting a record - we should not completely fail when this happens */ - TDB_LOG((tdb, TDB_DEBUG_WARNING, "tdb_rec_free_read non-free magic 0x%x at offset=%d - fixing\n", + TDB_LOG((tdb, TDB_DEBUG_WARNING, "tdb_rec_free_read non-free magic 0x%x at offset=%d - fixing\n", rec->magic, off)); rec->magic = TDB_FREE_MAGIC; - if (tdb->methods->tdb_write(tdb, off, rec, sizeof(*rec)) == -1) + if (tdb_rec_write(tdb, off, rec) == -1) return -1; } if (rec->magic != TDB_FREE_MAGIC) { /* Ensure ecode is set for log fn. */ tdb->ecode = TDB_ERR_CORRUPT; - TDB_LOG((tdb, TDB_DEBUG_WARNING, "tdb_rec_free_read bad magic 0x%x at offset=%d\n", + TDB_LOG((tdb, TDB_DEBUG_WARNING, "tdb_rec_free_read bad magic 0x%x at offset=%d\n", rec->magic, off)); return -1; } @@ -170,7 +170,7 @@ left: /* If it's free, expand to include it. */ if (l.magic == TDB_FREE_MAGIC) { - /* we now merge the new record into the left record, rather than the other + /* we now merge the new record into the left record, rather than the other way around. This makes the operation O(1) instead of O(n). This change prevents traverse from being O(n^2) after a lot of deletes */ l.rec_len += sizeof(*rec) + rec->rec_len; @@ -210,7 +210,7 @@ update: -/* +/* the core of tdb_allocate - called when we have decided which free list entry to use @@ -218,7 +218,7 @@ update: not the beginning. This is so the left merge in a free is more likely to be able to free up the record without fragmentation */ -static tdb_off_t tdb_allocate_ofs(struct tdb_context *tdb, +static tdb_off_t tdb_allocate_ofs(struct tdb_context *tdb, tdb_len_t length, tdb_off_t rec_ptr, struct tdb_record *rec, tdb_off_t last_ptr) { @@ -250,7 +250,7 @@ static tdb_off_t tdb_allocate_ofs(struct tdb_context *tdb, } /* and setup the new record */ - rec_ptr += sizeof(*rec) + rec->rec_len; + rec_ptr += sizeof(*rec) + rec->rec_len; memset(rec, '\0', sizeof(*rec)); rec->rec_len = length; @@ -303,7 +303,7 @@ tdb_off_t tdb_allocate(struct tdb_context *tdb, tdb_len_t length, struct tdb_rec bestfit.last_ptr = 0; bestfit.rec_len = 0; - /* + /* this is a best fit allocation strategy. Originally we used a first fit strategy, but it suffered from massive fragmentation issues when faced with a slowly increasing record size. @@ -347,7 +347,7 @@ tdb_off_t tdb_allocate(struct tdb_context *tdb, tdb_len_t length, struct tdb_rec goto fail; } - newrec_ptr = tdb_allocate_ofs(tdb, length, bestfit.rec_ptr, + newrec_ptr = tdb_allocate_ofs(tdb, length, bestfit.rec_ptr, rec, bestfit.last_ptr); tdb_unlock(tdb, -1, F_WRLCK); return newrec_ptr; @@ -364,8 +364,8 @@ tdb_off_t tdb_allocate(struct tdb_context *tdb, tdb_len_t length, struct tdb_rec -/* - return the size of the freelist - used to decide if we should repack +/* + return the size of the freelist - used to decide if we should repack */ _PUBLIC_ int tdb_freelist_size(struct tdb_context *tdb) { diff --git a/lib/tdb/common/io.c b/lib/tdb/common/io.c index 25968bf..2e0a206 100644 --- a/lib/tdb/common/io.c +++ b/lib/tdb/common/io.c @@ -1,4 +1,4 @@ - /* + /* Unix SMB/CIFS implementation. trivial database library @@ -30,7 +30,7 @@ /* check for an out of bounds access - if it is out of bounds then see if the database has been expanded by someone else and expand - if necessary + if necessary */ static int tdb_oob(struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, int probe) @@ -100,7 +100,7 @@ static int tdb_oob(struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, } /* write a lump of data at a specified offset */ -static int tdb_write(struct tdb_context *tdb, tdb_off_t off, +static int tdb_write(struct tdb_context *tdb, tdb_off_t off, const void *buf, tdb_len_t len) { if (len == 0) { @@ -162,7 +162,7 @@ void *tdb_convert(void *buf, uint32_t size) /* read a lump of data at a specified offset, maybe convert */ -static int tdb_read(struct tdb_context *tdb, tdb_off_t off, void *buf, +static int tdb_read(struct tdb_context *tdb, tdb_off_t off, void *buf, tdb_len_t len, int cv) { if (tdb->methods->tdb_oob(tdb, off, len, 0) != 0) { @@ -199,7 +199,7 @@ static int tdb_read(struct tdb_context *tdb, tdb_off_t off, void *buf, /* do an unlocked scan of the hash table heads to find the next non-zero head. The value will then be confirmed with the lock held -*/ +*/ static void tdb_next_hash_chain(struct tdb_context *tdb, uint32_t *chain) { uint32_t h = *chain; @@ -256,8 +256,8 @@ int tdb_mmap(struct tdb_context *tdb) #ifdef HAVE_MMAP if (should_mmap(tdb)) { - tdb->map_ptr = mmap(NULL, tdb->map_size, - PROT_READ|(tdb->read_only? 0:PROT_WRITE), + tdb->map_ptr = mmap(NULL, tdb->map_size, + PROT_READ|(tdb->read_only? 0:PROT_WRITE), MAP_SHARED|MAP_FILE, tdb->fd, 0); /* @@ -266,7 +266,7 @@ int tdb_mmap(struct tdb_context *tdb) if (tdb->map_ptr == MAP_FAILED) { tdb->map_ptr = NULL; - TDB_LOG((tdb, TDB_DEBUG_WARNING, "tdb_mmap failed for size %d (%s)\n", + TDB_LOG((tdb, TDB_DEBUG_WARNING, "tdb_mmap failed for size %d (%s)\n", tdb->map_size, strerror(errno))); #ifdef HAVE_INCOHERENT_MMAP tdb->ecode = TDB_ERR_IO; @@ -305,7 +305,7 @@ static int tdb_expand_file(struct tdb_context *tdb, tdb_off_t size, tdb_off_t ad errno = ENOSPC; } if (written != 1) { - TDB_LOG((tdb, TDB_DEBUG_FATAL, "expand_file to %d failed (%s)\n", + TDB_LOG((tdb, TDB_DEBUG_FATAL, "expand_file to %d failed (%s)\n", size+addition, strerror(errno))); return -1; } diff --git a/lib/tdb/common/lock.c b/lib/tdb/common/lock.c index 260fab6..7155a9f 100644 --- a/lib/tdb/common/lock.c +++ b/lib/tdb/common/lock.c @@ -1,4 +1,4 @@ - /* + /* Unix SMB/CIFS implementation. trivial database library @@ -126,10 +126,10 @@ static tdb_off_t lock_offset(int list) } /* a byte range locking function - return 0 on success - this functions locks/unlocks 1 byte at the specified offset. + this functions locks/unlocks "len" byte at the specified offset. On error, errno is also set so that errors are passed back properly - through tdb_open(). + through tdb_open(). note that a len of zero means lock to end of file */ @@ -201,7 +201,7 @@ int tdb_brunlock(struct tdb_context *tdb, upgrade a read lock to a write lock. This needs to be handled in a special way as some OSes (such as solaris) have too conservative deadlock detection and claim a deadlock when progress can be - made. For those OSes we may loop for a while. + made. For those OSes we may loop for a while. */ int tdb_allrecord_upgrade(struct tdb_context *tdb) { @@ -334,34 +334,60 @@ static bool have_data_locks(const struct tdb_context *tdb) return false; } +/* + * A allrecord lock allows us to avoid per chain locks. Check if the allrecord + * lock is strong enough. + */ +static int tdb_lock_covered_by_allrecord_lock(struct tdb_context *tdb, + int ltype) +{ + if (ltype == F_RDLCK) { + /* + * The allrecord_lock is equal (F_RDLCK) or stronger + * (F_WRLCK). Pass. + */ + return 0; + } + + if (tdb->allrecord_lock.ltype == F_RDLCK) { + /* + * We ask for ltype==F_WRLCK, but the allrecord_lock + * is too weak. We can't upgrade here, so fail. + */ + tdb->ecode = TDB_ERR_LOCK; + return -1; + } + + /* + * Asking for F_WRLCK, allrecord is F_WRLCK as well. Pass. + */ + return 0; +} + static int tdb_lock_list(struct tdb_context *tdb, int list, int ltype, enum tdb_lock_flags waitflag) { int ret; bool check = false; - /* a allrecord lock allows us to avoid per chain locks */ - if (tdb->allrecord_lock.count && - (ltype == tdb->allrecord_lock.ltype || ltype == F_RDLCK)) { - return 0; + if (tdb->allrecord_lock.count) { + return tdb_lock_covered_by_allrecord_lock(tdb, ltype); } - if (tdb->allrecord_lock.count) { - tdb->ecode = TDB_ERR_LOCK; - ret = -1; - } else { - /* Only check when we grab first data lock. */ - check = !have_data_locks(tdb); - ret = tdb_nest_lock(tdb, lock_offset(list), ltype, waitflag); + /* + * Check for recoveries: Someone might have kill -9'ed a process + * during a commit. + */ + check = !have_data_locks(tdb); + ret = tdb_nest_lock(tdb, lock_offset(list), ltype, waitflag); - if (ret == 0 && check && tdb_needs_recovery(tdb)) { - tdb_nest_unlock(tdb, lock_offset(list), ltype, false); + if (ret == 0 && check && tdb_needs_recovery(tdb)) { + tdb_nest_unlock(tdb, lock_offset(list), ltype, false); - if (tdb_lock_and_recover(tdb) == -1) { - return -1; - } - return tdb_lock_list(tdb, list, ltype, waitflag); + if (tdb_lock_and_recover(tdb) == -1) { + return -1; } + return tdb_lock_list(tdb, list, ltype, waitflag); } return ret; } @@ -441,21 +467,15 @@ int tdb_nest_unlock(struct tdb_context *tdb, uint32_t offset, int ltype, } if (ret) - TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_unlock: An error occurred unlocking!\n")); + TDB_LOG((tdb, TDB_DEBUG_ERROR, "tdb_unlock: An error occurred unlocking!\n")); return ret; } _PUBLIC_ int tdb_unlock(struct tdb_context *tdb, int list, int ltype) { /* a global lock allows us to avoid per chain locks */ - if (tdb->allrecord_lock.count && - (ltype == tdb->allrecord_lock.ltype || ltype == F_RDLCK)) { - return 0; - } - if (tdb->allrecord_lock.count) { - tdb->ecode = TDB_ERR_LOCK; - return -1; + return tdb_lock_covered_by_allrecord_lock(tdb, ltype); } return tdb_nest_unlock(tdb, lock_offset(list), ltype, false); diff --git a/lib/tdb/common/open.c b/lib/tdb/common/open.c index d9f76f0..b10f5eb 100644 --- a/lib/tdb/common/open.c +++ b/lib/tdb/common/open.c @@ -1,4 +1,4 @@ - /* + /* Unix SMB/CIFS implementation. trivial database library @@ -94,10 +94,11 @@ static int tdb_new_database(struct tdb_context *tdb, int hash_size) memcpy(&tdb->header, newdb, sizeof(tdb->header)); /* Don't endian-convert the magic food! */ memcpy(newdb->magic_food, TDB_MAGIC_FOOD, strlen(TDB_MAGIC_FOOD)+1); - /* we still have "ret == -1" here */ - if (tdb_write_all(tdb->fd, newdb, size)) - ret = 0; + if (!tdb_write_all(tdb->fd, newdb, size)) + goto fail; + + ret = 0; fail: SAFE_FREE(newdb); return ret; @@ -119,13 +120,13 @@ static int tdb_already_open(dev_t device, return 0; } -/* open the database, creating it if necessary +/* open the database, creating it if necessary The open_flags and mode are passed straight to the open call on the database file. A flags value of O_WRONLY is invalid. The hash size is advisory, use zero for a default value. - Return is NULL on error, in which case errno is also set. Don't + Return is NULL on error, in which case errno is also set. Don't try to call tdb_error or tdb_errname, just do strerror(errno). @param name may be NULL for internal databases. */ diff --git a/lib/tdb/common/summary.c b/lib/tdb/common/summary.c index 171a1a2..8257261 100644 --- a/lib/tdb/common/summary.c +++ b/lib/tdb/common/summary.c @@ -1,7 +1,7 @@ - /* + /* Trivial Database: human-readable summary code Copyright (C) Rusty Russell 2010 - + This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either diff --git a/lib/tdb/common/tdb.c b/lib/tdb/common/tdb.c index fc1f560..7d1a40e 100644 --- a/lib/tdb/common/tdb.c +++ b/lib/tdb/common/tdb.c @@ -1,4 +1,4 @@ - /* + /* Unix SMB/CIFS implementation. trivial database library @@ -152,7 +152,7 @@ static int tdb_update_hash(struct tdb_context *tdb, TDB_DATA key, uint32_t hash, /* it could be an exact duplicate of what is there - this is * surprisingly common (eg. with a ldb re-index). */ - if (rec.key_len == key.dsize && + if (rec.key_len == key.dsize && rec.data_len == dbuf.dsize && rec.full_hash == hash && tdb_parse_record(tdb, key, tdb_update_hash_cmp, &dbuf) == 0) { @@ -258,7 +258,7 @@ _PUBLIC_ int tdb_parse_record(struct tdb_context *tdb, TDB_DATA key, return ret; } -/* check if an entry in the database exists +/* check if an entry in the database exists note that 1 is returned if the key is found and 0 is returned if not found this doesn't match the conventions in the rest of this module, but is @@ -777,7 +777,7 @@ _PUBLIC_ void tdb_enable_seqnum(struct tdb_context *tdb) /* - add a region of the file to the freelist. Length is the size of the region in bytes, + add a region of the file to the freelist. Length is the size of the region in bytes, which includes the free list header that needs to be added */ static int tdb_free_region(struct tdb_context *tdb, tdb_off_t offset, ssize_t length) @@ -789,7 +789,7 @@ static int tdb_free_region(struct tdb_context *tdb, tdb_off_t offset, ssize_t le } if (length + offset > tdb->map_size) { TDB_LOG((tdb, TDB_DEBUG_FATAL,"tdb_free_region: adding region beyond end of file\n")); - return -1; + return -1; } memset(&rec,'\0',sizeof(rec)); rec.rec_len = length - sizeof(rec); @@ -835,7 +835,7 @@ _PUBLIC_ int tdb_wipe_all(struct tdb_context *tdb) if (tdb->methods->tdb_read(tdb, recovery_head, &rec, sizeof(rec), DOCONV()) == -1) { TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_wipe_all: failed to read recovery record\n")); return -1; - } + } recovery_size = rec.rec_len + sizeof(rec); } @@ -853,7 +853,7 @@ _PUBLIC_ int tdb_wipe_all(struct tdb_context *tdb) goto failed; } - /* add all the rest of the file to the freelist, possibly leaving a gap + /* add all the rest of the file to the freelist, possibly leaving a gap for the recovery area */ if (recovery_size == 0) { /* the simple case - the whole file can be used as a freelist */ @@ -863,7 +863,7 @@ _PUBLIC_ int tdb_wipe_all(struct tdb_context *tdb) } } else { /* we need to add two freelist entries - one on either - side of the recovery area + side of the recovery area Note that we cannot shift the recovery area during this operation. Only the transaction.c code may @@ -942,7 +942,7 @@ _PUBLIC_ int tdb_repack(struct tdb_context *tdb) TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Failed to traverse copying out\n")); tdb_transaction_cancel(tdb); -- Samba Shared Repository