Submit #2842 ยป 0001-sys-vfs-hammer-Don-t-ex-lock-all-children-on-interna.patch
| sys/vfs/hammer/hammer.h | ||
|---|---|---|
|
int depth);
|
||
|
void hammer_btree_lcache_free(hammer_mount_t hmp, hammer_node_lock_t lcache);
|
||
|
int hammer_btree_lock_children(hammer_cursor_t cursor, int depth,
|
||
|
int start_index,
|
||
|
hammer_node_lock_t parent,
|
||
|
hammer_node_lock_t lcache);
|
||
|
void hammer_btree_lock_copy(hammer_cursor_t cursor,
|
||
| sys/vfs/hammer/hammer_btree.c | ||
|---|---|---|
|
int i;
|
||
|
const int esize = sizeof(*elm);
|
||
|
hammer_node_lock_init(&lockroot, cursor->node);
|
||
|
error = hammer_btree_lock_children(cursor, 1, &lockroot, NULL);
|
||
|
if (error)
|
||
|
goto done;
|
||
|
if ((error = hammer_cursor_upgrade(cursor)) != 0)
|
||
|
goto done;
|
||
|
++hammer_stats_btree_splits;
|
||
|
return(error);
|
||
|
/*
|
||
|
* Calculate the split point. If the insertion point is at the
|
||
| ... | ... | |
|
--split;
|
||
|
}
|
||
|
hammer_node_lock_init(&lockroot, cursor->node);
|
||
|
error = hammer_btree_lock_children(cursor, 1, split, &lockroot, NULL);
|
||
|
if (error)
|
||
|
goto done;
|
||
|
++hammer_stats_btree_splits;
|
||
|
/*
|
||
|
* If we are at the root of the filesystem, create a new root node
|
||
|
* with 1 element and split normally. Avoid making major
|
||
| ... | ... | |
|
* is usually aliased from a cursor.
|
||
|
*/
|
||
|
int
|
||
|
hammer_btree_lock_children(hammer_cursor_t cursor, int depth,
|
||
|
hammer_btree_lock_children(hammer_cursor_t cursor, int depth, int start_index,
|
||
|
hammer_node_lock_t parent,
|
||
|
hammer_node_lock_t lcache)
|
||
|
{
|
||
| ... | ... | |
|
* pre-get the children before trying to lock the mess. This is
|
||
|
* only done one-level deep for now.
|
||
|
*/
|
||
|
for (i = 0; i < ondisk->count; ++i) {
|
||
|
for (i = start_index; i < ondisk->count; ++i) {
|
||
|
++hammer_stats_btree_elements;
|
||
|
elm = &ondisk->elms[i];
|
||
|
child = hammer_get_node(cursor->trans,
|
||
| ... | ... | |
|
/*
|
||
|
* Do it for real
|
||
|
*/
|
||
|
for (i = 0; error == 0 && i < ondisk->count; ++i) {
|
||
|
for (i = start_index; error == 0 && i < ondisk->count; ++i) {
|
||
|
++hammer_stats_btree_elements;
|
||
|
elm = &ondisk->elms[i];
|
||
| ... | ... | |
|
error = hammer_btree_lock_children(
|
||
|
cursor,
|
||
|
depth - 1,
|
||
|
0,
|
||
|
item,
|
||
|
lcache);
|
||
|
}
|
||
| sys/vfs/hammer/hammer_rebalance.c | ||
|---|---|---|
|
error = hammer_cursor_upgrade(cursor);
|
||
|
if (error)
|
||
|
goto done;
|
||
|
error = hammer_btree_lock_children(cursor, 2, &lockroot, lcache);
|
||
|
error = hammer_btree_lock_children(cursor, 2, 0, &lockroot, lcache);
|
||
|
if (error)
|
||
|
goto done;
|
||
| sys/vfs/hammer/hammer_reblock.c | ||
|---|---|---|
|
int error;
|
||
|
hammer_node_lock_init(&lockroot, cursor->node);
|
||
|
error = hammer_btree_lock_children(cursor, 1, &lockroot, NULL);
|
||
|
error = hammer_btree_lock_children(cursor, 1, 0, &lockroot, NULL);
|
||
|
if (error)
|
||
|
goto done;
|
||