From: Rusty Russell Date: Wed, 21 Oct 2009 13:39:43 +0000 (+1030) Subject: lib/tdb: wean off TDB_ERRCODE. X-Git-Tag: tdb-1.2.0~552 X-Git-Url: http://git.samba.org/samba.git/?p=ira%2Fwip.git;a=commitdiff_plain;h=b77f41d58b05101e02d8ac0e54cb0e30807d89c2 lib/tdb: wean off TDB_ERRCODE. It was a regrettable hack which I used to reduce line count in tdb; in fact it caused confusion as can be seen in this patch. In particular, ecode now needs to be set before TDB_LOG anyway, and having it exposed in the header is useless (the struct tdb_context isn't defined, so it's doubly useless). Also, we should never set errno, as io.c was doing. Signed-off-by: Rusty Russell --- diff --git a/lib/tdb/common/freelist.c b/lib/tdb/common/freelist.c index 3bc3965141b..dedf78cf921 100644 --- a/lib/tdb/common/freelist.c +++ b/lib/tdb/common/freelist.c @@ -54,7 +54,7 @@ int tdb_rec_free_read(struct tdb_context *tdb, tdb_off_t off, struct list_struct tdb->ecode = TDB_ERR_CORRUPT; TDB_LOG((tdb, TDB_DEBUG_WARNING, "tdb_rec_free_read bad magic 0x%x at offset=%d\n", rec->magic, off)); - return TDB_ERRCODE(TDB_ERR_CORRUPT, -1); + return -1; } if (tdb->methods->tdb_oob(tdb, rec->next+sizeof(*rec), 0) != 0) return -1; @@ -78,8 +78,9 @@ static int remove_from_freelist(struct tdb_context *tdb, tdb_off_t off, tdb_off_ /* Follow chain (next offset is at start of record) */ last_ptr = i; } + tdb->ecode = TDB_ERR_CORRUPT; TDB_LOG((tdb, TDB_DEBUG_FATAL,"remove_from_freelist: not on list at off=%d\n", off)); - return TDB_ERRCODE(TDB_ERR_CORRUPT, -1); + return -1; } #endif diff --git a/lib/tdb/common/freelistcheck.c b/lib/tdb/common/freelistcheck.c index efc050df9c6..972b2a41c49 100644 --- a/lib/tdb/common/freelistcheck.c +++ b/lib/tdb/common/freelistcheck.c @@ -67,7 +67,8 @@ int tdb_validate_freelist(struct tdb_context *tdb, int *pnum_entries) /* Store the FREELIST_TOP record. */ if (seen_insert(mem_tdb, last_ptr) == -1) { - ret = TDB_ERRCODE(TDB_ERR_CORRUPT, -1); + tdb->ecode = TDB_ERR_CORRUPT; + ret = -1; goto fail; } @@ -83,7 +84,8 @@ int tdb_validate_freelist(struct tdb_context *tdb, int *pnum_entries) be corrupt. */ if (seen_insert(mem_tdb, rec_ptr)) { - ret = TDB_ERRCODE(TDB_ERR_CORRUPT, -1); + tdb->ecode = TDB_ERR_CORRUPT; + ret = -1; goto fail; } diff --git a/lib/tdb/common/io.c b/lib/tdb/common/io.c index a0b3a3f24a4..cc52bcfd69f 100644 --- a/lib/tdb/common/io.c +++ b/lib/tdb/common/io.c @@ -45,11 +45,12 @@ static int tdb_oob(struct tdb_context *tdb, tdb_off_t len, int probe) TDB_LOG((tdb, TDB_DEBUG_FATAL,"tdb_oob len %d beyond internal malloc size %d\n", (int)len, (int)tdb->map_size)); } - return TDB_ERRCODE(TDB_ERR_IO, -1); + return -1; } if (fstat(tdb->fd, &st) == -1) { - return TDB_ERRCODE(TDB_ERR_IO, -1); + tdb->ecode = TDB_ERR_IO; + return -1; } if (st.st_size < (size_t)len) { @@ -59,12 +60,14 @@ static int tdb_oob(struct tdb_context *tdb, tdb_off_t len, int probe) TDB_LOG((tdb, TDB_DEBUG_FATAL,"tdb_oob len %d beyond eof at %d\n", (int)len, (int)st.st_size)); } - return TDB_ERRCODE(TDB_ERR_IO, -1); + return -1; } /* Unmap, update size, remap */ - if (tdb_munmap(tdb) == -1) - return TDB_ERRCODE(TDB_ERR_IO, -1); + if (tdb_munmap(tdb) == -1) { + tdb->ecode = TDB_ERR_IO; + return -1; + } tdb->map_size = st.st_size; tdb_mmap(tdb); return 0; @@ -92,27 +95,27 @@ static int tdb_write(struct tdb_context *tdb, tdb_off_t off, ssize_t written = pwrite(tdb->fd, buf, len, off); if ((written != (ssize_t)len) && (written != -1)) { /* try once more */ + tdb->ecode = TDB_ERR_IO; TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_write: wrote only " "%d of %d bytes at %d, trying once more\n", (int)written, len, off)); - errno = ENOSPC; - written = pwrite(tdb->fd, (const void *)((const char *)buf+written), + written = pwrite(tdb->fd, (const char *)buf+written, len-written, off+written); } if (written == -1) { - /* Ensure ecode is set for log fn. */ - tdb->ecode = TDB_ERR_IO; + /* Ensure ecode is set for log fn. */ + tdb->ecode = TDB_ERR_IO; TDB_LOG((tdb, TDB_DEBUG_FATAL,"tdb_write failed at %d " "len=%d (%s)\n", off, len, strerror(errno))); - return TDB_ERRCODE(TDB_ERR_IO, -1); + return -1; } else if (written != (ssize_t)len) { + tdb->ecode = TDB_ERR_IO; TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_write: failed to " "write %d bytes at %d in two attempts\n", len, off)); - errno = ENOSPC; - return TDB_ERRCODE(TDB_ERR_IO, -1); - } + return -1; + } } return 0; } @@ -146,7 +149,7 @@ static int tdb_read(struct tdb_context *tdb, tdb_off_t off, void *buf, "len=%d ret=%d (%s) map_size=%d\n", (int)off, (int)len, (int)ret, strerror(errno), (int)tdb->map_size)); - return TDB_ERRCODE(TDB_ERR_IO, -1); + return -1; } } if (cv) { @@ -389,7 +392,7 @@ unsigned char *tdb_alloc_read(struct tdb_context *tdb, tdb_off_t offset, tdb_len tdb->ecode = TDB_ERR_OOM; TDB_LOG((tdb, TDB_DEBUG_ERROR,"tdb_alloc_read malloc failed len=%d (%s)\n", len, strerror(errno))); - return TDB_ERRCODE(TDB_ERR_OOM, buf); + return NULL; } if (tdb->methods->tdb_read(tdb, offset, buf, len, 0) == -1) { SAFE_FREE(buf); @@ -441,7 +444,7 @@ int tdb_rec_read(struct tdb_context *tdb, tdb_off_t offset, struct list_struct * /* Ensure ecode is set for log fn. */ tdb->ecode = TDB_ERR_CORRUPT; TDB_LOG((tdb, TDB_DEBUG_FATAL,"tdb_rec_read bad magic 0x%x at offset=%d\n", rec->magic, offset)); - return TDB_ERRCODE(TDB_ERR_CORRUPT, -1); + return -1; } return tdb->methods->tdb_oob(tdb, rec->next+sizeof(*rec), 0); } diff --git a/lib/tdb/common/lock.c b/lib/tdb/common/lock.c index 3414049cb61..0984e516ea1 100644 --- a/lib/tdb/common/lock.c +++ b/lib/tdb/common/lock.c @@ -75,16 +75,15 @@ int tdb_brlock(struct tdb_context *tdb, tdb_off_t offset, } while (ret == -1 && errno == EINTR); if (ret == -1) { + tdb->ecode = TDB_ERR_LOCK; /* Generic lock error. errno set by fcntl. * EAGAIN is an expected return from non-blocking * locks. */ if (!probe && lck_type != F_SETLK) { - /* Ensure error code is set for log fun to examine. */ - tdb->ecode = TDB_ERR_LOCK; TDB_LOG((tdb, TDB_DEBUG_TRACE,"tdb_brlock failed (fd=%d) at offset %d rw_type=%d lck_type=%d len=%d\n", tdb->fd, offset, rw_type, lck_type, (int)len)); } - return TDB_ERRCODE(TDB_ERR_LOCK, -1); + return -1; } return 0; } @@ -133,10 +132,12 @@ static int _tdb_lock(struct tdb_context *tdb, int list, int ltype, int op) } if (tdb->global_lock.count) { - return TDB_ERRCODE(TDB_ERR_LOCK, -1); + tdb->ecode = TDB_ERR_LOCK; + return -1; } if (list < -1 || list >= (int)tdb->header.hash_size) { + tdb->ecode = TDB_ERR_LOCK; TDB_LOG((tdb, TDB_DEBUG_ERROR,"tdb_lock: invalid list %d for ltype=%d\n", list, ltype)); return -1; @@ -228,7 +229,8 @@ int tdb_unlock(struct tdb_context *tdb, int list, int ltype) } if (tdb->global_lock.count) { - return TDB_ERRCODE(TDB_ERR_LOCK, -1); + tdb->ecode = TDB_ERR_LOCK; + return -1; } if (tdb->flags & TDB_NOLOCK) @@ -350,8 +352,10 @@ static int _tdb_lockall(struct tdb_context *tdb, int ltype, int op) ltype &= ~TDB_MARK_LOCK; /* There are no locks on read-only dbs */ - if (tdb->read_only || tdb->traverse_read) - return TDB_ERRCODE(TDB_ERR_LOCK, -1); + if (tdb->read_only || tdb->traverse_read) { + tdb->ecode = TDB_ERR_LOCK; + return -1; + } if (tdb->global_lock.count && tdb->global_lock.ltype == ltype) { tdb->global_lock.count++; @@ -360,12 +364,14 @@ static int _tdb_lockall(struct tdb_context *tdb, int ltype, int op) if (tdb->global_lock.count) { /* a global lock of a different type exists */ - return TDB_ERRCODE(TDB_ERR_LOCK, -1); + tdb->ecode = TDB_ERR_LOCK; + return -1; } if (tdb->num_locks != 0) { /* can't combine global and chain locks */ - return TDB_ERRCODE(TDB_ERR_LOCK, -1); + tdb->ecode = TDB_ERR_LOCK; + return -1; } if (!mark_lock && @@ -394,11 +400,13 @@ static int _tdb_unlockall(struct tdb_context *tdb, int ltype) /* There are no locks on read-only dbs */ if (tdb->read_only || tdb->traverse_read) { - return TDB_ERRCODE(TDB_ERR_LOCK, -1); + tdb->ecode = TDB_ERR_LOCK; + return -1; } if (tdb->global_lock.ltype != ltype || tdb->global_lock.count == 0) { - return TDB_ERRCODE(TDB_ERR_LOCK, -1); + tdb->ecode = TDB_ERR_LOCK; + return -1; } if (tdb->global_lock.count > 1) { diff --git a/lib/tdb/common/open.c b/lib/tdb/common/open.c index f0061d7b314..1ba2e7bd11a 100644 --- a/lib/tdb/common/open.c +++ b/lib/tdb/common/open.c @@ -55,8 +55,10 @@ static int tdb_new_database(struct tdb_context *tdb, int hash_size) /* We make it up in memory, then write it out if not internal */ size = sizeof(struct tdb_header) + (hash_size+1)*sizeof(tdb_off_t); - if (!(newdb = (struct tdb_header *)calloc(size, 1))) - return TDB_ERRCODE(TDB_ERR_OOM, -1); + if (!(newdb = (struct tdb_header *)calloc(size, 1))) { + tdb->ecode = TDB_ERR_OOM; + return -1; + } /* Fill in the header */ newdb->version = TDB_VERSION; diff --git a/lib/tdb/common/tdb.c b/lib/tdb/common/tdb.c index 7acc111cd86..7ee0bb73005 100644 --- a/lib/tdb/common/tdb.c +++ b/lib/tdb/common/tdb.c @@ -98,12 +98,14 @@ static tdb_off_t tdb_find(struct tdb_context *tdb, TDB_DATA key, uint32_t hash, } /* detect tight infinite loop */ if (rec_ptr == r->next) { + tdb->ecode = TDB_ERR_CORRUPT; TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_find: loop detected.\n")); - return TDB_ERRCODE(TDB_ERR_CORRUPT, 0); + return 0; } rec_ptr = r->next; } - return TDB_ERRCODE(TDB_ERR_NOEXIST, 0); + tdb->ecode = TDB_ERR_NOEXIST; + return 0; } /* As tdb_find, but if you succeed, keep the lock */ @@ -216,7 +218,8 @@ int tdb_parse_record(struct tdb_context *tdb, TDB_DATA key, if (!(rec_ptr = tdb_find_lock_hash(tdb,key,hash,F_RDLCK,&rec))) { tdb_trace_1rec_ret(tdb, "tdb_parse_record", key, -1); - return TDB_ERRCODE(TDB_ERR_NOEXIST, 0); + tdb->ecode = TDB_ERR_NOEXIST; + return 0; } tdb_trace_1rec_ret(tdb, "tdb_parse_record", key, 0); diff --git a/lib/tdb/common/transaction.c b/lib/tdb/common/transaction.c index 72855134305..16e12d64704 100644 --- a/lib/tdb/common/transaction.c +++ b/lib/tdb/common/transaction.c @@ -372,7 +372,8 @@ static int transaction_oob(struct tdb_context *tdb, tdb_off_t len, int probe) if (len <= tdb->map_size) { return 0; } - return TDB_ERRCODE(TDB_ERR_IO, -1); + tdb->ecode = TDB_ERR_IO; + return -1; } /* diff --git a/lib/tdb/common/traverse.c b/lib/tdb/common/traverse.c index 3c88c871434..8d808206f96 100644 --- a/lib/tdb/common/traverse.c +++ b/lib/tdb/common/traverse.c @@ -125,7 +125,8 @@ static tdb_off_t tdb_next_lock(struct tdb_context *tdb, struct tdb_traverse_lock want_next = 0; } /* We finished iteration without finding anything */ - return TDB_ERRCODE(TDB_SUCCESS, 0); + tdb->ecode = TDB_SUCCESS; + return 0; fail: tlock->off = 0; diff --git a/lib/tdb/include/tdb.h b/lib/tdb/include/tdb.h index 22496f56f01..c00b6cb33ed 100644 --- a/lib/tdb/include/tdb.h +++ b/lib/tdb/include/tdb.h @@ -49,8 +49,6 @@ extern "C" { #define TDB_SEQNUM 128 /* maintain a sequence number */ #define TDB_VOLATILE 256 /* Activate the per-hashchain freelist, default 5 */ -#define TDB_ERRCODE(code, ret) ((tdb->ecode = (code)), ret) - /* error codes */ enum TDB_ERROR {TDB_SUCCESS=0, TDB_ERR_CORRUPT, TDB_ERR_IO, TDB_ERR_LOCK, TDB_ERR_OOM, TDB_ERR_EXISTS, TDB_ERR_NOLOCK, TDB_ERR_LOCK_TIMEOUT,