btree.c (4e1ebae3ee4e0ce384c33832f66e417a965b64bc) btree.c (4a784266c6a75f375e08915b35e909df19eff17f)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2010 Kent Overstreet <kent.overstreet@gmail.com>
4 *
5 * Uses a block device as cache for other block devices; optimized for SSDs.
6 * All allocation is done in buckets, which should match the erase block size
7 * of the device.
8 *

--- 103 unchanged lines hidden (view full) ---

112 /* If not a leaf node, always sort */
113 if (b->level && b->keys.nsets)
114 bch_btree_sort(&b->keys, &b->c->sort);
115 else
116 bch_btree_sort_lazy(&b->keys, &b->c->sort);
117
118 if (b->written < btree_blocks(b))
119 bch_bset_init_next(&b->keys, write_block(b),
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2010 Kent Overstreet <kent.overstreet@gmail.com>
4 *
5 * Uses a block device as cache for other block devices; optimized for SSDs.
6 * All allocation is done in buckets, which should match the erase block size
7 * of the device.
8 *

--- 103 unchanged lines hidden (view full) ---

112 /* If not a leaf node, always sort */
113 if (b->level && b->keys.nsets)
114 bch_btree_sort(&b->keys, &b->c->sort);
115 else
116 bch_btree_sort_lazy(&b->keys, &b->c->sort);
117
118 if (b->written < btree_blocks(b))
119 bch_bset_init_next(&b->keys, write_block(b),
120 bset_magic(&b->c->sb));
120 bset_magic(&b->c->cache->sb));
121
122}
123
124/* Btree key manipulation */
125
126void bkey_put(struct cache_set *c, struct bkey *k)
127{
128 unsigned int i;

--- 21 unchanged lines hidden (view full) ---

150 struct btree_iter *iter;
151
152 /*
153 * c->fill_iter can allocate an iterator with more memory space
154 * than static MAX_BSETS.
155 * See the comment arount cache_set->fill_iter.
156 */
157 iter = mempool_alloc(&b->c->fill_iter, GFP_NOIO);
121
122}
123
124/* Btree key manipulation */
125
126void bkey_put(struct cache_set *c, struct bkey *k)
127{
128 unsigned int i;

--- 21 unchanged lines hidden (view full) ---

150 struct btree_iter *iter;
151
152 /*
153 * c->fill_iter can allocate an iterator with more memory space
154 * than static MAX_BSETS.
155 * See the comment arount cache_set->fill_iter.
156 */
157 iter = mempool_alloc(&b->c->fill_iter, GFP_NOIO);
158 iter->size = b->c->sb.bucket_size / b->c->sb.block_size;
158 iter->size = b->c->cache->sb.bucket_size / b->c->cache->sb.block_size;
159 iter->used = 0;
160
161#ifdef CONFIG_BCACHE_DEBUG
162 iter->b = &b->keys;
163#endif
164
165 if (!i->seq)
166 goto err;

--- 6 unchanged lines hidden (view full) ---

173 goto err;
174
175 err = "bad btree header";
176 if (b->written + set_blocks(i, block_bytes(b->c->cache)) >
177 btree_blocks(b))
178 goto err;
179
180 err = "bad magic";
159 iter->used = 0;
160
161#ifdef CONFIG_BCACHE_DEBUG
162 iter->b = &b->keys;
163#endif
164
165 if (!i->seq)
166 goto err;

--- 6 unchanged lines hidden (view full) ---

173 goto err;
174
175 err = "bad btree header";
176 if (b->written + set_blocks(i, block_bytes(b->c->cache)) >
177 btree_blocks(b))
178 goto err;
179
180 err = "bad magic";
181 if (i->magic != bset_magic(&b->c->sb))
181 if (i->magic != bset_magic(&b->c->cache->sb))
182 goto err;
183
184 err = "bad checksum";
185 switch (i->version) {
186 case 0:
187 if (i->csum != csum_set(i))
188 goto err;
189 break;

--- 24 unchanged lines hidden (view full) ---

214 i = b->keys.set[0].data;
215 err = "short btree key";
216 if (b->keys.set[0].size &&
217 bkey_cmp(&b->key, &b->keys.set[0].end) < 0)
218 goto err;
219
220 if (b->written < btree_blocks(b))
221 bch_bset_init_next(&b->keys, write_block(b),
182 goto err;
183
184 err = "bad checksum";
185 switch (i->version) {
186 case 0:
187 if (i->csum != csum_set(i))
188 goto err;
189 break;

--- 24 unchanged lines hidden (view full) ---

214 i = b->keys.set[0].data;
215 err = "short btree key";
216 if (b->keys.set[0].size &&
217 bkey_cmp(&b->key, &b->keys.set[0].end) < 0)
218 goto err;
219
220 if (b->written < btree_blocks(b))
221 bch_bset_init_next(&b->keys, write_block(b),
222 bset_magic(&b->c->sb));
222 bset_magic(&b->c->cache->sb));
223out:
224 mempool_free(iter, &b->c->fill_iter);
225 return;
226err:
227 set_btree_node_io_error(b);
228 bch_cache_set_error(b->c, "%s at bucket %zu, block %u, %u keys",
229 err, PTR_BUCKET_NR(b->c, &b->key, 0),
230 bset_block_offset(b, i), i->keys);

--- 187 unchanged lines hidden (view full) ---

418 down(&b->io_mutex);
419 closure_init(&b->io, parent ?: &b->c->cl);
420
421 clear_bit(BTREE_NODE_dirty, &b->flags);
422 change_bit(BTREE_NODE_write_idx, &b->flags);
423
424 do_btree_node_write(b);
425
223out:
224 mempool_free(iter, &b->c->fill_iter);
225 return;
226err:
227 set_btree_node_io_error(b);
228 bch_cache_set_error(b->c, "%s at bucket %zu, block %u, %u keys",
229 err, PTR_BUCKET_NR(b->c, &b->key, 0),
230 bset_block_offset(b, i), i->keys);

--- 187 unchanged lines hidden (view full) ---

418 down(&b->io_mutex);
419 closure_init(&b->io, parent ?: &b->c->cl);
420
421 clear_bit(BTREE_NODE_dirty, &b->flags);
422 change_bit(BTREE_NODE_write_idx, &b->flags);
423
424 do_btree_node_write(b);
425
426 atomic_long_add(set_blocks(i, block_bytes(b->c->cache)) * b->c->sb.block_size,
426 atomic_long_add(set_blocks(i, block_bytes(b->c->cache)) * b->c->cache->sb.block_size,
427 &PTR_CACHE(b->c, &b->key, 0)->btree_sectors_written);
428
429 b->written += set_blocks(i, block_bytes(b->c->cache));
430}
431
432void bch_btree_node_write(struct btree *b, struct closure *parent)
433{
434 unsigned int nsets = b->keys.nsets;

--- 298 unchanged lines hidden (view full) ---

733 unregister_shrinker(&c->shrink);
734
735 mutex_lock(&c->bucket_lock);
736
737#ifdef CONFIG_BCACHE_DEBUG
738 if (c->verify_data)
739 list_move(&c->verify_data->list, &c->btree_cache);
740
427 &PTR_CACHE(b->c, &b->key, 0)->btree_sectors_written);
428
429 b->written += set_blocks(i, block_bytes(b->c->cache));
430}
431
432void bch_btree_node_write(struct btree *b, struct closure *parent)
433{
434 unsigned int nsets = b->keys.nsets;

--- 298 unchanged lines hidden (view full) ---

733 unregister_shrinker(&c->shrink);
734
735 mutex_lock(&c->bucket_lock);
736
737#ifdef CONFIG_BCACHE_DEBUG
738 if (c->verify_data)
739 list_move(&c->verify_data->list, &c->btree_cache);
740
741 free_pages((unsigned long) c->verify_ondisk, ilog2(meta_bucket_pages(&c->sb)));
741 free_pages((unsigned long) c->verify_ondisk, ilog2(meta_bucket_pages(&c->cache->sb)));
742#endif
743
744 list_splice(&c->btree_cache_freeable,
745 &c->btree_cache);
746
747 while (!list_empty(&c->btree_cache)) {
748 b = list_first_entry(&c->btree_cache, struct btree, list);
749

--- 30 unchanged lines hidden (view full) ---

780
781 list_splice_init(&c->btree_cache,
782 &c->btree_cache_freeable);
783
784#ifdef CONFIG_BCACHE_DEBUG
785 mutex_init(&c->verify_lock);
786
787 c->verify_ondisk = (void *)
742#endif
743
744 list_splice(&c->btree_cache_freeable,
745 &c->btree_cache);
746
747 while (!list_empty(&c->btree_cache)) {
748 b = list_first_entry(&c->btree_cache, struct btree, list);
749

--- 30 unchanged lines hidden (view full) ---

780
781 list_splice_init(&c->btree_cache,
782 &c->btree_cache_freeable);
783
784#ifdef CONFIG_BCACHE_DEBUG
785 mutex_init(&c->verify_lock);
786
787 c->verify_ondisk = (void *)
788 __get_free_pages(GFP_KERNEL|__GFP_COMP, ilog2(meta_bucket_pages(&c->sb)));
788 __get_free_pages(GFP_KERNEL|__GFP_COMP,
789 ilog2(meta_bucket_pages(&c->cache->sb)));
789 if (!c->verify_ondisk) {
790 /*
791 * Don't worry about the mca_rereserve buckets
792 * allocated in previous for-loop, they will be
793 * handled properly in bch_cache_set_unregister().
794 */
795 return -ENOMEM;
796 }

--- 306 unchanged lines hidden (view full) ---

1103
1104 if (!b) {
1105 cache_bug(c,
1106 "Tried to allocate bucket that was in btree cache");
1107 goto retry;
1108 }
1109
1110 b->parent = parent;
790 if (!c->verify_ondisk) {
791 /*
792 * Don't worry about the mca_rereserve buckets
793 * allocated in previous for-loop, they will be
794 * handled properly in bch_cache_set_unregister().
795 */
796 return -ENOMEM;
797 }

--- 306 unchanged lines hidden (view full) ---

1104
1105 if (!b) {
1106 cache_bug(c,
1107 "Tried to allocate bucket that was in btree cache");
1108 goto retry;
1109 }
1110
1111 b->parent = parent;
1111 bch_bset_init_next(&b->keys, b->keys.set->data, bset_magic(&b->c->sb));
1112 bch_bset_init_next(&b->keys, b->keys.set->data, bset_magic(&b->c->cache->sb));
1112
1113 mutex_unlock(&c->bucket_lock);
1114
1115 trace_bcache_btree_node_alloc(b);
1116 return b;
1117err_free:
1118 bch_bucket_free(c, &k.key);
1119err:

--- 1646 unchanged lines hidden ---
1113
1114 mutex_unlock(&c->bucket_lock);
1115
1116 trace_bcache_btree_node_alloc(b);
1117 return b;
1118err_free:
1119 bch_bucket_free(c, &k.key);
1120err:

--- 1646 unchanged lines hidden ---