btree.c (05335cff9f01555b769ac97b7bacc472b7ed047a) | btree.c (2a285686c109816ba71a00b9278262cf02648258) |
---|---|
1/* 2 * Copyright (C) 2010 Kent Overstreet <kent.overstreet@gmail.com> 3 * 4 * Uses a block device as cache for other block devices; optimized for SSDs. 5 * All allocation is done in buckets, which should match the erase block size 6 * of the device. 7 * 8 * Buckets containing cached data are kept on a heap sorted by priority; --- 153 unchanged lines hidden (view full) --- 162 _r; \ 163}) 164 165static inline struct bset *write_block(struct btree *b) 166{ 167 return ((void *) btree_bset_first(b)) + b->written * block_bytes(b->c); 168} 169 | 1/* 2 * Copyright (C) 2010 Kent Overstreet <kent.overstreet@gmail.com> 3 * 4 * Uses a block device as cache for other block devices; optimized for SSDs. 5 * All allocation is done in buckets, which should match the erase block size 6 * of the device. 7 * 8 * Buckets containing cached data are kept on a heap sorted by priority; --- 153 unchanged lines hidden (view full) --- 162 _r; \ 163}) 164 165static inline struct bset *write_block(struct btree *b) 166{ 167 return ((void *) btree_bset_first(b)) + b->written * block_bytes(b->c); 168} 169 |
170static void bch_btree_init_next(struct btree *b) 171{ 172 /* If not a leaf node, always sort */ 173 if (b->level && b->keys.nsets) 174 bch_btree_sort(&b->keys, &b->c->sort); 175 else 176 bch_btree_sort_lazy(&b->keys, &b->c->sort); 177 178 if (b->written < btree_blocks(b)) 179 bch_bset_init_next(&b->keys, write_block(b), 180 bset_magic(&b->c->sb)); 181 182} 183 |
|
170/* Btree key manipulation */ 171 172void bkey_put(struct cache_set *c, struct bkey *k) 173{ 174 unsigned i; 175 176 for (i = 0; i < KEY_PTRS(k); i++) 177 if (ptr_available(c, k, i)) --- 255 unchanged lines hidden (view full) --- 433 434 bch_submit_bbio(b->bio, b->c, &k.key, 0); 435 436 closure_sync(cl); 437 continue_at_nobarrier(cl, __btree_node_write_done, NULL); 438 } 439} 440 | 184/* Btree key manipulation */ 185 186void bkey_put(struct cache_set *c, struct bkey *k) 187{ 188 unsigned i; 189 190 for (i = 0; i < KEY_PTRS(k); i++) 191 if (ptr_available(c, k, i)) --- 255 unchanged lines hidden (view full) --- 447 448 bch_submit_bbio(b->bio, b->c, &k.key, 0); 449 450 closure_sync(cl); 451 continue_at_nobarrier(cl, __btree_node_write_done, NULL); 452 } 453} 454 |
441void bch_btree_node_write(struct btree *b, struct closure *parent) | 455void __bch_btree_node_write(struct btree *b, struct closure *parent) |
442{ 443 struct bset *i = btree_bset_last(b); 444 | 456{ 457 struct bset *i = btree_bset_last(b); 458 |
459 lockdep_assert_held(&b->write_lock); 460 |
|
445 trace_bcache_btree_write(b); 446 447 BUG_ON(current->bio_list); 448 BUG_ON(b->written >= btree_blocks(b)); 449 BUG_ON(b->written && !i->keys); 450 BUG_ON(btree_bset_first(b)->seq != i->seq); 451 bch_check_keys(&b->keys, "writing"); 452 --- 7 unchanged lines hidden (view full) --- 460 change_bit(BTREE_NODE_write_idx, &b->flags); 461 462 do_btree_node_write(b); 463 464 atomic_long_add(set_blocks(i, block_bytes(b->c)) * b->c->sb.block_size, 465 &PTR_CACHE(b->c, &b->key, 0)->btree_sectors_written); 466 467 b->written += set_blocks(i, block_bytes(b->c)); | 461 trace_bcache_btree_write(b); 462 463 BUG_ON(current->bio_list); 464 BUG_ON(b->written >= btree_blocks(b)); 465 BUG_ON(b->written && !i->keys); 466 BUG_ON(btree_bset_first(b)->seq != i->seq); 467 bch_check_keys(&b->keys, "writing"); 468 --- 7 unchanged lines hidden (view full) --- 476 change_bit(BTREE_NODE_write_idx, &b->flags); 477 478 do_btree_node_write(b); 479 480 atomic_long_add(set_blocks(i, block_bytes(b->c)) * b->c->sb.block_size, 481 &PTR_CACHE(b->c, &b->key, 0)->btree_sectors_written); 482 483 b->written += set_blocks(i, block_bytes(b->c)); |
484} |
|
468 | 485 |
469 /* If not a leaf node, always sort */ 470 if (b->level && b->keys.nsets) 471 bch_btree_sort(&b->keys, &b->c->sort); 472 else 473 bch_btree_sort_lazy(&b->keys, &b->c->sort); | 486void bch_btree_node_write(struct btree *b, struct closure *parent) 487{ 488 unsigned nsets = b->keys.nsets; |
474 | 489 |
490 lockdep_assert_held(&b->lock); 491 492 __bch_btree_node_write(b, parent); 493 |
|
475 /* 476 * do verify if there was more than one set initially (i.e. we did a 477 * sort) and we sorted down to a single set: 478 */ | 494 /* 495 * do verify if there was more than one set initially (i.e. we did a 496 * sort) and we sorted down to a single set: 497 */ |
479 if (i != b->keys.set->data && !b->keys.nsets) | 498 if (nsets && !b->keys.nsets) |
480 bch_btree_verify(b); 481 | 499 bch_btree_verify(b); 500 |
482 if (b->written < btree_blocks(b)) 483 bch_bset_init_next(&b->keys, write_block(b), 484 bset_magic(&b->c->sb)); | 501 bch_btree_init_next(b); |
485} 486 487static void bch_btree_node_write_sync(struct btree *b) 488{ 489 struct closure cl; 490 491 closure_init_stack(&cl); | 502} 503 504static void bch_btree_node_write_sync(struct btree *b) 505{ 506 struct closure cl; 507 508 closure_init_stack(&cl); |
509 510 mutex_lock(&b->write_lock); |
|
492 bch_btree_node_write(b, &cl); | 511 bch_btree_node_write(b, &cl); |
512 mutex_unlock(&b->write_lock); 513 |
|
493 closure_sync(&cl); 494} 495 496static void btree_node_write_work(struct work_struct *w) 497{ 498 struct btree *b = container_of(to_delayed_work(w), struct btree, work); 499 | 514 closure_sync(&cl); 515} 516 517static void btree_node_write_work(struct work_struct *w) 518{ 519 struct btree *b = container_of(to_delayed_work(w), struct btree, work); 520 |
500 rw_lock(true, b, b->level); 501 | 521 mutex_lock(&b->write_lock); |
502 if (btree_node_dirty(b)) | 522 if (btree_node_dirty(b)) |
503 bch_btree_node_write(b, NULL); 504 rw_unlock(true, b); | 523 __bch_btree_node_write(b, NULL); 524 mutex_unlock(&b->write_lock); |
505} 506 507static void bch_btree_leaf_dirty(struct btree *b, atomic_t *journal_ref) 508{ 509 struct bset *i = btree_bset_last(b); 510 struct btree_write *w = btree_current_write(b); 511 | 525} 526 527static void bch_btree_leaf_dirty(struct btree *b, atomic_t *journal_ref) 528{ 529 struct bset *i = btree_bset_last(b); 530 struct btree_write *w = btree_current_write(b); 531 |
532 lockdep_assert_held(&b->write_lock); 533 |
|
512 BUG_ON(!b->written); 513 BUG_ON(!i->keys); 514 515 if (!btree_node_dirty(b)) 516 queue_delayed_work(btree_io_wq, &b->work, 30 * HZ); 517 518 set_btree_node_dirty(b); 519 --- 68 unchanged lines hidden (view full) --- 588 struct bkey *k, gfp_t gfp) 589{ 590 struct btree *b = kzalloc(sizeof(struct btree), gfp); 591 if (!b) 592 return NULL; 593 594 init_rwsem(&b->lock); 595 lockdep_set_novalidate_class(&b->lock); | 534 BUG_ON(!b->written); 535 BUG_ON(!i->keys); 536 537 if (!btree_node_dirty(b)) 538 queue_delayed_work(btree_io_wq, &b->work, 30 * HZ); 539 540 set_btree_node_dirty(b); 541 --- 68 unchanged lines hidden (view full) --- 610 struct bkey *k, gfp_t gfp) 611{ 612 struct btree *b = kzalloc(sizeof(struct btree), gfp); 613 if (!b) 614 return NULL; 615 616 init_rwsem(&b->lock); 617 lockdep_set_novalidate_class(&b->lock); |
618 mutex_init(&b->write_lock); 619 lockdep_set_novalidate_class(&b->write_lock); |
|
596 INIT_LIST_HEAD(&b->list); 597 INIT_DELAYED_WORK(&b->work, btree_node_write_work); 598 b->c = c; 599 sema_init(&b->io_mutex, 1); 600 601 mca_data_alloc(b, k, gfp); 602 return b; 603} --- 17 unchanged lines hidden (view full) --- 621 if (btree_node_dirty(b)) 622 goto out_unlock; 623 624 if (down_trylock(&b->io_mutex)) 625 goto out_unlock; 626 up(&b->io_mutex); 627 } 628 | 620 INIT_LIST_HEAD(&b->list); 621 INIT_DELAYED_WORK(&b->work, btree_node_write_work); 622 b->c = c; 623 sema_init(&b->io_mutex, 1); 624 625 mca_data_alloc(b, k, gfp); 626 return b; 627} --- 17 unchanged lines hidden (view full) --- 645 if (btree_node_dirty(b)) 646 goto out_unlock; 647 648 if (down_trylock(&b->io_mutex)) 649 goto out_unlock; 650 up(&b->io_mutex); 651 } 652 |
653 mutex_lock(&b->write_lock); |
|
629 if (btree_node_dirty(b)) | 654 if (btree_node_dirty(b)) |
630 bch_btree_node_write_sync(b); | 655 __bch_btree_node_write(b, &cl); 656 mutex_unlock(&b->write_lock); |
631 | 657 |
658 closure_sync(&cl); 659 |
|
632 /* wait for any in flight btree write */ 633 down(&b->io_mutex); 634 up(&b->io_mutex); 635 636 return 0; 637out_unlock: 638 rw_unlock(true, b); 639 return -ENOMEM; --- 365 unchanged lines hidden (view full) --- 1005/* Btree alloc */ 1006 1007static void btree_node_free(struct btree *b) 1008{ 1009 trace_bcache_btree_node_free(b); 1010 1011 BUG_ON(b == b->c->root); 1012 | 660 /* wait for any in flight btree write */ 661 down(&b->io_mutex); 662 up(&b->io_mutex); 663 664 return 0; 665out_unlock: 666 rw_unlock(true, b); 667 return -ENOMEM; --- 365 unchanged lines hidden (view full) --- 1033/* Btree alloc */ 1034 1035static void btree_node_free(struct btree *b) 1036{ 1037 trace_bcache_btree_node_free(b); 1038 1039 BUG_ON(b == b->c->root); 1040 |
1041 mutex_lock(&b->write_lock); 1042 |
|
1013 if (btree_node_dirty(b)) 1014 btree_complete_write(b, btree_current_write(b)); 1015 clear_bit(BTREE_NODE_dirty, &b->flags); 1016 | 1043 if (btree_node_dirty(b)) 1044 btree_complete_write(b, btree_current_write(b)); 1045 clear_bit(BTREE_NODE_dirty, &b->flags); 1046 |
1047 mutex_unlock(&b->write_lock); 1048 |
|
1017 cancel_delayed_work(&b->work); 1018 1019 mutex_lock(&b->c->bucket_lock); 1020 bch_bucket_free(b->c, &b->key); 1021 mca_bucket_free(b); 1022 mutex_unlock(&b->c->bucket_lock); 1023} 1024 --- 35 unchanged lines hidden (view full) --- 1060 trace_bcache_btree_node_alloc_fail(b); 1061 return b; 1062} 1063 1064static struct btree *btree_node_alloc_replacement(struct btree *b, bool wait) 1065{ 1066 struct btree *n = bch_btree_node_alloc(b->c, b->level, wait); 1067 if (!IS_ERR_OR_NULL(n)) { | 1049 cancel_delayed_work(&b->work); 1050 1051 mutex_lock(&b->c->bucket_lock); 1052 bch_bucket_free(b->c, &b->key); 1053 mca_bucket_free(b); 1054 mutex_unlock(&b->c->bucket_lock); 1055} 1056 --- 35 unchanged lines hidden (view full) --- 1092 trace_bcache_btree_node_alloc_fail(b); 1093 return b; 1094} 1095 1096static struct btree *btree_node_alloc_replacement(struct btree *b, bool wait) 1097{ 1098 struct btree *n = bch_btree_node_alloc(b->c, b->level, wait); 1099 if (!IS_ERR_OR_NULL(n)) { |
1100 mutex_lock(&n->write_lock); |
|
1068 bch_btree_sort_into(&b->keys, &n->keys, &b->c->sort); 1069 bkey_copy_key(&n->key, &b->key); | 1101 bch_btree_sort_into(&b->keys, &n->keys, &b->c->sort); 1102 bkey_copy_key(&n->key, &b->key); |
1103 mutex_unlock(&n->write_lock); |
|
1070 } 1071 1072 return n; 1073} 1074 1075static void make_btree_freeing_key(struct btree *b, struct bkey *k) 1076{ 1077 unsigned i; --- 186 unchanged lines hidden (view full) --- 1264 return 0; 1265 1266 for (i = 0; i < nodes; i++) { 1267 new_nodes[i] = btree_node_alloc_replacement(r[i].b, false); 1268 if (IS_ERR_OR_NULL(new_nodes[i])) 1269 goto out_nocoalesce; 1270 } 1271 | 1104 } 1105 1106 return n; 1107} 1108 1109static void make_btree_freeing_key(struct btree *b, struct bkey *k) 1110{ 1111 unsigned i; --- 186 unchanged lines hidden (view full) --- 1298 return 0; 1299 1300 for (i = 0; i < nodes; i++) { 1301 new_nodes[i] = btree_node_alloc_replacement(r[i].b, false); 1302 if (IS_ERR_OR_NULL(new_nodes[i])) 1303 goto out_nocoalesce; 1304 } 1305 |
1306 for (i = 0; i < nodes; i++) 1307 mutex_lock(&new_nodes[i]->write_lock); 1308 |
|
1272 for (i = nodes - 1; i > 0; --i) { 1273 struct bset *n1 = btree_bset_first(new_nodes[i]); 1274 struct bset *n2 = btree_bset_first(new_nodes[i - 1]); 1275 struct bkey *k, *last = NULL; 1276 1277 keys = 0; 1278 1279 if (i > 1) { --- 50 unchanged lines hidden (view full) --- 1330 if (__bch_keylist_realloc(keylist, 1331 bkey_u64s(&new_nodes[i]->key))) 1332 goto out_nocoalesce; 1333 1334 bch_btree_node_write(new_nodes[i], &cl); 1335 bch_keylist_add(keylist, &new_nodes[i]->key); 1336 } 1337 | 1309 for (i = nodes - 1; i > 0; --i) { 1310 struct bset *n1 = btree_bset_first(new_nodes[i]); 1311 struct bset *n2 = btree_bset_first(new_nodes[i - 1]); 1312 struct bkey *k, *last = NULL; 1313 1314 keys = 0; 1315 1316 if (i > 1) { --- 50 unchanged lines hidden (view full) --- 1367 if (__bch_keylist_realloc(keylist, 1368 bkey_u64s(&new_nodes[i]->key))) 1369 goto out_nocoalesce; 1370 1371 bch_btree_node_write(new_nodes[i], &cl); 1372 bch_keylist_add(keylist, &new_nodes[i]->key); 1373 } 1374 |
1375 for (i = 0; i < nodes; i++) 1376 mutex_unlock(&new_nodes[i]->write_lock); 1377 |
|
1338 closure_sync(&cl); 1339 1340 /* We emptied out this node */ 1341 BUG_ON(btree_bset_first(new_nodes[0])->keys); 1342 btree_node_free(new_nodes[0]); 1343 rw_unlock(true, new_nodes[0]); 1344 1345 for (i = 0; i < nodes; i++) { --- 48 unchanged lines hidden (view full) --- 1394 ret += bkey_u64s(k); 1395 1396 return ret; 1397} 1398 1399static int btree_gc_recurse(struct btree *b, struct btree_op *op, 1400 struct closure *writes, struct gc_stat *gc) 1401{ | 1378 closure_sync(&cl); 1379 1380 /* We emptied out this node */ 1381 BUG_ON(btree_bset_first(new_nodes[0])->keys); 1382 btree_node_free(new_nodes[0]); 1383 rw_unlock(true, new_nodes[0]); 1384 1385 for (i = 0; i < nodes; i++) { --- 48 unchanged lines hidden (view full) --- 1434 ret += bkey_u64s(k); 1435 1436 return ret; 1437} 1438 1439static int btree_gc_recurse(struct btree *b, struct btree_op *op, 1440 struct closure *writes, struct gc_stat *gc) 1441{ |
1402 unsigned i; | |
1403 int ret = 0; 1404 bool should_rewrite; 1405 struct btree *n; 1406 struct bkey *k; 1407 struct keylist keys; 1408 struct btree_iter iter; 1409 struct gc_merge_info r[GC_MERGE_NODES]; | 1442 int ret = 0; 1443 bool should_rewrite; 1444 struct btree *n; 1445 struct bkey *k; 1446 struct keylist keys; 1447 struct btree_iter iter; 1448 struct gc_merge_info r[GC_MERGE_NODES]; |
1410 struct gc_merge_info *last = r + GC_MERGE_NODES - 1; | 1449 struct gc_merge_info *i, *last = r + ARRAY_SIZE(r) - 1; |
1411 1412 bch_keylist_init(&keys); 1413 bch_btree_iter_init(&b->keys, &iter, &b->c->gc_done); 1414 | 1450 1451 bch_keylist_init(&keys); 1452 bch_btree_iter_init(&b->keys, &iter, &b->c->gc_done); 1453 |
1415 for (i = 0; i < GC_MERGE_NODES; i++) 1416 r[i].b = ERR_PTR(-EINTR); | 1454 for (i = r; i < r + ARRAY_SIZE(r); i++) 1455 i->b = ERR_PTR(-EINTR); |
1417 1418 while (1) { 1419 k = bch_btree_iter_next_filter(&iter, &b->keys, bch_ptr_bad); 1420 if (k) { 1421 r->b = bch_btree_node_get(b->c, k, b->level - 1, true); 1422 if (IS_ERR(r->b)) { 1423 ret = PTR_ERR(r->b); 1424 break; --- 13 unchanged lines hidden (view full) --- 1438 should_rewrite = btree_gc_mark_node(last->b, gc); 1439 if (should_rewrite && 1440 !btree_check_reserve(b, NULL)) { 1441 n = btree_node_alloc_replacement(last->b, 1442 false); 1443 1444 if (!IS_ERR_OR_NULL(n)) { 1445 bch_btree_node_write_sync(n); | 1456 1457 while (1) { 1458 k = bch_btree_iter_next_filter(&iter, &b->keys, bch_ptr_bad); 1459 if (k) { 1460 r->b = bch_btree_node_get(b->c, k, b->level - 1, true); 1461 if (IS_ERR(r->b)) { 1462 ret = PTR_ERR(r->b); 1463 break; --- 13 unchanged lines hidden (view full) --- 1477 should_rewrite = btree_gc_mark_node(last->b, gc); 1478 if (should_rewrite && 1479 !btree_check_reserve(b, NULL)) { 1480 n = btree_node_alloc_replacement(last->b, 1481 false); 1482 1483 if (!IS_ERR_OR_NULL(n)) { 1484 bch_btree_node_write_sync(n); |
1485 |
|
1446 bch_keylist_add(&keys, &n->key); 1447 1448 make_btree_freeing_key(last->b, 1449 keys.top); 1450 bch_keylist_push(&keys); 1451 1452 bch_btree_insert_node(b, op, &keys, 1453 NULL, NULL); --- 16 unchanged lines hidden (view full) --- 1470 } 1471 1472 bkey_copy_key(&b->c->gc_done, &last->b->key); 1473 1474 /* 1475 * Must flush leaf nodes before gc ends, since replace 1476 * operations aren't journalled 1477 */ | 1486 bch_keylist_add(&keys, &n->key); 1487 1488 make_btree_freeing_key(last->b, 1489 keys.top); 1490 bch_keylist_push(&keys); 1491 1492 bch_btree_insert_node(b, op, &keys, 1493 NULL, NULL); --- 16 unchanged lines hidden (view full) --- 1510 } 1511 1512 bkey_copy_key(&b->c->gc_done, &last->b->key); 1513 1514 /* 1515 * Must flush leaf nodes before gc ends, since replace 1516 * operations aren't journalled 1517 */ |
1518 mutex_lock(&last->b->write_lock); |
|
1478 if (btree_node_dirty(last->b)) 1479 bch_btree_node_write(last->b, writes); | 1519 if (btree_node_dirty(last->b)) 1520 bch_btree_node_write(last->b, writes); |
1521 mutex_unlock(&last->b->write_lock); |
|
1480 rw_unlock(true, last->b); 1481 } 1482 1483 memmove(r + 1, r, sizeof(r[0]) * (GC_MERGE_NODES - 1)); 1484 r->b = NULL; 1485 1486 if (need_resched()) { 1487 ret = -EAGAIN; 1488 break; 1489 } 1490 } 1491 | 1522 rw_unlock(true, last->b); 1523 } 1524 1525 memmove(r + 1, r, sizeof(r[0]) * (GC_MERGE_NODES - 1)); 1526 r->b = NULL; 1527 1528 if (need_resched()) { 1529 ret = -EAGAIN; 1530 break; 1531 } 1532 } 1533 |
1492 for (i = 0; i < GC_MERGE_NODES; i++) 1493 if (!IS_ERR_OR_NULL(r[i].b)) { 1494 if (btree_node_dirty(r[i].b)) 1495 bch_btree_node_write(r[i].b, writes); 1496 rw_unlock(true, r[i].b); | 1534 for (i = r; i < r + ARRAY_SIZE(r); i++) 1535 if (!IS_ERR_OR_NULL(i->b)) { 1536 mutex_lock(&i->b->write_lock); 1537 if (btree_node_dirty(i->b)) 1538 bch_btree_node_write(i->b, writes); 1539 mutex_unlock(&i->b->write_lock); 1540 rw_unlock(true, i->b); |
1497 } 1498 1499 bch_keylist_free(&keys); 1500 1501 return ret; 1502} 1503 1504static int bch_btree_gc_root(struct btree *b, struct btree_op *op, --- 4 unchanged lines hidden (view full) --- 1509 bool should_rewrite; 1510 1511 should_rewrite = btree_gc_mark_node(b, gc); 1512 if (should_rewrite) { 1513 n = btree_node_alloc_replacement(b, false); 1514 1515 if (!IS_ERR_OR_NULL(n)) { 1516 bch_btree_node_write_sync(n); | 1541 } 1542 1543 bch_keylist_free(&keys); 1544 1545 return ret; 1546} 1547 1548static int bch_btree_gc_root(struct btree *b, struct btree_op *op, --- 4 unchanged lines hidden (view full) --- 1553 bool should_rewrite; 1554 1555 should_rewrite = btree_gc_mark_node(b, gc); 1556 if (should_rewrite) { 1557 n = btree_node_alloc_replacement(b, false); 1558 1559 if (!IS_ERR_OR_NULL(n)) { 1560 bch_btree_node_write_sync(n); |
1561 |
|
1517 bch_btree_set_root(n); 1518 btree_node_free(b); 1519 rw_unlock(true, n); 1520 1521 return -EINTR; 1522 } 1523 } 1524 --- 341 unchanged lines hidden (view full) --- 1866 goto err_free1; 1867 1868 if (!b->parent) { 1869 n3 = bch_btree_node_alloc(b->c, b->level + 1, true); 1870 if (IS_ERR(n3)) 1871 goto err_free2; 1872 } 1873 | 1562 bch_btree_set_root(n); 1563 btree_node_free(b); 1564 rw_unlock(true, n); 1565 1566 return -EINTR; 1567 } 1568 } 1569 --- 341 unchanged lines hidden (view full) --- 1911 goto err_free1; 1912 1913 if (!b->parent) { 1914 n3 = bch_btree_node_alloc(b->c, b->level + 1, true); 1915 if (IS_ERR(n3)) 1916 goto err_free2; 1917 } 1918 |
1919 mutex_lock(&n1->write_lock); 1920 mutex_lock(&n2->write_lock); 1921 |
|
1874 bch_btree_insert_keys(n1, op, insert_keys, replace_key); 1875 1876 /* 1877 * Has to be a linear search because we don't have an auxiliary 1878 * search tree yet 1879 */ 1880 1881 while (keys < (btree_bset_first(n1)->keys * 3) / 5) --- 10 unchanged lines hidden (view full) --- 1892 memcpy(btree_bset_first(n2)->start, 1893 bset_bkey_last(btree_bset_first(n1)), 1894 btree_bset_first(n2)->keys * sizeof(uint64_t)); 1895 1896 bkey_copy_key(&n2->key, &b->key); 1897 1898 bch_keylist_add(&parent_keys, &n2->key); 1899 bch_btree_node_write(n2, &cl); | 1922 bch_btree_insert_keys(n1, op, insert_keys, replace_key); 1923 1924 /* 1925 * Has to be a linear search because we don't have an auxiliary 1926 * search tree yet 1927 */ 1928 1929 while (keys < (btree_bset_first(n1)->keys * 3) / 5) --- 10 unchanged lines hidden (view full) --- 1940 memcpy(btree_bset_first(n2)->start, 1941 bset_bkey_last(btree_bset_first(n1)), 1942 btree_bset_first(n2)->keys * sizeof(uint64_t)); 1943 1944 bkey_copy_key(&n2->key, &b->key); 1945 1946 bch_keylist_add(&parent_keys, &n2->key); 1947 bch_btree_node_write(n2, &cl); |
1948 mutex_unlock(&n2->write_lock); |
|
1900 rw_unlock(true, n2); 1901 } else { 1902 trace_bcache_btree_node_compact(b, btree_bset_first(n1)->keys); 1903 | 1949 rw_unlock(true, n2); 1950 } else { 1951 trace_bcache_btree_node_compact(b, btree_bset_first(n1)->keys); 1952 |
1953 mutex_lock(&n1->write_lock); |
|
1904 bch_btree_insert_keys(n1, op, insert_keys, replace_key); 1905 } 1906 1907 bch_keylist_add(&parent_keys, &n1->key); 1908 bch_btree_node_write(n1, &cl); | 1954 bch_btree_insert_keys(n1, op, insert_keys, replace_key); 1955 } 1956 1957 bch_keylist_add(&parent_keys, &n1->key); 1958 bch_btree_node_write(n1, &cl); |
1959 mutex_unlock(&n1->write_lock); |
|
1909 1910 if (n3) { 1911 /* Depth increases, make a new root */ | 1960 1961 if (n3) { 1962 /* Depth increases, make a new root */ |
1963 mutex_lock(&n3->write_lock); |
|
1912 bkey_copy_key(&n3->key, &MAX_KEY); 1913 bch_btree_insert_keys(n3, op, &parent_keys, NULL); 1914 bch_btree_node_write(n3, &cl); | 1964 bkey_copy_key(&n3->key, &MAX_KEY); 1965 bch_btree_insert_keys(n3, op, &parent_keys, NULL); 1966 bch_btree_node_write(n3, &cl); |
1967 mutex_unlock(&n3->write_lock); |
|
1915 1916 closure_sync(&cl); 1917 bch_btree_set_root(n3); 1918 rw_unlock(true, n3); 1919 } else if (!b->parent) { 1920 /* Root filled up but didn't need to be split */ 1921 closure_sync(&cl); 1922 bch_btree_set_root(n1); --- 32 unchanged lines hidden (view full) --- 1955 return -ENOMEM; 1956} 1957 1958static int bch_btree_insert_node(struct btree *b, struct btree_op *op, 1959 struct keylist *insert_keys, 1960 atomic_t *journal_ref, 1961 struct bkey *replace_key) 1962{ | 1968 1969 closure_sync(&cl); 1970 bch_btree_set_root(n3); 1971 rw_unlock(true, n3); 1972 } else if (!b->parent) { 1973 /* Root filled up but didn't need to be split */ 1974 closure_sync(&cl); 1975 bch_btree_set_root(n1); --- 32 unchanged lines hidden (view full) --- 2008 return -ENOMEM; 2009} 2010 2011static int bch_btree_insert_node(struct btree *b, struct btree_op *op, 2012 struct keylist *insert_keys, 2013 atomic_t *journal_ref, 2014 struct bkey *replace_key) 2015{ |
2016 struct closure cl; 2017 |
|
1963 BUG_ON(b->level && replace_key); 1964 | 2018 BUG_ON(b->level && replace_key); 2019 |
2020 closure_init_stack(&cl); 2021 2022 mutex_lock(&b->write_lock); 2023 2024 if (write_block(b) != btree_bset_last(b) && 2025 b->keys.last_set_unwritten) 2026 bch_btree_init_next(b); /* just wrote a set */ 2027 |
|
1965 if (bch_keylist_nkeys(insert_keys) > insert_u64s_remaining(b)) { | 2028 if (bch_keylist_nkeys(insert_keys) > insert_u64s_remaining(b)) { |
1966 if (current->bio_list) { 1967 op->lock = b->c->root->level + 1; 1968 return -EAGAIN; 1969 } else if (op->lock <= b->c->root->level) { 1970 op->lock = b->c->root->level + 1; 1971 return -EINTR; 1972 } else { 1973 /* Invalidated all iterators */ 1974 int ret = btree_split(b, op, insert_keys, replace_key); | 2029 mutex_unlock(&b->write_lock); 2030 goto split; 2031 } |
1975 | 2032 |
1976 return bch_keylist_empty(insert_keys) ? 1977 0 : ret ?: -EINTR; 1978 } 1979 } else { 1980 BUG_ON(write_block(b) != btree_bset_last(b)); | 2033 BUG_ON(write_block(b) != btree_bset_last(b)); |
1981 | 2034 |
1982 if (bch_btree_insert_keys(b, op, insert_keys, replace_key)) { 1983 if (!b->level) 1984 bch_btree_leaf_dirty(b, journal_ref); 1985 else 1986 bch_btree_node_write_sync(b); 1987 } | 2035 if (bch_btree_insert_keys(b, op, insert_keys, replace_key)) { 2036 if (!b->level) 2037 bch_btree_leaf_dirty(b, journal_ref); 2038 else 2039 bch_btree_node_write(b, &cl); 2040 } |
1988 | 2041 |
1989 return 0; | 2042 mutex_unlock(&b->write_lock); 2043 2044 /* wait for btree node write if necessary, after unlock */ 2045 closure_sync(&cl); 2046 2047 return 0; 2048split: 2049 if (current->bio_list) { 2050 op->lock = b->c->root->level + 1; 2051 return -EAGAIN; 2052 } else if (op->lock <= b->c->root->level) { 2053 op->lock = b->c->root->level + 1; 2054 return -EINTR; 2055 } else { 2056 /* Invalidated all iterators */ 2057 int ret = btree_split(b, op, insert_keys, replace_key); 2058 2059 if (bch_keylist_empty(insert_keys)) 2060 return 0; 2061 else if (!ret) 2062 return -EINTR; 2063 return ret; |
1990 } 1991} 1992 1993int bch_btree_insert_check_key(struct btree *b, struct btree_op *op, 1994 struct bkey *check_key) 1995{ 1996 int ret = -EINTR; 1997 uint64_t btree_ptr = b->key.ptr[0]; --- 392 unchanged lines hidden --- | 2064 } 2065} 2066 2067int bch_btree_insert_check_key(struct btree *b, struct btree_op *op, 2068 struct bkey *check_key) 2069{ 2070 int ret = -EINTR; 2071 uint64_t btree_ptr = b->key.ptr[0]; --- 392 unchanged lines hidden --- |