]> git.ozlabs.org Git - ccan/blobdiff - ccan/tdb2/tdb1_transaction.c
tdb2: use tdb->flags & TDB_RDONLY instead of tdb->read_only for TDB1 code.
[ccan] / ccan / tdb2 / tdb1_transaction.c
index 8d25f96ab5efe98b070e4a1e61feba74dc2afa94..cf77a35996d5543df258d0237e4682c0ac5f2d31 100644 (file)
@@ -418,7 +418,7 @@ static const struct tdb1_methods transaction1_methods = {
 static int _tdb1_transaction_start(struct tdb1_context *tdb)
 {
        /* some sanity checks */
-       if (tdb->read_only || (tdb->flags & TDB_INTERNAL) || tdb->traverse_read) {
+       if ((tdb->flags & TDB_RDONLY) || (tdb->flags & TDB_INTERNAL) || tdb->traverse_read) {
                tdb->last_error = tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_LOG_USE_ERROR,
                                        "tdb1_transaction_start: cannot start a"
                                        " transaction on a read-only or"
@@ -478,8 +478,11 @@ static int _tdb1_transaction_start(struct tdb1_context *tdb)
        /* get a read lock from the freelist to the end of file. This
           is upgraded to a write lock during the commit */
        if (tdb1_allrecord_lock(tdb, F_RDLCK, TDB_LOCK_WAIT, true) == -1) {
-               tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
-                          "tdb1_transaction_start: failed to get hash locks");
+               if (errno != EAGAIN && errno != EINTR) {
+                       tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
+                                  "tdb1_transaction_start:"
+                                  " failed to get hash locks");
+               }
                goto fail_allrecord_lock;
        }
 
@@ -955,20 +958,22 @@ static int _tdb1_transaction_prepare_commit(struct tdb1_context *tdb)
 
        /* upgrade the main transaction lock region to a write lock */
        if (tdb1_allrecord_upgrade(tdb) == -1) {
-               tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
-                          "tdb1_transaction_prepare_commit:"
-                          " failed to upgrade hash locks");
-               _tdb1_transaction_cancel(tdb);
+               if (errno != EAGAIN && errno != EINTR) {
+                       tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
+                                  "tdb1_transaction_prepare_commit:"
+                                  " failed to upgrade hash locks");
+               }
                return -1;
        }
 
        /* get the open lock - this prevents new users attaching to the database
           during the commit */
        if (tdb1_nest_lock(tdb, TDB1_OPEN_LOCK, F_WRLCK, TDB_LOCK_WAIT) == -1) {
-               tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
-                          "tdb1_transaction_prepare_commit:"
-                          " failed to get open lock");
-               _tdb1_transaction_cancel(tdb);
+               if (errno != EAGAIN && errno != EINTR) {
+                       tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
+                                  "tdb1_transaction_prepare_commit:"
+                                  " failed to get open lock");
+               }
                return -1;
        }
 
@@ -978,7 +983,6 @@ static int _tdb1_transaction_prepare_commit(struct tdb1_context *tdb)
                        tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
                                   "tdb1_transaction_prepare_commit:"
                                   " failed to setup recovery data");
-                       _tdb1_transaction_cancel(tdb);
                        return -1;
                }
        }
@@ -993,7 +997,6 @@ static int _tdb1_transaction_prepare_commit(struct tdb1_context *tdb)
                        tdb_logerr(tdb, tdb->last_error, TDB_LOG_ERROR,
                                   "tdb1_transaction_prepare_commit:"
                                   " expansion failed");
-                       _tdb1_transaction_cancel(tdb);
                        return -1;
                }
                tdb->file->map_size = tdb->transaction->old_map_size;
@@ -1073,8 +1076,10 @@ int tdb1_transaction_commit(struct tdb1_context *tdb)
 
        if (!tdb->transaction->prepared) {
                int ret = _tdb1_transaction_prepare_commit(tdb);
-               if (ret)
+               if (ret) {
+                       _tdb1_transaction_cancel(tdb);
                        return ret;
+               }
        }
 
        methods = tdb->transaction->io_methods;
@@ -1193,7 +1198,7 @@ int tdb1_transaction_recover(struct tdb1_context *tdb)
                return 0;
        }
 
-       if (tdb->read_only) {
+       if (tdb->flags & TDB_RDONLY) {
                tdb->last_error = tdb_logerr(tdb, TDB_ERR_CORRUPT, TDB_LOG_ERROR,
                                        "tdb1_transaction_recover:"
                                        " attempt to recover read only"