diff options
| author | Linus Torvalds <[email protected]> | 2024-01-21 14:01:12 -0800 | 
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2024-01-21 14:01:12 -0800 | 
| commit | 35a4474b5c3dd4315f72bd53e87b97f128d9bb3d (patch) | |
| tree | 072e5ac37cef1c04e80a1cd66d7cdb56be680fa6 /fs/bcachefs/btree_trans_commit.c | |
| parent | 4fbbed7872677b0a28ba8237169968171a61efbd (diff) | |
| parent | 249f441f83c546281f1c175756c81fac332bb64c (diff) | |
Merge tag 'bcachefs-2024-01-21' of https://evilpiepirate.org/git/bcachefs
Pull more bcachefs updates from Kent Overstreet:
 "Some fixes, Some refactoring, some minor features:
   - Assorted prep work for disk space accounting rewrite
   - BTREE_TRIGGER_ATOMIC: after combining our trigger callbacks, this
     makes our trigger context more explicit
   - A few fixes to avoid excessive transaction restarts on
     multithreaded workloads: fstests (in addition to ktest tests) are
     now checking slowpath counters, and that's shaking out a few bugs
   - Assorted tracepoint improvements
   - Starting to break up bcachefs_format.h and move on disk types so
     they're with the code they belong to; this will make room to start
     documenting the on disk format better.
   - A few minor fixes"
* tag 'bcachefs-2024-01-21' of https://evilpiepirate.org/git/bcachefs: (46 commits)
  bcachefs: Improve inode_to_text()
  bcachefs: logged_ops_format.h
  bcachefs: reflink_format.h
  bcachefs; extents_format.h
  bcachefs: ec_format.h
  bcachefs: subvolume_format.h
  bcachefs: snapshot_format.h
  bcachefs: alloc_background_format.h
  bcachefs: xattr_format.h
  bcachefs: dirent_format.h
  bcachefs: inode_format.h
  bcachefs; quota_format.h
  bcachefs: sb-counters_format.h
  bcachefs: counters.c -> sb-counters.c
  bcachefs: comment bch_subvolume
  bcachefs: bch_snapshot::btime
  bcachefs: add missing __GFP_NOWARN
  bcachefs: opts->compression can now also be applied in the background
  bcachefs: Prep work for variable size btree node buffers
  bcachefs: grab s_umount only if snapshotting
  ...
