X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb2%2Ftransaction.c;h=a29acf96e2d417c8c3d79313f8ada959f7c5719c;hp=9205828a8a16138d754e0013b68d9b91396b1894;hb=b87e14495d5b07e1b247218a72329f10ecb3da7f;hpb=838db0d7ea37fc2a21d03d159b55b042f8144cb3 diff --git a/ccan/tdb2/transaction.c b/ccan/tdb2/transaction.c index 9205828a..a29acf96 100644 --- a/ccan/tdb2/transaction.c +++ b/ccan/tdb2/transaction.c @@ -348,15 +348,14 @@ static void transaction_write_existing(struct tdb_context *tdb, tdb_off_t off, static enum TDB_ERROR transaction_oob(struct tdb_context *tdb, tdb_off_t len, bool probe) { - if (len <= tdb->file->map_size) { + if (len <= tdb->file->map_size || probe) { return TDB_SUCCESS; } - if (!probe) { - tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR, - "tdb_oob len %lld beyond transaction size %lld", - (long long)len, - (long long)tdb->file->map_size); - } + + tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR, + "tdb_oob len %lld beyond transaction size %lld", + (long long)len, + (long long)tdb->file->map_size); return TDB_ERR_IO; } @@ -509,7 +508,7 @@ static void _tdb_transaction_cancel(struct tdb_context *tdb) tdb_transaction_unlock(tdb, F_WRLCK); if (tdb_has_open_lock(tdb)) - tdb_unlock_open(tdb); + tdb_unlock_open(tdb, F_WRLCK); SAFE_FREE(tdb->transaction); } @@ -524,13 +523,22 @@ enum TDB_ERROR tdb_transaction_start(struct tdb_context *tdb) tdb->stats.transactions++; /* some sanity checks */ - if (tdb->read_only || (tdb->flags & TDB_INTERNAL)) { + if (tdb->flags & TDB_INTERNAL) { return tdb->last_error = tdb_logerr(tdb, TDB_ERR_EINVAL, + TDB_LOG_USE_ERROR, + "tdb_transaction_start:" + " cannot start a" + " transaction on an" + " internal tdb"); + } + + if (tdb->flags & TDB_RDONLY) { + return tdb->last_error = tdb_logerr(tdb, TDB_ERR_RDONLY, TDB_LOG_USE_ERROR, "tdb_transaction_start:" " cannot start a" " transaction on a " - "read-only or internal db"); + " read-only tdb"); } /* cope with nested tdb_transaction_start() calls */ @@ -1005,7 +1013,7 @@ static enum TDB_ERROR _tdb_transaction_prepare_commit(struct tdb_context *tdb) /* get the open lock - this prevents new users attaching to the database during the commit */ - ecode = tdb_lock_open(tdb, TDB_LOCK_WAIT|TDB_LOCK_NOCHECK); + ecode = tdb_lock_open(tdb, F_WRLCK, TDB_LOCK_WAIT|TDB_LOCK_NOCHECK); if (ecode != TDB_SUCCESS) { return ecode; } @@ -1188,7 +1196,7 @@ enum TDB_ERROR tdb_transaction_recover(struct tdb_context *tdb) return TDB_SUCCESS; } - if (tdb->read_only) { + if (tdb->flags & TDB_RDONLY) { return tdb_logerr(tdb, TDB_ERR_CORRUPT, TDB_LOG_ERROR, "tdb_transaction_recover:" " attempt to recover read only database");