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>
This commit is contained in:
parent
bb125baf51
commit
49c7cd9d8d
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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),
|
||||
|
Loading…
x
Reference in New Issue
Block a user