X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Fcheck.c;h=ca5479b56d06fbf9650982a6c7b34325b11dc62e;hp=f005a48de317ee80890e7b0d187948c49e8c46be;hb=06e0037d97f5e1d83667ec40627cef862f3b7b85;hpb=39f01834db9b6a21d076e67d1e3143ab99aaf43e diff --git a/ccan/tdb2/check.c b/ccan/tdb2/check.c index f005a48d..ca5479b5 100644 --- a/ccan/tdb2/check.c +++ b/ccan/tdb2/check.c @@ -86,8 +86,8 @@ static bool check_header(struct tdb_context *tdb) static int off_cmp(const tdb_off_t *a, const tdb_off_t *b) { /* Can overflow an int. */ - return a > b ? 1 - : a < b ? -1 + return *a > *b ? 1 + : *a < *b ? -1 : 0; } @@ -187,7 +187,8 @@ static bool check_hash_list(struct tdb_context *tdb, num_nonzero++; } - if (num_found != num_used) { + /* free table and hash table are two of the used blocks. */ + if (num_found != num_used - 2) { tdb->log(tdb, TDB_DEBUG_ERROR, tdb->log_priv, "tdb_check: Not all entries are in hash\n"); return false; @@ -322,11 +323,10 @@ int tdb_check(struct tdb_context *tdb, size_t num_free = 0, num_used = 0; bool hash_found = false, free_found = false; + /* This always ensures the header is uptodate. */ if (tdb_allrecord_lock(tdb, F_RDLCK, TDB_LOCK_WAIT, false) != 0) return -1; - update_header(tdb); - if (!check_header(tdb)) goto fail; @@ -403,9 +403,9 @@ int tdb_check(struct tdb_context *tdb, goto fail; tdb_allrecord_unlock(tdb, F_RDLCK); - return true; + return 0; fail: tdb_allrecord_unlock(tdb, F_RDLCK); - return false; + return -1; }