X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb%2Ftransaction.c;h=e8b0e6856110a401d89a93c9e1336bb6acb5190f;hp=c2e4748a8e7c668acb9c568660a59ab9c2f4cff6;hb=03d4aa56b8bd381db449b36befa6928594cea994;hpb=b2c0ebc6f53b05b222937991f100f8a89701f9b1 diff --git a/ccan/tdb/transaction.c b/ccan/tdb/transaction.c index c2e4748a..e8b0e685 100644 --- a/ccan/tdb/transaction.c +++ b/ccan/tdb/transaction.c @@ -144,14 +144,6 @@ static int transaction_read(struct tdb_context *tdb, tdb_off_t off, void *buf, { uint32_t blk; - /* Only a commit is allowed on a prepared transaction */ - if (tdb->transaction->prepared) { - tdb->ecode = TDB_ERR_EINVAL; - TDB_LOG((tdb, TDB_DEBUG_FATAL, "transaction_read: transaction already prepared, read not allowed\n")); - tdb->transaction->transaction_error = 1; - return -1; - } - /* break it down into block sized ops */ while (len + (off % tdb->transaction->block_size) > tdb->transaction->block_size) { tdb_len_t len2 = tdb->transaction->block_size - (off % tdb->transaction->block_size); @@ -688,7 +680,7 @@ static int tdb_recovery_allocate(struct tdb_context *tdb, tdb_off_t *recovery_offset, tdb_len_t *recovery_max_size) { - struct list_struct rec; + struct tdb_record rec; const struct tdb_methods *methods = tdb->transaction->io_methods; tdb_off_t recovery_head; @@ -774,7 +766,7 @@ static int transaction_setup_recovery(struct tdb_context *tdb, tdb_len_t recovery_size; unsigned char *data, *p; const struct tdb_methods *methods = tdb->transaction->io_methods; - struct list_struct *rec; + struct tdb_record *rec; tdb_off_t recovery_offset, recovery_max_size; tdb_off_t old_map_size = tdb->transaction->old_map_size; uint32_t magic, tailer; @@ -794,7 +786,7 @@ static int transaction_setup_recovery(struct tdb_context *tdb, return -1; } - rec = (struct list_struct *)data; + rec = (struct tdb_record *)data; memset(rec, 0, sizeof(*rec)); rec->magic = 0; @@ -877,7 +869,7 @@ static int transaction_setup_recovery(struct tdb_context *tdb, magic = TDB_RECOVERY_MAGIC; CONVERT(magic); - *magic_offset = recovery_offset + offsetof(struct list_struct, magic); + *magic_offset = recovery_offset + offsetof(struct tdb_record, magic); if (methods->tdb_write(tdb, *magic_offset, &magic, sizeof(magic)) == -1) { TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_transaction_setup_recovery: failed to write recovery magic\n")); @@ -927,11 +919,6 @@ static int _tdb_transaction_prepare_commit(struct tdb_context *tdb) return 0; } -#ifdef TDB_TRACE - /* store seqnum now, before reading becomes illegal. */ - tdb_ofs_read(tdb, TDB_SEQNUM_OFS, &tdb->transaction_prepare_seqnum); -#endif - /* check for a null transaction */ if (tdb->transaction->blocks == NULL) { return 0; @@ -969,7 +956,7 @@ static int _tdb_transaction_prepare_commit(struct tdb_context *tdb) /* write the recovery data to the end of the file */ if (transaction_setup_recovery(tdb, &tdb->transaction->magic_offset) == -1) { TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_transaction_prepare_commit: failed to setup recovery data\n")); - tdb_brunlock(tdb, F_WRLCK, GLOBAL_LOCK, 0); + tdb_brunlock(tdb, F_WRLCK, GLOBAL_LOCK, 1); _tdb_transaction_cancel(tdb, F_WRLCK); return -1; } @@ -984,7 +971,7 @@ static int _tdb_transaction_prepare_commit(struct tdb_context *tdb) tdb->transaction->old_map_size) == -1) { tdb->ecode = TDB_ERR_IO; TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_transaction_prepare_commit: expansion failed\n")); - tdb_brunlock(tdb, F_WRLCK, GLOBAL_LOCK, 0); + tdb_brunlock(tdb, F_WRLCK, GLOBAL_LOCK, 1); _tdb_transaction_cancel(tdb, F_WRLCK); return -1; } @@ -1020,13 +1007,7 @@ int tdb_transaction_commit(struct tdb_context *tdb) return -1; } - /* If we've prepared, can't read seqnum. */ - if (tdb->transaction->prepared) { - tdb_trace_seqnum(tdb, tdb->transaction_prepare_seqnum, - "tdb_transaction_commit"); - } else { - tdb_trace(tdb, "tdb_transaction_commit"); - } + tdb_trace(tdb, "tdb_transaction_commit"); if (tdb->transaction->transaction_error) { tdb->ecode = TDB_ERR_IO; @@ -1080,7 +1061,7 @@ int tdb_transaction_commit(struct tdb_context *tdb) tdb_transaction_recover(tdb); _tdb_transaction_cancel(tdb, F_WRLCK); - tdb_brunlock(tdb, F_WRLCK, GLOBAL_LOCK, 0); + tdb_brunlock(tdb, F_WRLCK, GLOBAL_LOCK, 1); TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_transaction_commit: write failed\n")); return -1; @@ -1137,7 +1118,7 @@ int tdb_transaction_recover(struct tdb_context *tdb) tdb_off_t recovery_head, recovery_eof; unsigned char *data, *p; uint32_t zero = 0; - struct list_struct rec; + struct tdb_record rec; /* find the recovery area */ if (tdb_ofs_read(tdb, TDB_RECOVERY_HEAD, &recovery_head) == -1) { @@ -1224,7 +1205,7 @@ int tdb_transaction_recover(struct tdb_context *tdb) } /* remove the recovery magic */ - if (tdb_ofs_write(tdb, recovery_head + offsetof(struct list_struct, magic), + if (tdb_ofs_write(tdb, recovery_head + offsetof(struct tdb_record, magic), &zero) == -1) { TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_transaction_recover: failed to remove recovery magic\n")); tdb->ecode = TDB_ERR_IO;