| .. | .. |
|---|
| 885 | 885 | * cannibalize_bucket() will take. This means every time we unlock the root of |
|---|
| 886 | 886 | * the btree, we need to release this lock if we have it held. |
|---|
| 887 | 887 | */ |
|---|
| 888 | | -static void bch_cannibalize_unlock(struct cache_set *c) |
|---|
| 888 | +void bch_cannibalize_unlock(struct cache_set *c) |
|---|
| 889 | 889 | { |
|---|
| 890 | 890 | spin_lock(&c->btree_cannibalize_lock); |
|---|
| 891 | 891 | if (c->btree_cache_alloc_lock == current) { |
|---|
| .. | .. |
|---|
| 1090 | 1090 | struct btree *parent) |
|---|
| 1091 | 1091 | { |
|---|
| 1092 | 1092 | BKEY_PADDED(key) k; |
|---|
| 1093 | | - struct btree *b = ERR_PTR(-EAGAIN); |
|---|
| 1093 | + struct btree *b; |
|---|
| 1094 | 1094 | |
|---|
| 1095 | 1095 | mutex_lock(&c->bucket_lock); |
|---|
| 1096 | 1096 | retry: |
|---|
| 1097 | + /* return ERR_PTR(-EAGAIN) when it fails */ |
|---|
| 1098 | + b = ERR_PTR(-EAGAIN); |
|---|
| 1097 | 1099 | if (__bch_bucket_alloc_set(c, RESERVE_BTREE, &k.key, wait)) |
|---|
| 1098 | 1100 | goto err; |
|---|
| 1099 | 1101 | |
|---|
| .. | .. |
|---|
| 1138 | 1140 | { |
|---|
| 1139 | 1141 | struct btree *n = bch_btree_node_alloc(b->c, op, b->level, b->parent); |
|---|
| 1140 | 1142 | |
|---|
| 1141 | | - if (!IS_ERR_OR_NULL(n)) { |
|---|
| 1143 | + if (!IS_ERR(n)) { |
|---|
| 1142 | 1144 | mutex_lock(&n->write_lock); |
|---|
| 1143 | 1145 | bch_btree_sort_into(&b->keys, &n->keys, &b->c->sort); |
|---|
| 1144 | 1146 | bkey_copy_key(&n->key, &b->key); |
|---|
| .. | .. |
|---|
| 1340 | 1342 | memset(new_nodes, 0, sizeof(new_nodes)); |
|---|
| 1341 | 1343 | closure_init_stack(&cl); |
|---|
| 1342 | 1344 | |
|---|
| 1343 | | - while (nodes < GC_MERGE_NODES && !IS_ERR_OR_NULL(r[nodes].b)) |
|---|
| 1345 | + while (nodes < GC_MERGE_NODES && !IS_ERR(r[nodes].b)) |
|---|
| 1344 | 1346 | keys += r[nodes++].keys; |
|---|
| 1345 | 1347 | |
|---|
| 1346 | 1348 | blocks = btree_default_blocks(b->c) * 2 / 3; |
|---|
| .. | .. |
|---|
| 1352 | 1354 | |
|---|
| 1353 | 1355 | for (i = 0; i < nodes; i++) { |
|---|
| 1354 | 1356 | new_nodes[i] = btree_node_alloc_replacement(r[i].b, NULL); |
|---|
| 1355 | | - if (IS_ERR_OR_NULL(new_nodes[i])) |
|---|
| 1357 | + if (IS_ERR(new_nodes[i])) |
|---|
| 1356 | 1358 | goto out_nocoalesce; |
|---|
| 1357 | 1359 | } |
|---|
| 1358 | 1360 | |
|---|
| .. | .. |
|---|
| 1487 | 1489 | bch_keylist_free(&keylist); |
|---|
| 1488 | 1490 | |
|---|
| 1489 | 1491 | for (i = 0; i < nodes; i++) |
|---|
| 1490 | | - if (!IS_ERR_OR_NULL(new_nodes[i])) { |
|---|
| 1492 | + if (!IS_ERR(new_nodes[i])) { |
|---|
| 1491 | 1493 | btree_node_free(new_nodes[i]); |
|---|
| 1492 | 1494 | rw_unlock(true, new_nodes[i]); |
|---|
| 1493 | 1495 | } |
|---|
| .. | .. |
|---|
| 1669 | 1671 | if (should_rewrite) { |
|---|
| 1670 | 1672 | n = btree_node_alloc_replacement(b, NULL); |
|---|
| 1671 | 1673 | |
|---|
| 1672 | | - if (!IS_ERR_OR_NULL(n)) { |
|---|
| 1674 | + if (!IS_ERR(n)) { |
|---|
| 1673 | 1675 | bch_btree_node_write_sync(n); |
|---|
| 1674 | 1676 | |
|---|
| 1675 | 1677 | bch_btree_set_root(n); |
|---|
| .. | .. |
|---|
| 1968 | 1970 | c->gc_stats.nodes++; |
|---|
| 1969 | 1971 | bch_btree_op_init(&op, 0); |
|---|
| 1970 | 1972 | ret = bcache_btree(check_recurse, p, c->root, &op); |
|---|
| 1973 | + /* |
|---|
| 1974 | + * The op may be added to cache_set's btree_cache_wait |
|---|
| 1975 | + * in mca_cannibalize(), must ensure it is removed from |
|---|
| 1976 | + * the list and release btree_cache_alloc_lock before |
|---|
| 1977 | + * free op memory. |
|---|
| 1978 | + * Otherwise, the btree_cache_wait will be damaged. |
|---|
| 1979 | + */ |
|---|
| 1980 | + bch_cannibalize_unlock(c); |
|---|
| 1981 | + finish_wait(&c->btree_cache_wait, &(&op)->wait); |
|---|
| 1971 | 1982 | if (ret) |
|---|
| 1972 | 1983 | goto out; |
|---|
| 1973 | 1984 | } |
|---|