diff options
author | Andrew Tridgell <tridge@samba.org> | 2008-01-06 12:33:57 +1100 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2008-01-06 12:33:57 +1100 |
commit | ff039b405fa2bcdc5d48e1ddddf5e009e7ff49e9 (patch) | |
tree | f6dff43c6b0681f0440b5008c25676e7b7b94c1a | |
parent | 43aa27c9eee3fb585d633841e201c60c2e6b7aa0 (diff) | |
download | samba-ff039b405fa2bcdc5d48e1ddddf5e009e7ff49e9.tar.gz samba-ff039b405fa2bcdc5d48e1ddddf5e009e7ff49e9.tar.xz samba-ff039b405fa2bcdc5d48e1ddddf5e009e7ff49e9.zip |
- added tdb_add_flags() and tdb_remove_flags()
- make freelist merging more paranoid
- fixed TDB_DATA_STAART() (broken by earlier commit)
(This used to be ctdb commit c3be8eb7d1ca316111ec51f45dbca2fa5609cf93)
-rw-r--r-- | ctdb/lib/tdb/common/freelist.c | 5 | ||||
-rw-r--r-- | ctdb/lib/tdb/common/tdb.c | 10 | ||||
-rw-r--r-- | ctdb/lib/tdb/common/tdb_private.h | 2 | ||||
-rw-r--r-- | ctdb/lib/tdb/include/tdb.h | 3 |
4 files changed, 17 insertions, 3 deletions
diff --git a/ctdb/lib/tdb/common/freelist.c b/ctdb/lib/tdb/common/freelist.c index 21756acff9..48e64c2b4c 100644 --- a/ctdb/lib/tdb/common/freelist.c +++ b/ctdb/lib/tdb/common/freelist.c @@ -138,7 +138,7 @@ left: #endif /* Look left */ - if (offset - sizeof(tdb_off_t) >= TDB_DATA_START(tdb->header.hash_size)) { + if (offset - sizeof(tdb_off_t) > TDB_DATA_START(tdb->header.hash_size)) { tdb_off_t left = offset - sizeof(tdb_off_t); struct list_struct l; tdb_off_t leftsize; @@ -156,7 +156,8 @@ left: left = offset - leftsize; - if (left < TDB_DATA_START(tdb->header.hash_size)) { + if (leftsize > offset || + left < TDB_DATA_START(tdb->header.hash_size)) { goto update; } diff --git a/ctdb/lib/tdb/common/tdb.c b/ctdb/lib/tdb/common/tdb.c index 79c1547519..bf3abb71ac 100644 --- a/ctdb/lib/tdb/common/tdb.c +++ b/ctdb/lib/tdb/common/tdb.c @@ -666,6 +666,16 @@ int tdb_get_flags(struct tdb_context *tdb) return tdb->flags; } +void tdb_add_flags(struct tdb_context *tdb, unsigned flags) +{ + tdb->flags |= flags; +} + +void tdb_remove_flags(struct tdb_context *tdb, unsigned flags) +{ + tdb->flags &= ~flags; +} + /* enable sequence number handling on an open tdb diff --git a/ctdb/lib/tdb/common/tdb_private.h b/ctdb/lib/tdb/common/tdb_private.h index 86cb762fd5..63a6d04e72 100644 --- a/ctdb/lib/tdb/common/tdb_private.h +++ b/ctdb/lib/tdb/common/tdb_private.h @@ -58,7 +58,7 @@ typedef uint32_t tdb_off_t; #define TDB_BAD_MAGIC(r) ((r)->magic != TDB_MAGIC && !TDB_DEAD(r)) #define TDB_HASH_TOP(hash) (FREELIST_TOP + (BUCKET(hash)+1)*sizeof(tdb_off_t)) #define TDB_HASHTABLE_SIZE(tdb) ((tdb->header.hash_size+1)*sizeof(tdb_off_t)) -#define TDB_DATA_START(hash_size) TDB_HASH_TOP(hash_size) +#define TDB_DATA_START(hash_size) (TDB_HASH_TOP(hash_size-1) + sizeof(tdb_off_t)) #define TDB_RECOVERY_HEAD offsetof(struct tdb_header, recovery_start) #define TDB_SEQNUM_OFS offsetof(struct tdb_header, sequence_number) #define TDB_PAD_BYTE 0x42 diff --git a/ctdb/lib/tdb/include/tdb.h b/ctdb/lib/tdb/include/tdb.h index 7de4c419a8..f6d4b4b1f4 100644 --- a/ctdb/lib/tdb/include/tdb.h +++ b/ctdb/lib/tdb/include/tdb.h @@ -135,6 +135,8 @@ int tdb_get_seqnum(struct tdb_context *tdb); int tdb_hash_size(struct tdb_context *tdb); size_t tdb_map_size(struct tdb_context *tdb); int tdb_get_flags(struct tdb_context *tdb); +void tdb_add_flags(struct tdb_context *tdb, unsigned flag); +void tdb_remove_flags(struct tdb_context *tdb, unsigned flag); void tdb_enable_seqnum(struct tdb_context *tdb); void tdb_increment_seqnum_nonblock(struct tdb_context *tdb); @@ -153,6 +155,7 @@ void tdb_setalarm_sigptr(struct tdb_context *tdb, volatile sig_atomic_t *sigptr) void tdb_dump_all(struct tdb_context *tdb); 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); extern TDB_DATA tdb_null; |