bcachefs: More drop_locks_do() conversions
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 30 May 2023 08:59:30 +0000 (04:59 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:03 +0000 (17:10 -0400)
Using drop_locks_do() ensures that every unlock() is paired with a
relock(), with proper error checking.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_iter.c
fs/bcachefs/btree_update_interior.c
fs/bcachefs/btree_update_leaf.c
fs/bcachefs/trace.h

index 9072819176dec14428727010707e2ab0d129f461..e8fec59dac0263af6210c48d063fefacbc28ee54 100644 (file)
@@ -2892,9 +2892,7 @@ u32 bch2_trans_begin(struct btree_trans *trans)
        if (!trans->restarted &&
            (need_resched() ||
             now - trans->last_begin_time > BTREE_TRANS_MAX_LOCK_HOLD_TIME_NS)) {
-               bch2_trans_unlock(trans);
-               cond_resched();
-               bch2_trans_relock(trans);
+               drop_locks_do(trans, (cond_resched(), 0));
                now = local_clock();
        }
        trans->last_begin_time = now;
index 4d6c286edb047d3284384226e7e387ca5d72d932..66da1da2f0757eaa14b2417d7b305813bb32b77a 100644 (file)
@@ -1126,23 +1126,19 @@ bch2_btree_update_start(struct btree_trans *trans, struct btree_path *path,
                                      BTREE_UPDATE_JOURNAL_RES,
                                      journal_flags|JOURNAL_RES_GET_NONBLOCK);
        if (ret) {
-               bch2_trans_unlock(trans);
-
                if (flags & BTREE_INSERT_JOURNAL_RECLAIM) {
                        ret = -BCH_ERR_journal_reclaim_would_deadlock;
                        goto err;
                }
 
-               ret = bch2_journal_preres_get(&c->journal, &as->journal_preres,
+               ret = drop_locks_do(trans,
+                       bch2_journal_preres_get(&c->journal, &as->journal_preres,
                                              BTREE_UPDATE_JOURNAL_RES,
-                                             journal_flags);
-               if (ret) {
+                                             journal_flags));
+               if (ret == -BCH_ERR_journal_preres_get_blocked) {
                        trace_and_count(c, trans_restart_journal_preres_get, trans, _RET_IP_, journal_flags);
                        ret = btree_trans_restart(trans, BCH_ERR_transaction_restart_journal_preres_get);
-                       goto err;
                }
-
-               ret = bch2_trans_relock(trans);
                if (ret)
                        goto err;
        }
index ea7e32e7d2fd3bde9d8d865c4926d6bf51c23536..b42b83c55c5bf58ba24606e19f6fed54d72fe4fd 100644 (file)
@@ -947,34 +947,20 @@ int bch2_trans_commit_error(struct btree_trans *trans, unsigned flags,
                        trace_and_count(c, trans_restart_btree_node_split, trans, trace_ip, i->path);
                break;
        case -BCH_ERR_btree_insert_need_mark_replicas:
-               bch2_trans_unlock(trans);
-
-               ret = bch2_replicas_delta_list_mark(c, trans->fs_usage_deltas);
-               if (ret)
-                       break;
-
-               ret = bch2_trans_relock(trans);
-               if (ret)
-                       trace_and_count(c, trans_restart_mark_replicas, trans, trace_ip);
+               ret = drop_locks_do(trans,
+                       bch2_replicas_delta_list_mark(c, trans->fs_usage_deltas));
                break;
        case -BCH_ERR_journal_res_get_blocked:
-               bch2_trans_unlock(trans);
-
                if ((flags & BTREE_INSERT_JOURNAL_RECLAIM) &&
                    !(flags & JOURNAL_WATERMARK_reserved)) {
                        ret = -BCH_ERR_journal_reclaim_would_deadlock;
                        break;
                }
 
-               ret = bch2_trans_journal_res_get(trans,
+               ret = drop_locks_do(trans,
+                       bch2_trans_journal_res_get(trans,
                                        (flags & JOURNAL_WATERMARK_MASK)|
-                                       JOURNAL_RES_GET_CHECK);
-               if (ret)
-                       break;
-
-               ret = bch2_trans_relock(trans);
-               if (ret)
-                       trace_and_count(c, trans_restart_journal_res_get, trans, trace_ip);
+                                       JOURNAL_RES_GET_CHECK));
                break;
        case -BCH_ERR_btree_insert_need_journal_reclaim:
                bch2_trans_unlock(trans);
@@ -987,8 +973,6 @@ int bch2_trans_commit_error(struct btree_trans *trans, unsigned flags,
                        break;
 
                ret = bch2_trans_relock(trans);
-               if (ret)
-                       trace_and_count(c, trans_restart_journal_reclaim, trans, trace_ip);
                break;
        case -BCH_ERR_btree_insert_need_flush_buffer: {
                struct btree_write_buffer *wb = &c->btree_write_buffer;
@@ -996,20 +980,20 @@ int bch2_trans_commit_error(struct btree_trans *trans, unsigned flags,
                ret = 0;
 
                if (wb->state.nr > wb->size * 3 / 4) {
-                       bch2_trans_reset_updates(trans);
                        bch2_trans_unlock(trans);
-
                        mutex_lock(&wb->flush_lock);
 
-                       if (wb->state.nr > wb->size * 3 / 4)
+                       if (wb->state.nr > wb->size * 3 / 4) {
+                               bch2_trans_begin(trans);
                                ret = __bch2_btree_write_buffer_flush(trans,
                                                flags|BTREE_INSERT_NOCHECK_RW, true);
-                       else
+                               if (!ret) {
+                                       trace_and_count(c, trans_restart_write_buffer_flush, trans, _THIS_IP_);
+                                       ret = btree_trans_restart(trans, BCH_ERR_transaction_restart_write_buffer_flush);
+                               }
+                       } else {
                                mutex_unlock(&wb->flush_lock);
-
-                       if (!ret) {
-                               trace_and_count(c, trans_restart_write_buffer_flush, trans, _THIS_IP_);
-                               ret = btree_trans_restart(trans, BCH_ERR_transaction_restart_write_buffer_flush);
+                               ret = bch2_trans_relock(trans);
                        }
                }
                break;
index cfb1779d712a3a51b500f4718c08887126edff3a..a743ab47796654a471d4cb1e33d0c6302525b0a5 100644 (file)
@@ -905,13 +905,6 @@ DEFINE_EVENT(transaction_event,    trans_blocked_journal_reclaim,
        TP_ARGS(trans, caller_ip)
 );
 
-DEFINE_EVENT(transaction_event,        trans_restart_journal_res_get,
-       TP_PROTO(struct btree_trans *trans,
-                unsigned long caller_ip),
-       TP_ARGS(trans, caller_ip)
-);
-
-
 TRACE_EVENT(trans_restart_journal_preres_get,
        TP_PROTO(struct btree_trans *trans,
                 unsigned long caller_ip,
@@ -935,12 +928,6 @@ TRACE_EVENT(trans_restart_journal_preres_get,
                  __entry->flags)
 );
 
-DEFINE_EVENT(transaction_event,        trans_restart_journal_reclaim,
-       TP_PROTO(struct btree_trans *trans,
-                unsigned long caller_ip),
-       TP_ARGS(trans, caller_ip)
-);
-
 DEFINE_EVENT(transaction_event,        trans_restart_fault_inject,
        TP_PROTO(struct btree_trans *trans,
                 unsigned long caller_ip),
@@ -953,12 +940,6 @@ DEFINE_EVENT(transaction_event,    trans_traverse_all,
        TP_ARGS(trans, caller_ip)
 );
 
-DEFINE_EVENT(transaction_event,        trans_restart_mark_replicas,
-       TP_PROTO(struct btree_trans *trans,
-                unsigned long caller_ip),
-       TP_ARGS(trans, caller_ip)
-);
-
 DEFINE_EVENT(transaction_event,        trans_restart_key_cache_raced,
        TP_PROTO(struct btree_trans *trans,
                 unsigned long caller_ip),