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

bcachefs: All triggers are BTREE_TRIGGER_WANTS_OLD_AND_NEW

Upcoming rebalance_work btree will require extent triggers to be
BTREE_TRIGGER_WANTS_OLD_AND_NEW - so to reduce potential confusion,
let's just make all triggers BTREE_TRIGGER_WANTS_OLD_AND_NEW.

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

+105 -82
-10
fs/bcachefs/bkey_methods.h
··· 119 119 #define BTREE_TRIGGER_BUCKET_INVALIDATE (1U << __BTREE_TRIGGER_BUCKET_INVALIDATE) 120 120 #define BTREE_TRIGGER_NOATOMIC (1U << __BTREE_TRIGGER_NOATOMIC) 121 121 122 - #define BTREE_TRIGGER_WANTS_OLD_AND_NEW \ 123 - ((1U << KEY_TYPE_alloc)| \ 124 - (1U << KEY_TYPE_alloc_v2)| \ 125 - (1U << KEY_TYPE_alloc_v3)| \ 126 - (1U << KEY_TYPE_alloc_v4)| \ 127 - (1U << KEY_TYPE_stripe)| \ 128 - (1U << KEY_TYPE_inode)| \ 129 - (1U << KEY_TYPE_inode_v2)| \ 130 - (1U << KEY_TYPE_snapshot)) 131 - 132 122 static inline int bch2_trans_mark_key(struct btree_trans *trans, 133 123 enum btree_id btree_id, unsigned level, 134 124 struct bkey_s_c old, struct bkey_i *new,
+2 -4
fs/bcachefs/btree_trans_commit.c
··· 382 382 if (!btree_node_type_needs_gc(__btree_node_type(i->level, i->btree_id))) 383 383 return 0; 384 384 385 - if (old_ops->atomic_trigger == new_ops->atomic_trigger && 386 - ((1U << old.k->type) & BTREE_TRIGGER_WANTS_OLD_AND_NEW)) { 385 + if (old_ops->atomic_trigger == new_ops->atomic_trigger) { 387 386 ret = bch2_mark_key(trans, i->btree_id, i->level, 388 387 old, bkey_i_to_s_c(new), 389 388 BTREE_TRIGGER_INSERT|BTREE_TRIGGER_OVERWRITE|flags); ··· 424 425 425 426 if (!i->insert_trigger_run && 426 427 !i->overwrite_trigger_run && 427 - old_ops->trans_trigger == new_ops->trans_trigger && 428 - ((1U << old.k->type) & BTREE_TRIGGER_WANTS_OLD_AND_NEW)) { 428 + old_ops->trans_trigger == new_ops->trans_trigger) { 429 429 i->overwrite_trigger_run = true; 430 430 i->insert_trigger_run = true; 431 431 return bch2_trans_mark_key(trans, i->btree_id, i->level, old, i->k,
+76 -47
fs/bcachefs/buckets.c
··· 935 935 return 0; 936 936 } 937 937 938 - int bch2_mark_extent(struct btree_trans *trans, 939 - enum btree_id btree_id, unsigned level, 940 - struct bkey_s_c old, struct bkey_s_c new, 941 - unsigned flags) 938 + static int __mark_extent(struct btree_trans *trans, 939 + enum btree_id btree_id, unsigned level, 940 + struct bkey_s_c k, unsigned flags) 942 941 { 943 942 u64 journal_seq = trans->journal_res.seq; 944 943 struct bch_fs *c = trans->c; 945 - struct bkey_s_c k = flags & BTREE_TRIGGER_OVERWRITE ? old : new; 946 944 struct bkey_ptrs_c ptrs = bch2_bkey_ptrs_c(k); 947 945 const union bch_extent_entry *entry; 948 946 struct extent_ptr_decoded p; ··· 1014 1016 } 1015 1017 1016 1018 return 0; 1019 + } 1020 + 1021 + int bch2_mark_extent(struct btree_trans *trans, 1022 + enum btree_id btree_id, unsigned level, 1023 + struct bkey_s_c old, struct bkey_s_c new, 1024 + unsigned flags) 1025 + { 1026 + return mem_trigger_run_overwrite_then_insert(__mark_extent, trans, btree_id, level, old, new, flags); 1017 1027 } 1018 1028 1019 1029 int bch2_mark_stripe(struct btree_trans *trans, ··· 1130 1124 return 0; 1131 1125 } 1132 1126 1133 - int bch2_mark_reservation(struct btree_trans *trans, 1134 - enum btree_id btree_id, unsigned level, 1135 - struct bkey_s_c old, struct bkey_s_c new, 1136 - unsigned flags) 1127 + static int __mark_reservation(struct btree_trans *trans, 1128 + enum btree_id btree_id, unsigned level, 1129 + struct bkey_s_c k, unsigned flags) 1137 1130 { 1138 1131 struct bch_fs *c = trans->c; 1139 - struct bkey_s_c k = flags & BTREE_TRIGGER_OVERWRITE ? old : new; 1140 1132 struct bch_fs_usage *fs_usage; 1141 1133 unsigned replicas = bkey_s_c_to_reservation(k).v->nr_replicas; 1142 1134 s64 sectors = (s64) k.k->size; ··· 1159 1155 percpu_up_read(&c->mark_lock); 1160 1156 1161 1157 return 0; 1158 + } 1159 + 1160 + int bch2_mark_reservation(struct btree_trans *trans, 1161 + enum btree_id btree_id, unsigned level, 1162 + struct bkey_s_c old, struct bkey_s_c new, 1163 + unsigned flags) 1164 + { 1165 + return mem_trigger_run_overwrite_then_insert(__mark_reservation, trans, btree_id, level, old, new, flags); 1162 1166 } 1163 1167 1164 1168 static s64 __bch2_mark_reflink_p(struct btree_trans *trans, ··· 1223 1211 return ret; 1224 1212 } 1225 1213 1226 - int bch2_mark_reflink_p(struct btree_trans *trans, 1227 - enum btree_id btree_id, unsigned level, 1228 - struct bkey_s_c old, struct bkey_s_c new, 1229 - unsigned flags) 1214 + static int __mark_reflink_p(struct btree_trans *trans, 1215 + enum btree_id btree_id, unsigned level, 1216 + struct bkey_s_c k, unsigned flags) 1230 1217 { 1231 1218 struct bch_fs *c = trans->c; 1232 - struct bkey_s_c k = flags & BTREE_TRIGGER_OVERWRITE ? old : new; 1233 1219 struct bkey_s_c_reflink_p p = bkey_s_c_to_reflink_p(k); 1234 1220 struct reflink_gc *ref; 1235 1221 size_t l, r, m; ··· 1259 1249 &idx, flags, l++); 1260 1250 1261 1251 return ret; 1252 + } 1253 + 1254 + int bch2_mark_reflink_p(struct btree_trans *trans, 1255 + enum btree_id btree_id, unsigned level, 1256 + struct bkey_s_c old, struct bkey_s_c new, 1257 + unsigned flags) 1258 + { 1259 + return mem_trigger_run_overwrite_then_insert(__mark_reflink_p, trans, btree_id, level, old, new, flags); 1262 1260 } 1263 1261 1264 1262 void bch2_trans_fs_usage_revert(struct btree_trans *trans, ··· 1470 1452 return ret; 1471 1453 } 1472 1454 1473 - int bch2_trans_mark_extent(struct btree_trans *trans, 1474 - enum btree_id btree_id, unsigned level, 1475 - struct bkey_s_c old, struct bkey_i *new, 1476 - unsigned flags) 1455 + static int __trans_mark_extent(struct btree_trans *trans, 1456 + enum btree_id btree_id, unsigned level, 1457 + struct bkey_s_c k, unsigned flags) 1477 1458 { 1478 1459 struct bch_fs *c = trans->c; 1479 - struct bkey_s_c k = flags & BTREE_TRIGGER_OVERWRITE 1480 - ? old 1481 - : bkey_i_to_s_c(new); 1482 1460 struct bkey_ptrs_c ptrs = bch2_bkey_ptrs_c(k); 1483 1461 const union bch_extent_entry *entry; 1484 1462 struct extent_ptr_decoded p; ··· 1529 1515 ret = update_replicas_list(trans, &r.e, dirty_sectors); 1530 1516 1531 1517 return ret; 1518 + } 1519 + 1520 + int bch2_trans_mark_extent(struct btree_trans *trans, 1521 + enum btree_id btree_id, unsigned level, 1522 + struct bkey_s_c old, struct bkey_i *new, 1523 + unsigned flags) 1524 + { 1525 + return trigger_run_overwrite_then_insert(__trans_mark_extent, trans, btree_id, level, old, new, flags); 1532 1526 } 1533 1527 1534 1528 static int bch2_trans_mark_stripe_bucket(struct btree_trans *trans, ··· 1692 1670 return ret; 1693 1671 } 1694 1672 1695 - int bch2_trans_mark_reservation(struct btree_trans *trans, 1696 - enum btree_id btree_id, unsigned level, 1697 - struct bkey_s_c old, 1698 - struct bkey_i *new, 1699 - unsigned flags) 1673 + static int __trans_mark_reservation(struct btree_trans *trans, 1674 + enum btree_id btree_id, unsigned level, 1675 + struct bkey_s_c k, unsigned flags) 1700 1676 { 1701 - struct bkey_s_c k = flags & BTREE_TRIGGER_OVERWRITE 1702 - ? old 1703 - : bkey_i_to_s_c(new); 1704 1677 unsigned replicas = bkey_s_c_to_reservation(k).v->nr_replicas; 1705 1678 s64 sectors = (s64) k.k->size; 1706 1679 struct replicas_delta_list *d; ··· 1717 1700 return 0; 1718 1701 } 1719 1702 1720 - static int __bch2_trans_mark_reflink_p(struct btree_trans *trans, 1703 + int bch2_trans_mark_reservation(struct btree_trans *trans, 1704 + enum btree_id btree_id, unsigned level, 1705 + struct bkey_s_c old, 1706 + struct bkey_i *new, 1707 + unsigned flags) 1708 + { 1709 + return trigger_run_overwrite_then_insert(__trans_mark_reservation, trans, btree_id, level, old, new, flags); 1710 + } 1711 + 1712 + static int trans_mark_reflink_p_segment(struct btree_trans *trans, 1721 1713 struct bkey_s_c_reflink_p p, 1722 1714 u64 *idx, unsigned flags) 1723 1715 { ··· 1793 1767 return ret; 1794 1768 } 1795 1769 1796 - int bch2_trans_mark_reflink_p(struct btree_trans *trans, 1797 - enum btree_id btree_id, unsigned level, 1798 - struct bkey_s_c old, 1799 - struct bkey_i *new, 1800 - unsigned flags) 1770 + static int __trans_mark_reflink_p(struct btree_trans *trans, 1771 + enum btree_id btree_id, unsigned level, 1772 + struct bkey_s_c k, unsigned flags) 1801 1773 { 1802 - struct bkey_s_c k = flags & BTREE_TRIGGER_OVERWRITE 1803 - ? old 1804 - : bkey_i_to_s_c(new); 1805 1774 struct bkey_s_c_reflink_p p = bkey_s_c_to_reflink_p(k); 1806 1775 u64 idx, end_idx; 1807 1776 int ret = 0; 1808 - 1809 - if (flags & BTREE_TRIGGER_INSERT) { 1810 - struct bch_reflink_p *v = (struct bch_reflink_p *) p.v; 1811 - 1812 - v->front_pad = v->back_pad = 0; 1813 - } 1814 1777 1815 1778 idx = le64_to_cpu(p.v->idx) - le32_to_cpu(p.v->front_pad); 1816 1779 end_idx = le64_to_cpu(p.v->idx) + p.k->size + 1817 1780 le32_to_cpu(p.v->back_pad); 1818 1781 1819 1782 while (idx < end_idx && !ret) 1820 - ret = __bch2_trans_mark_reflink_p(trans, p, &idx, flags); 1821 - 1783 + ret = trans_mark_reflink_p_segment(trans, p, &idx, flags); 1822 1784 return ret; 1785 + } 1786 + 1787 + int bch2_trans_mark_reflink_p(struct btree_trans *trans, 1788 + enum btree_id btree_id, unsigned level, 1789 + struct bkey_s_c old, 1790 + struct bkey_i *new, 1791 + unsigned flags) 1792 + { 1793 + if (flags & BTREE_TRIGGER_INSERT) { 1794 + struct bch_reflink_p *v = &bkey_i_to_reflink_p(new)->v; 1795 + 1796 + v->front_pad = v->back_pad = 0; 1797 + } 1798 + 1799 + return trigger_run_overwrite_then_insert(__trans_mark_reflink_p, trans, btree_id, level, old, new, flags); 1823 1800 } 1824 1801 1825 1802 static int __bch2_trans_mark_metadata_bucket(struct btree_trans *trans,
+14
fs/bcachefs/buckets.h
··· 339 339 int bch2_trans_mark_reservation(struct btree_trans *, enum btree_id, unsigned, struct bkey_s_c, struct bkey_i *, unsigned); 340 340 int bch2_trans_mark_reflink_p(struct btree_trans *, enum btree_id, unsigned, struct bkey_s_c, struct bkey_i *, unsigned); 341 341 342 + #define mem_trigger_run_overwrite_then_insert(_fn, _trans, _btree_id, _level, _old, _new, _flags)\ 343 + ({ \ 344 + int ret = 0; \ 345 + \ 346 + if (_old.k->type) \ 347 + ret = _fn(_trans, _btree_id, _level, _old, _flags & ~BTREE_TRIGGER_INSERT); \ 348 + if (!ret && _new.k->type) \ 349 + ret = _fn(_trans, _btree_id, _level, _new, _flags & ~BTREE_TRIGGER_OVERWRITE); \ 350 + ret; \ 351 + }) 352 + 353 + #define trigger_run_overwrite_then_insert(_fn, _trans, _btree_id, _level, _old, _new, _flags) \ 354 + mem_trigger_run_overwrite_then_insert(_fn, _trans, _btree_id, _level, _old, bkey_i_to_s_c(_new), _flags) 355 + 342 356 void bch2_trans_fs_usage_revert(struct btree_trans *, struct replicas_delta_list *); 343 357 int bch2_trans_fs_usage_apply(struct btree_trans *, struct replicas_delta_list *); 344 358
+13 -21
fs/bcachefs/reflink.c
··· 103 103 } 104 104 #endif 105 105 106 + static inline void check_indirect_extent_deleting(struct bkey_i *new, unsigned *flags) 107 + { 108 + if ((*flags & BTREE_TRIGGER_INSERT) && !*bkey_refcount(new)) { 109 + new->k.type = KEY_TYPE_deleted; 110 + new->k.size = 0; 111 + set_bkey_val_u64s(&new->k, 0);; 112 + *flags &= ~BTREE_TRIGGER_INSERT; 113 + } 114 + } 115 + 106 116 int bch2_trans_mark_reflink_v(struct btree_trans *trans, 107 117 enum btree_id btree_id, unsigned level, 108 118 struct bkey_s_c old, struct bkey_i *new, 109 119 unsigned flags) 110 120 { 111 - if (!(flags & BTREE_TRIGGER_OVERWRITE)) { 112 - struct bkey_i_reflink_v *r = bkey_i_to_reflink_v(new); 113 - 114 - if (!r->v.refcount) { 115 - r->k.type = KEY_TYPE_deleted; 116 - r->k.size = 0; 117 - set_bkey_val_u64s(&r->k, 0); 118 - return 0; 119 - } 120 - } 121 + check_indirect_extent_deleting(new, &flags); 121 122 122 123 return bch2_trans_mark_extent(trans, btree_id, level, old, new, flags); 123 124 } ··· 133 132 } 134 133 135 134 void bch2_indirect_inline_data_to_text(struct printbuf *out, 136 - struct bch_fs *c, struct bkey_s_c k) 135 + struct bch_fs *c, struct bkey_s_c k) 137 136 { 138 137 struct bkey_s_c_indirect_inline_data d = bkey_s_c_to_indirect_inline_data(k); 139 138 unsigned datalen = bkey_inline_data_bytes(k.k); ··· 148 147 struct bkey_s_c old, struct bkey_i *new, 149 148 unsigned flags) 150 149 { 151 - if (!(flags & BTREE_TRIGGER_OVERWRITE)) { 152 - struct bkey_i_indirect_inline_data *r = 153 - bkey_i_to_indirect_inline_data(new); 154 - 155 - if (!r->v.refcount) { 156 - r->k.type = KEY_TYPE_deleted; 157 - r->k.size = 0; 158 - set_bkey_val_u64s(&r->k, 0); 159 - } 160 - } 150 + check_indirect_extent_deleting(new, &flags); 161 151 162 152 return 0; 163 153 }