#include <linux/sort.h>
-static bool btree_trans_relock(struct btree_insert *);
-static void btree_trans_unlock(struct btree_insert *);
+static bool btree_trans_relock(struct btree_trans *);
+static void btree_trans_unlock(struct btree_trans *);
/* Inserting into a given leaf node (last stage of insert): */
return __btree_node_flush(j, pin, 1, seq);
}
-static inline void __btree_journal_key(struct btree_insert *trans,
+static inline void __btree_journal_key(struct btree_trans *trans,
enum btree_id btree_id,
struct bkey_i *insert)
{
*trans->journal_seq = seq;
}
-void bch2_btree_journal_key(struct btree_insert *trans,
+void bch2_btree_journal_key(struct btree_trans *trans,
struct btree_iter *iter,
struct bkey_i *insert)
{
set_btree_node_dirty(b);
}
-static void bch2_insert_fixup_key(struct btree_insert *trans,
+static void bch2_insert_fixup_key(struct btree_trans *trans,
struct btree_insert_entry *insert)
{
struct btree_iter *iter = insert->iter;
/**
* btree_insert_key - insert a key one key into a leaf node
*/
-static void btree_insert_key_leaf(struct btree_insert *trans,
+static void btree_insert_key_leaf(struct btree_trans *trans,
struct btree_insert_entry *insert)
{
struct bch_fs *c = trans->c;
kfree(k);
}
-static void btree_insert_key_deferred(struct btree_insert *trans,
+static void btree_insert_key_deferred(struct btree_trans *trans,
struct btree_insert_entry *insert)
{
struct bch_fs *c = trans->c;
* We sort transaction entries so that if multiple iterators point to the same
* leaf node they'll be adjacent:
*/
-static bool same_leaf_as_prev(struct btree_insert *trans,
+static bool same_leaf_as_prev(struct btree_trans *trans,
struct btree_insert_entry *i)
{
- return i != trans->entries &&
+ return i != trans->updates &&
!i->deferred &&
i[0].iter->l[0].b == i[-1].iter->l[0].b;
}
#define __trans_next_entry(_trans, _i, _filter) \
({ \
- while ((_i) < (_trans)->entries + (_trans->nr) && !(_filter)) \
+ while ((_i) < (_trans)->updates + (_trans->nr_updates) && !(_filter))\
(_i)++; \
\
- (_i) < (_trans)->entries + (_trans->nr); \
+ (_i) < (_trans)->updates + (_trans->nr_updates); \
})
#define __trans_for_each_entry(_trans, _i, _filter) \
- for ((_i) = (_trans)->entries; \
+ for ((_i) = (_trans)->updates; \
__trans_next_entry(_trans, _i, _filter); \
(_i)++)
bch2_btree_init_next(c, b, iter);
}
-static void multi_lock_write(struct bch_fs *c, struct btree_insert *trans)
+static void multi_lock_write(struct bch_fs *c, struct btree_trans *trans)
{
struct btree_insert_entry *i;
bch2_btree_node_lock_for_insert(c, i->iter->l[0].b, i->iter);
}
-static void multi_unlock_write(struct btree_insert *trans)
+static void multi_unlock_write(struct btree_trans *trans)
{
struct btree_insert_entry *i;
btree_iter_cmp(l.iter, r.iter);
}
-static bool btree_trans_relock(struct btree_insert *trans)
+static bool btree_trans_relock(struct btree_trans *trans)
{
struct btree_insert_entry *i;
return true;
}
-static void btree_trans_unlock(struct btree_insert *trans)
+static void btree_trans_unlock(struct btree_trans *trans)
{
struct btree_insert_entry *i;
/* Normal update interface: */
static enum btree_insert_ret
-btree_key_can_insert(struct btree_insert *trans,
+btree_key_can_insert(struct btree_trans *trans,
struct btree_insert_entry *insert,
unsigned *u64s)
{
return BTREE_INSERT_OK;
}
-static inline void do_btree_insert_one(struct btree_insert *trans,
+static inline void do_btree_insert_one(struct btree_trans *trans,
struct btree_insert_entry *insert)
{
if (likely(!insert->deferred))
/*
* Get journal reservation, take write locks, and attempt to do btree update(s):
*/
-static inline int do_btree_insert_at(struct btree_insert *trans,
+static inline int do_btree_insert_at(struct btree_trans *trans,
struct btree_insert_entry **stopped_at)
{
struct bch_fs *c = trans->c;
* -EROFS: filesystem read only
* -EIO: journal or btree node IO error
*/
-static int __bch2_btree_insert_at(struct btree_insert *trans)
+static int __bch2_btree_insert_at(struct btree_trans *trans)
{
struct bch_fs *c = trans->c;
struct btree_insert_entry *i;
unsigned flags, u64s = 0;
int ret;
- BUG_ON(!trans->nr);
+ BUG_ON(!trans->nr_updates);
/* for the sake of sanity: */
- BUG_ON(trans->nr > 1 && !(trans->flags & BTREE_INSERT_ATOMIC));
+ BUG_ON(trans->nr_updates > 1 && !(trans->flags & BTREE_INSERT_ATOMIC));
if (trans->flags & BTREE_INSERT_GC_LOCK_HELD)
lockdep_assert_held(&c->gc_lock);
memset(&trans->journal_preres, 0, sizeof(trans->journal_preres));
- bubble_sort(trans->entries, trans->nr, btree_trans_cmp);
+ bubble_sort(trans->updates, trans->nr_updates, btree_trans_cmp);
trans_for_each_entry(trans, i)
btree_insert_entry_checks(c, i);
goto out;
}
- bch2_btree_iter_unlock(trans->entries[0].iter);
+ bch2_trans_unlock(trans);
ret = -EINTR;
trans_for_each_iter(trans, i) {
u64 *journal_seq,
unsigned flags)
{
- struct btree_insert insert = {
- .c = trans->c,
- .disk_res = disk_res,
- .journal_seq = journal_seq,
- .flags = flags,
- .nr = trans->nr_updates,
- .entries = trans->updates,
- };
+ int ret;
if (!trans->nr_updates)
return 0;
+ trans->disk_res = disk_res;
+ trans->journal_seq = journal_seq;
+ trans->flags = flags;
+
+ ret = __bch2_btree_insert_at(trans);
+
trans->nr_updates = 0;
- return __bch2_btree_insert_at(&insert);
+ return ret;
}
int bch2_btree_delete_at(struct btree_trans *trans,