Diffstat (limited to 'fs/bcachefs/btree_trans_commit.c')
| -rw-r--r-- | fs/bcachefs/btree_trans_commit.c | 35 | 
1 files changed, 16 insertions, 19 deletions
diff --git a/fs/bcachefs/btree_trans_commit.c b/fs/bcachefs/btree_trans_commit.c index 90eb8065ff2d..30d69a6d133e 100644 --- a/fs/bcachefs/btree_trans_commit.c +++ b/fs/bcachefs/btree_trans_commit.c @@ -139,8 +139,7 @@ bool bch2_btree_bset_insert_key(struct btree_trans *trans,  	EBUG_ON(bkey_deleted(&insert->k) && bkey_val_u64s(&insert->k));  	EBUG_ON(bpos_lt(insert->k.p, b->data->min_key));  	EBUG_ON(bpos_gt(insert->k.p, b->data->max_key)); -	EBUG_ON(insert->k.u64s > -		bch_btree_keys_u64s_remaining(trans->c, b)); +	EBUG_ON(insert->k.u64s > bch2_btree_keys_u64s_remaining(b));  	EBUG_ON(!b->c.level && !bpos_eq(insert->k.p, path->pos));  	k = bch2_btree_node_iter_peek_all(node_iter, b); @@ -160,7 +159,7 @@ bool bch2_btree_bset_insert_key(struct btree_trans *trans,  		k->type = KEY_TYPE_deleted;  		if (k->needs_whiteout) -			push_whiteout(trans->c, b, insert->k.p); +			push_whiteout(b, insert->k.p);  		k->needs_whiteout = false;  		if (k >= btree_bset_last(b)->start) { @@ -348,9 +347,7 @@ static noinline void journal_transaction_name(struct btree_trans *trans)  static inline int btree_key_can_insert(struct btree_trans *trans,  				       struct btree *b, unsigned u64s)  { -	struct bch_fs *c = trans->c; - -	if (!bch2_btree_node_insert_fits(c, b, u64s)) +	if (!bch2_btree_node_insert_fits(b, u64s))  		return -BCH_ERR_btree_insert_btree_node_full;  	return 0; @@ -418,7 +415,7 @@ static int btree_key_can_insert_cached(struct btree_trans *trans, unsigned flags  		return 0;  	new_u64s	= roundup_pow_of_two(u64s); -	new_k		= krealloc(ck->k, new_u64s * sizeof(u64), GFP_NOWAIT); +	new_k		= krealloc(ck->k, new_u64s * sizeof(u64), GFP_NOWAIT|__GFP_NOWARN);  	if (unlikely(!new_k))  		return btree_key_can_insert_cached_slowpath(trans, flags, path, new_u64s); @@ -448,9 +445,6 @@ static int run_one_mem_trigger(struct btree_trans *trans,  	if (unlikely(flags & BTREE_TRIGGER_NORUN))  		return 0; -	if (!btree_node_type_needs_gc(__btree_node_type(i->level, i->btree_id))) -		return 0; -  	if (old_ops->trigger == new_ops->trigger) {  		ret   = bch2_key_trigger(trans, i->btree_id, i->level,  				old, bkey_i_to_s(new), @@ -586,9 +580,6 @@ static int bch2_trans_commit_run_triggers(struct btree_trans *trans)  static noinline int bch2_trans_commit_run_gc_triggers(struct btree_trans *trans)  { -	struct bch_fs *c = trans->c; -	int ret = 0; -  	trans_for_each_update(trans, i) {  		/*  		 * XXX: synchronization of cached update triggers with gc @@ -596,14 +587,15 @@ static noinline int bch2_trans_commit_run_gc_triggers(struct btree_trans *trans)  		 */  		BUG_ON(i->cached || i->level); -		if (gc_visited(c, gc_pos_btree_node(insert_l(trans, i)->b))) { -			ret = run_one_mem_trigger(trans, i, i->flags|BTREE_TRIGGER_GC); +		if (btree_node_type_needs_gc(__btree_node_type(i->level, i->btree_id)) && +		    gc_visited(trans->c, gc_pos_btree_node(insert_l(trans, i)->b))) { +			int ret = run_one_mem_trigger(trans, i, i->flags|BTREE_TRIGGER_GC);  			if (ret) -				break; +				return ret;  		}  	} -	return ret; +	return 0;  }  static inline int @@ -680,6 +672,9 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,  	    bch2_trans_fs_usage_apply(trans, trans->fs_usage_deltas))  		return -BCH_ERR_btree_insert_need_mark_replicas; +	/* XXX: we only want to run this if deltas are nonzero */ +	bch2_trans_account_disk_usage_change(trans); +  	h = trans->hooks;  	while (h) {  		ret = h->fn(trans, h); @@ -689,8 +684,8 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,  	}  	trans_for_each_update(trans, i) -		if (BTREE_NODE_TYPE_HAS_MEM_TRIGGERS & (1U << i->bkey_type)) { -			ret = run_one_mem_trigger(trans, i, i->flags); +		if (BTREE_NODE_TYPE_HAS_ATOMIC_TRIGGERS & (1U << i->bkey_type)) { +			ret = run_one_mem_trigger(trans, i, BTREE_TRIGGER_ATOMIC|i->flags);  			if (ret)  				goto fatal_err;  		} @@ -994,6 +989,8 @@ int __bch2_trans_commit(struct btree_trans *trans, unsigned flags)  	    !trans->journal_entries_u64s)  		goto out_reset; +	memset(&trans->fs_usage_delta, 0, sizeof(trans->fs_usage_delta)); +  	ret = bch2_trans_commit_run_triggers(trans);  	if (ret)  		goto out_reset;  |