X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb%2Ftransaction.c;h=238034f3700687a77e347b71f456e121485333b1;hp=fc0ca1d9a15e50d69a1aa29e69d92195781dc7a4;hb=8321967a3b0917b9b1ac4cbc3cda2ace881a886f;hpb=6ad04b02d95ba5897ae609b7030608a62cc7797b diff --git a/ccan/tdb/transaction.c b/ccan/tdb/transaction.c index fc0ca1d9..238034f3 100644 --- a/ccan/tdb/transaction.c +++ b/ccan/tdb/transaction.c @@ -683,10 +683,16 @@ static int tdb_recovery_allocate(struct tdb_context *tdb, rec.rec_len = 0; - if (recovery_head != 0 && - methods->tdb_read(tdb, recovery_head, &rec, sizeof(rec), DOCONV()) == -1) { - TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_recovery_allocate: failed to read recovery record\n")); - return -1; + if (recovery_head != 0) { + if (methods->tdb_read(tdb, recovery_head, &rec, sizeof(rec), DOCONV()) == -1) { + TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_recovery_allocate: failed to read recovery record\n")); + return -1; + } + /* ignore invalid recovery regions: can happen in crash */ + if (rec.magic != TDB_RECOVERY_MAGIC && + rec.magic != TDB_RECOVERY_INVALID_MAGIC) { + recovery_head = 0; + } } *recovery_size = tdb_recovery_size(tdb);