Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bcachefs: bch2_trans_account_disk_usage_change()

The disk space accounting rewrite is splitting out accounting for each
replicas set - those are moving to btree keys, instead of percpu
counters.

This breaks bch2_trans_fs_usage_apply() up, splitting out the part we
will still need.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>

+48 -29
+5
fs/bcachefs/btree_trans_commit.c
··· 675 675 bch2_trans_fs_usage_apply(trans, trans->fs_usage_deltas)) 676 676 return -BCH_ERR_btree_insert_need_mark_replicas; 677 677 678 + /* XXX: we only want to run this if deltas are nonzero */ 679 + bch2_trans_account_disk_usage_change(trans); 680 + 678 681 h = trans->hooks; 679 682 while (h) { 680 683 ret = h->fn(trans, h); ··· 991 988 if (!trans->nr_updates && 992 989 !trans->journal_entries_u64s) 993 990 goto out_reset; 991 + 992 + memset(&trans->fs_usage_delta, 0, sizeof(trans->fs_usage_delta)); 994 993 995 994 ret = bch2_trans_commit_run_triggers(trans); 996 995 if (ret)
+41 -29
fs/bcachefs/buckets.c
··· 694 694 percpu_up_read(&c->mark_lock); 695 695 } 696 696 697 - int bch2_trans_fs_usage_apply(struct btree_trans *trans, 698 - struct replicas_delta_list *deltas) 697 + void bch2_trans_account_disk_usage_change(struct btree_trans *trans) 699 698 { 700 699 struct bch_fs *c = trans->c; 700 + u64 disk_res_sectors = trans->disk_res ? trans->disk_res->sectors : 0; 701 701 static int warned_disk_usage = 0; 702 702 bool warn = false; 703 - u64 disk_res_sectors = trans->disk_res ? trans->disk_res->sectors : 0; 704 - struct replicas_delta *d, *d2; 705 - struct replicas_delta *top = (void *) deltas->d + deltas->used; 706 - struct bch_fs_usage *dst; 707 - s64 added = 0, should_not_have_added; 708 - unsigned i; 709 703 710 704 percpu_down_read(&c->mark_lock); 711 705 preempt_disable(); 712 - dst = fs_usage_ptr(c, trans->journal_res.seq, false); 706 + struct bch_fs_usage_base *dst = &fs_usage_ptr(c, trans->journal_res.seq, false)->b; 707 + struct bch_fs_usage_base *src = &trans->fs_usage_delta; 713 708 714 - for (d = deltas->d; d != top; d = replicas_delta_next(d)) { 715 - switch (d->r.data_type) { 716 - case BCH_DATA_btree: 717 - case BCH_DATA_user: 718 - case BCH_DATA_parity: 719 - added += d->delta; 720 - } 721 - 722 - if (__update_replicas(c, dst, &d->r, d->delta)) 723 - goto need_mark; 724 - } 725 - 726 - dst->b.nr_inodes += deltas->nr_inodes; 727 - 728 - for (i = 0; i < BCH_REPLICAS_MAX; i++) { 729 - added += deltas->persistent_reserved[i]; 730 - dst->b.reserved += deltas->persistent_reserved[i]; 731 - dst->persistent_reserved[i] += deltas->persistent_reserved[i]; 732 - } 709 + s64 added = src->btree + src->data + src->reserved; 733 710 734 711 /* 735 712 * Not allowed to reduce sectors_available except by getting a 736 713 * reservation: 737 714 */ 738 - should_not_have_added = added - (s64) disk_res_sectors; 715 + s64 should_not_have_added = added - (s64) disk_res_sectors; 739 716 if (unlikely(should_not_have_added > 0)) { 740 717 u64 old, new, v = atomic64_read(&c->sectors_available); 741 718 ··· 731 754 this_cpu_sub(*c->online_reserved, added); 732 755 } 733 756 757 + dst->hidden += src->hidden; 758 + dst->btree += src->btree; 759 + dst->data += src->data; 760 + dst->cached += src->cached; 761 + dst->reserved += src->reserved; 762 + dst->nr_inodes += src->nr_inodes; 763 + 734 764 preempt_enable(); 735 765 percpu_up_read(&c->mark_lock); 736 766 ··· 745 761 bch2_trans_inconsistent(trans, 746 762 "disk usage increased %lli more than %llu sectors reserved)", 747 763 should_not_have_added, disk_res_sectors); 764 + } 765 + 766 + int bch2_trans_fs_usage_apply(struct btree_trans *trans, 767 + struct replicas_delta_list *deltas) 768 + { 769 + struct bch_fs *c = trans->c; 770 + struct replicas_delta *d, *d2; 771 + struct replicas_delta *top = (void *) deltas->d + deltas->used; 772 + struct bch_fs_usage *dst; 773 + unsigned i; 774 + 775 + percpu_down_read(&c->mark_lock); 776 + preempt_disable(); 777 + dst = fs_usage_ptr(c, trans->journal_res.seq, false); 778 + 779 + for (d = deltas->d; d != top; d = replicas_delta_next(d)) 780 + if (__update_replicas(c, dst, &d->r, d->delta)) 781 + goto need_mark; 782 + 783 + dst->b.nr_inodes += deltas->nr_inodes; 784 + 785 + for (i = 0; i < BCH_REPLICAS_MAX; i++) { 786 + dst->b.reserved += deltas->persistent_reserved[i]; 787 + dst->persistent_reserved[i] += deltas->persistent_reserved[i]; 788 + } 789 + 790 + preempt_enable(); 791 + percpu_up_read(&c->mark_lock); 748 792 return 0; 749 793 need_mark: 750 794 /* revert changes: */
+2
fs/bcachefs/buckets.h
··· 356 356 ret; \ 357 357 }) 358 358 359 + void bch2_trans_account_disk_usage_change(struct btree_trans *); 360 + 359 361 void bch2_trans_fs_usage_revert(struct btree_trans *, struct replicas_delta_list *); 360 362 int bch2_trans_fs_usage_apply(struct btree_trans *, struct replicas_delta_list *); 361 363