Lines Matching full:k

71 static inline void __accounting_key_init(struct bkey_i *k, struct bpos pos,
74 struct bkey_i_accounting *acc = bkey_accounting_init(k);
76 acc->k.p = pos;
77 set_bkey_val_u64s(&acc->k, sizeof(struct bch_accounting) / sizeof(u64) + nr);
82 static inline void accounting_key_init(struct bkey_i *k, struct disk_accounting_pos *pos,
85 return __accounting_key_init(k, disk_accounting_pos_to_bpos(pos), d, nr);
91 struct disk_accounting_pos *k,
97 switch (k->type) {
99 bubble_sort(k->replicas.devs, k->replicas.nr_devs, u8_cmp);
103 struct bpos pos = disk_accounting_pos_to_bpos(k);
111 if (bpos_eq(a->k.p, pos)) {
112 BUG_ON(nr != bch2_accounting_counters(&a->k));
119 trans->accounting.u64s -= a->k.u64s;
136 struct { __BKEY_PADDED(k, BCH_ACCOUNTING_MAX_COUNTERS); } k_i;
138 __accounting_key_init(&k_i.k, pos, d, nr);
140 int ret = bch2_accounting_mem_add(trans, bkey_i_to_s_c_accounting(&k_i.k), true);
143 bch2_accounting_update_sb_one(trans->c, disk_accounting_pos_to_bpos(k))) ?:
144 bch2_accounting_mem_add(trans, bkey_i_to_s_c_accounting(&k_i.k), true);
179 int bch2_accounting_validate(struct bch_fs *c, struct bkey_s_c k,
183 bpos_to_disk_accounting_pos(&acc_k, k.k->p);
188 bversion_zero(k.k->bversion),
238 bkey_fsck_err_on(bch2_accounting_counters(k.k) != bch2_accounting_type_nr_counters[acc_k.type],
241 bch2_accounting_counters(k.k), bch2_accounting_type_nr_counters[acc_k.type]);
246 void bch2_accounting_key_to_text(struct printbuf *out, struct disk_accounting_pos *k)
248 if (k->type >= BCH_DISK_ACCOUNTING_TYPE_NR) {
249 prt_printf(out, "unknown type %u", k->type);
253 prt_str(out, disk_accounting_type_strs[k->type]);
256 switch (k->type) {
260 prt_printf(out, "replicas=%u", k->persistent_reserved.nr_replicas);
263 bch2_replicas_entry_to_text(out, &k->replicas);
266 prt_printf(out, "dev=%u data_type=", k->dev_data_type.dev);
267 bch2_prt_data_type(out, k->dev_data_type.data_type);
270 bch2_prt_compression_type(out, k->compression.type);
273 prt_printf(out, "id=%u", k->snapshot.id);
277 bch2_btree_id_to_text(out, k->btree.id);
282 void bch2_accounting_to_text(struct printbuf *out, struct bch_fs *c, struct bkey_s_c k)
284 struct bkey_s_c_accounting acc = bkey_s_c_to_accounting(k);
286 bpos_to_disk_accounting_pos(&acc_k, k.k->p);
290 for (unsigned i = 0; i < bch2_accounting_counters(k.k); i++)
294 void bch2_accounting_swab(struct bkey_s k)
296 for (u64 *p = (u64 *) k.v;
297 p < (u64 *) bkey_val_end(k);
341 int ret = bch2_accounting_update_sb_one(trans->c, i->k.p);
354 if (eytzinger0_find(acc->k.data, acc->k.nr, sizeof(acc->k.data[0]),
355 accounting_pos_cmp, &a.k->p) < acc->k.nr)
359 .pos = a.k->p,
360 .bversion = a.k->bversion,
361 .nr_counters = bch2_accounting_counters(a.k),
376 if (darray_push(&acc->k, n))
379 eytzinger0_sort(acc->k.data, acc->k.nr, sizeof(acc->k.data[0]),
402 accounting_to_replicas(&r.e, a.k->p) &&
420 accounting_to_replicas(&r.e, a.k->p) &&
442 struct accounting_mem_entry *dst = acc->k.data;
444 darray_for_each(acc->k, src) {
453 acc->k.nr = dst - acc->k.data;
454 eytzinger0_sort(acc->k.data, acc->k.nr, sizeof(acc->k.data[0]),
475 darray_for_each(acc->k, i) {
487 bch2_accounting_mem_read_counters(acc, i - acc->k.data, &sectors, 1, false);
513 darray_for_each(acc->k, i) {
527 set_bkey_val_u64s(&a_out->k, i->nr_counters);
528 a_out->k.p = i->pos;
529 bch2_accounting_mem_read_counters(acc, i - acc->k.data,
533 out_buf->nr += bkey_bytes(&a_out->k);
545 darray_for_each(acc->k, e) {
557 darray_for_each(acc->k, e) {
583 unsigned idx = eytzinger0_find_ge(acc->k.data, acc->k.nr, sizeof(acc->k.data[0]),
586 if (idx >= acc->k.nr)
589 struct accounting_mem_entry *e = acc->k.data + idx;
633 struct { __BKEY_PADDED(k, BCH_ACCOUNTING_MAX_COUNTERS); } k_i;
635 accounting_key_init(&k_i.k, &acc_k, src_v, nr);
637 bkey_i_to_s_c_accounting(&k_i.k),
658 static int accounting_read_key(struct btree_trans *trans, struct bkey_s_c k)
662 if (k.k->type != KEY_TYPE_accounting)
666 int ret = bch2_accounting_mem_mod_locked(trans, bkey_s_c_to_accounting(k),
765 darray_for_each(acc->k, e)
777 BTREE_ITER_prefetch|BTREE_ITER_all_snapshots, k, ({
779 struct bkey_s_c k = bch2_btree_path_peek_slot_exact(btree_iter_path(trans, &iter), &u);
781 if (k.k->type != KEY_TYPE_accounting)
785 bpos_to_disk_accounting_pos(&acc_k, k.k->p);
798 accounting_read_key(trans, k);
808 if (i->k->k.type == KEY_TYPE_accounting) {
810 bpos_to_disk_accounting_pos(&acc_k, i->k->k.p);
815 struct bkey_s_c k = bkey_i_to_s_c(i->k);
816 unsigned idx = eytzinger0_find(acc->k.data, acc->k.nr,
817 sizeof(acc->k.data[0]),
818 accounting_pos_cmp, &k.k->p);
820 bool applied = idx < acc->k.nr &&
821 bversion_cmp(acc->k.data[idx].bversion, k.k->bversion) >= 0;
827 i[1].k->k.type == KEY_TYPE_accounting &&
829 WARN_ON(bversion_cmp(i[0].k->k.bversion, i[1].k->k.bversion) >= 0);
833 bch2_accounting_accumulate(bkey_i_to_accounting(i[1].k),
834 bkey_s_c_to_accounting(k));
838 ret = accounting_read_key(trans, k);
849 darray_for_each_reverse(acc->k, i) {
873 darray_remove_item(&acc->k, i);
882 eytzinger0_sort(acc->k.data, acc->k.nr, sizeof(acc->k.data[0]),
888 for (unsigned i = 0; i < acc->k.nr; i++) {
889 struct disk_accounting_pos k;
890 bpos_to_disk_accounting_pos(&k, acc->k.data[i].pos);
895 switch (k.type) {
897 usage->reserved += v[0] * k.persistent_reserved.nr_replicas;
900 fs_usage_data_type_to_base(usage, k.replicas.data_type, v[0]);
904 struct bch_dev *ca = bch2_dev_rcu_noerror(c, k.dev_data_type.dev);
906 struct bch_dev_usage_type __percpu *d = &ca->usage->d[k.dev_data_type.data_type];
911 if (k.dev_data_type.data_type == BCH_DATA_sb ||
912 k.dev_data_type.data_type == BCH_DATA_journal)
934 BTREE_ITER_all_snapshots, k, NULL, NULL, 0, ({
936 bpos_to_disk_accounting_pos(&acc, k.k->p);
940 ? bch2_btree_bit_mod_buffered(trans, BTREE_ID_accounting, k.k->p, 0)
970 BTREE_ITER_all_snapshots, k, ({
972 struct bkey_s_c_accounting a = bkey_s_c_to_accounting(k);
973 unsigned nr = bch2_accounting_counters(k.k);
976 bpos_to_disk_accounting_pos(&acc_k, k.k->p);
989 bch2_accounting_mem_read(c, k.k->p, v, nr);
994 bch2_bkey_val_to_text(&buf, c, k);
1026 bch2_bkey_val_to_text(&buf, c, k);
1073 darray_exit(&acc->k);