diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-05-30 04:59:30 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:10:03 -0400 |
commit | 49c7cd9d8d5545cf45ef91f548d25b6dd23c72c7 (patch) | |
tree | c2052d739855b978d365667d088146777c01e99b | |
parent | bb125baf512bffef19c510f1c53353a378537070 (diff) | |
download | lwn-49c7cd9d8d5545cf45ef91f548d25b6dd23c72c7.tar.gz lwn-49c7cd9d8d5545cf45ef91f548d25b6dd23c72c7.zip |
bcachefs: More drop_locks_do() conversions
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>
-rw-r--r-- | fs/bcachefs/btree_iter.c | 4 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_interior.c | 12 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_leaf.c | 42 | ||||
-rw-r--r-- | fs/bcachefs/trace.h | 19 |
4 files changed, 18 insertions, 59 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 9072819176de..e8fec59dac02 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -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; diff --git a/fs/bcachefs/btree_update_interior.c b/fs/bcachefs/btree_update_interior.c index 4d6c286edb04..66da1da2f075 100644 --- a/fs/bcachefs/btree_update_interior.c +++ b/fs/bcachefs/btree_update_interior.c @@ -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; } diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c index ea7e32e7d2fd..b42b83c55c5b 100644 --- a/fs/bcachefs/btree_update_leaf.c +++ b/fs/bcachefs/btree_update_leaf.c @@ -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; diff --git a/fs/bcachefs/trace.h b/fs/bcachefs/trace.h index cfb1779d712a..a743ab477966 100644 --- a/fs/bcachefs/trace.h +++ b/fs/bcachefs/trace.h @@ -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), |