diff options
author | Chris Mason <chris.mason@oracle.com> | 2008-09-11 15:53:37 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2008-09-25 11:04:07 -0400 |
commit | 3a5f1d458ad1610a06e38f0be2fbc6ac215439c0 (patch) | |
tree | 00fc015c5b494c7307d5dcae61b2d5d5ed6bf587 /fs/btrfs/tree-log.c | |
parent | 49eb7e46d47ea72a9bd2a5f8cedb04f5159cc277 (diff) |
Btrfs: Optimize btree walking while logging inodes
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/tree-log.c')
-rw-r--r-- | fs/btrfs/tree-log.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 5d49a701bdcd..f43ee33ec2dc 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
@@ -1982,7 +1982,6 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans, | |||
1982 | DEFINE_WAIT(wait); | 1982 | DEFINE_WAIT(wait); |
1983 | prepare_to_wait(&log->fs_info->tree_log_wait, &wait, | 1983 | prepare_to_wait(&log->fs_info->tree_log_wait, &wait, |
1984 | TASK_UNINTERRUPTIBLE); | 1984 | TASK_UNINTERRUPTIBLE); |
1985 | batch = log->fs_info->tree_log_batch; | ||
1986 | mutex_unlock(&log->fs_info->tree_log_mutex); | 1985 | mutex_unlock(&log->fs_info->tree_log_mutex); |
1987 | if (atomic_read(&log->fs_info->tree_log_writers)) | 1986 | if (atomic_read(&log->fs_info->tree_log_writers)) |
1988 | schedule(); | 1987 | schedule(); |
@@ -2024,8 +2023,7 @@ out: | |||
2024 | 2023 | ||
2025 | } | 2024 | } |
2026 | 2025 | ||
2027 | /* | 2026 | /* * free all the extents used by the tree log. This should be called |
2028 | * free all the extents used by the tree log. This should be called | ||
2029 | * at commit time of the full transaction | 2027 | * at commit time of the full transaction |
2030 | */ | 2028 | */ |
2031 | int btrfs_free_log(struct btrfs_trans_handle *trans, struct btrfs_root *root) | 2029 | 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, | |||
2107 | int ret; | 2105 | int ret; |
2108 | int bytes_del = 0; | 2106 | int bytes_del = 0; |
2109 | 2107 | ||
2108 | if (BTRFS_I(dir)->logged_trans < trans->transid) | ||
2109 | return 0; | ||
2110 | |||
2110 | ret = join_running_log_trans(root); | 2111 | ret = join_running_log_trans(root); |
2111 | if (ret) | 2112 | if (ret) |
2112 | return 0; | 2113 | return 0; |
@@ -2178,6 +2179,9 @@ int btrfs_del_inode_ref_in_log(struct btrfs_trans_handle *trans, | |||
2178 | u64 index; | 2179 | u64 index; |
2179 | int ret; | 2180 | int ret; |
2180 | 2181 | ||
2182 | if (BTRFS_I(inode)->logged_trans < trans->transid) | ||
2183 | return 0; | ||
2184 | |||
2181 | ret = join_running_log_trans(root); | 2185 | ret = join_running_log_trans(root); |
2182 | if (ret) | 2186 | if (ret) |
2183 | return 0; | 2187 | return 0; |
@@ -2484,6 +2488,7 @@ static int __btrfs_log_inode(struct btrfs_trans_handle *trans, | |||
2484 | struct btrfs_inode_item *inode_item; | 2488 | struct btrfs_inode_item *inode_item; |
2485 | u32 size; | 2489 | u32 size; |
2486 | int ret; | 2490 | int ret; |
2491 | int nritems; | ||
2487 | 2492 | ||
2488 | log = root->log_root; | 2493 | log = root->log_root; |
2489 | 2494 | ||
@@ -2541,12 +2546,11 @@ static int __btrfs_log_inode(struct btrfs_trans_handle *trans, | |||
2541 | path, 0, trans->transid); | 2546 | path, 0, trans->transid); |
2542 | if (ret != 0) | 2547 | if (ret != 0) |
2543 | break; | 2548 | break; |
2544 | 2549 | again: | |
2545 | if (min_key.objectid != inode->i_ino) | 2550 | if (min_key.objectid != inode->i_ino) |
2546 | break; | 2551 | break; |
2547 | if (min_key.type > max_key.type) | 2552 | if (min_key.type > max_key.type) |
2548 | break; | 2553 | break; |
2549 | |||
2550 | src = path->nodes[0]; | 2554 | src = path->nodes[0]; |
2551 | size = btrfs_item_size_nr(src, path->slots[0]); | 2555 | size = btrfs_item_size_nr(src, path->slots[0]); |
2552 | ret = btrfs_insert_empty_item(trans, log, dst_path, &min_key, | 2556 | 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, | |||
2606 | } | 2610 | } |
2607 | 2611 | ||
2608 | btrfs_mark_buffer_dirty(dst_path->nodes[0]); | 2612 | btrfs_mark_buffer_dirty(dst_path->nodes[0]); |
2609 | btrfs_release_path(root, path); | ||
2610 | btrfs_release_path(log, dst_path); | 2613 | btrfs_release_path(log, dst_path); |
2611 | 2614 | ||
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 | |||
2612 | if (min_key.offset < (u64)-1) | 2624 | if (min_key.offset < (u64)-1) |
2613 | min_key.offset++; | 2625 | min_key.offset++; |
2614 | else if (min_key.type < (u8)-1) | 2626 | else if (min_key.type < (u8)-1) |
@@ -2626,6 +2638,7 @@ static int __btrfs_log_inode(struct btrfs_trans_handle *trans, | |||
2626 | ret = log_directory_changes(trans, root, inode, path, dst_path); | 2638 | ret = log_directory_changes(trans, root, inode, path, dst_path); |
2627 | BUG_ON(ret); | 2639 | BUG_ON(ret); |
2628 | } | 2640 | } |
2641 | BTRFS_I(inode)->logged_trans = trans->transid; | ||
2629 | mutex_unlock(&BTRFS_I(inode)->log_mutex); | 2642 | mutex_unlock(&BTRFS_I(inode)->log_mutex); |
2630 | 2643 | ||
2631 | btrfs_free_path(path); | 2644 | btrfs_free_path(path); |