Btrfs: avoid tree log commit when there are no changes
authorChris Mason <chris.mason@oracle.com>
Tue, 13 Oct 2009 17:21:08 +0000 (13:21 -0400)
committerChris Mason <chris.mason@oracle.com>
Tue, 13 Oct 2009 17:35:12 +0000 (13:35 -0400)
commit257c62e1bce03e5b9f3f069fd52ad73a56de71fd
treead047fe5796156aa88e3f3600111bf2b8d12759f
parent4722607db6a78bd7748c51fa4c8d7371da797254
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>
fs/btrfs/btrfs_inode.h
fs/btrfs/ctree.h
fs/btrfs/disk-io.c
fs/btrfs/file.c
fs/btrfs/inode.c
fs/btrfs/transaction.h
fs/btrfs/tree-log.c
fs/btrfs/tree-log.h