Skip to content

Commit 3a5f1d4

Browse files
committed
Btrfs: Optimize btree walking while logging inodes
Signed-off-by: Chris Mason <[email protected]>
1 parent 49eb7e4 commit 3a5f1d4

File tree

2 files changed

+20
-7
lines changed

2 files changed

+20
-7
lines changed

fs/btrfs/disk-io.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1497,7 +1497,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
14971497
* low idle thresh
14981498
*/
14991499
fs_info->endio_workers.idle_thresh = 4;
1500-
fs_info->endio_write_workers.idle_thresh = 4;
1500+
fs_info->endio_write_workers.idle_thresh = 64;
15011501

15021502
btrfs_start_workers(&fs_info->workers, 1);
15031503
btrfs_start_workers(&fs_info->submit_workers, 1);

fs/btrfs/tree-log.c

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1982,7 +1982,6 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
19821982
DEFINE_WAIT(wait);
19831983
prepare_to_wait(&log->fs_info->tree_log_wait, &wait,
19841984
TASK_UNINTERRUPTIBLE);
1985-
batch = log->fs_info->tree_log_batch;
19861985
mutex_unlock(&log->fs_info->tree_log_mutex);
19871986
if (atomic_read(&log->fs_info->tree_log_writers))
19881987
schedule();
@@ -2024,8 +2023,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
20242023

20252024
}
20262025

2027-
/*
2028-
* free all the extents used by the tree log. This should be called
2026+
/* * free all the extents used by the tree log. This should be called
20292027
* at commit time of the full transaction
20302028
*/
20312029
int btrfs_free_log(struct btrfs_trans_handle *trans, struct btrfs_root *root)
@@ -2107,6 +2105,9 @@ int btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans,
21072105
int ret;
21082106
int bytes_del = 0;
21092107

2108+
if (BTRFS_I(dir)->logged_trans < trans->transid)
2109+
return 0;
2110+
21102111
ret = join_running_log_trans(root);
21112112
if (ret)
21122113
return 0;
@@ -2178,6 +2179,9 @@ int btrfs_del_inode_ref_in_log(struct btrfs_trans_handle *trans,
21782179
u64 index;
21792180
int ret;
21802181

2182+
if (BTRFS_I(inode)->logged_trans < trans->transid)
2183+
return 0;
2184+
21812185
ret = join_running_log_trans(root);
21822186
if (ret)
21832187
return 0;
@@ -2484,6 +2488,7 @@ static int __btrfs_log_inode(struct btrfs_trans_handle *trans,
24842488
struct btrfs_inode_item *inode_item;
24852489
u32 size;
24862490
int ret;
2491+
int nritems;
24872492

24882493
log = root->log_root;
24892494

@@ -2541,12 +2546,11 @@ static int __btrfs_log_inode(struct btrfs_trans_handle *trans,
25412546
path, 0, trans->transid);
25422547
if (ret != 0)
25432548
break;
2544-
2549+
again:
25452550
if (min_key.objectid != inode->i_ino)
25462551
break;
25472552
if (min_key.type > max_key.type)
25482553
break;
2549-
25502554
src = path->nodes[0];
25512555
size = btrfs_item_size_nr(src, path->slots[0]);
25522556
ret = btrfs_insert_empty_item(trans, log, dst_path, &min_key,
@@ -2606,9 +2610,17 @@ static int __btrfs_log_inode(struct btrfs_trans_handle *trans,
26062610
}
26072611

26082612
btrfs_mark_buffer_dirty(dst_path->nodes[0]);
2609-
btrfs_release_path(root, path);
26102613
btrfs_release_path(log, dst_path);
26112614

2615+
nritems = btrfs_header_nritems(path->nodes[0]);
2616+
path->slots[0]++;
2617+
if (path->slots[0] < nritems) {
2618+
btrfs_item_key_to_cpu(path->nodes[0], &min_key,
2619+
path->slots[0]);
2620+
goto again;
2621+
}
2622+
btrfs_release_path(root, path);
2623+
26122624
if (min_key.offset < (u64)-1)
26132625
min_key.offset++;
26142626
else if (min_key.type < (u8)-1)
@@ -2626,6 +2638,7 @@ static int __btrfs_log_inode(struct btrfs_trans_handle *trans,
26262638
ret = log_directory_changes(trans, root, inode, path, dst_path);
26272639
BUG_ON(ret);
26282640
}
2641+
BTRFS_I(inode)->logged_trans = trans->transid;
26292642
mutex_unlock(&BTRFS_I(inode)->log_mutex);
26302643

26312644
btrfs_free_path(path);

0 commit comments

Comments
 (0)