diff options
author | Chris Mason <chris.mason@oracle.com> | 2009-10-13 13:21:08 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2009-10-13 13:35:12 -0400 |
commit | 257c62e1bce03e5b9f3f069fd52ad73a56de71fd (patch) | |
tree | ad047fe5796156aa88e3f3600111bf2b8d12759f /fs/btrfs/disk-io.c | |
parent | 4722607db6a78bd7748c51fa4c8d7371da797254 (diff) |
Btrfs: avoid tree log commit when there are no changes
rpm has a habit of running fdatasync when the file hasn't
changed. We already detect if a file hasn't been changed
in the current transaction but it might have been sent to
the tree-log in this transaction and not changed since
the last call to fsync.
In this case, we want to avoid a tree log sync, which includes
a number of synchronous writes and barriers. This commit
extends the existing tracking of the last transaction to change
a file to also track the last sub-transaction.
The end result is that rpm -ivh and -Uvh are roughly twice as fast,
and on par with ext3.
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r-- | fs/btrfs/disk-io.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index ac8927bdc33d..d4132aad9ea1 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -919,6 +919,7 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize, | |||
919 | atomic_set(&root->log_writers, 0); | 919 | atomic_set(&root->log_writers, 0); |
920 | root->log_batch = 0; | 920 | root->log_batch = 0; |
921 | root->log_transid = 0; | 921 | root->log_transid = 0; |
922 | root->last_log_commit = 0; | ||
922 | extent_io_tree_init(&root->dirty_log_pages, | 923 | extent_io_tree_init(&root->dirty_log_pages, |
923 | fs_info->btree_inode->i_mapping, GFP_NOFS); | 924 | fs_info->btree_inode->i_mapping, GFP_NOFS); |
924 | 925 | ||
@@ -1089,6 +1090,7 @@ int btrfs_add_log_tree(struct btrfs_trans_handle *trans, | |||
1089 | WARN_ON(root->log_root); | 1090 | WARN_ON(root->log_root); |
1090 | root->log_root = log_root; | 1091 | root->log_root = log_root; |
1091 | root->log_transid = 0; | 1092 | root->log_transid = 0; |
1093 | root->last_log_commit = 0; | ||
1092 | return 0; | 1094 | return 0; |
1093 | } | 1095 | } |
1094 | 1096 | ||