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 --- |