Btrfs: fix a bug in checking whether a inode is already in log
authorLiu Bo <bo.li.liu@oracle.com>
Wed, 29 Aug 2012 07:07:55 +0000 (01:07 -0600)
committerChris Mason <chris.mason@fusionio.com>
Mon, 1 Oct 2012 19:19:06 +0000 (15:19 -0400)
commit46d8bc34248f3a94dea910137d1ddf5fb1e3a1cc
tree2851b02c4aa073ea15737e1a41d53b3a8024c962
parent321f0e70225abc792d74902a2bc4a60164265fd4
Btrfs: fix a bug in checking whether a inode is already in log

This is based on Josef's "Btrfs: turbo charge fsync".

The current btrfs checks if an inode is in log by comparing
root's last_log_commit to inode's last_sub_trans[2].

But the problem is that this root->last_log_commit is shared among
inodes.

Say we have N inodes to be logged, after the first inode,
root's last_log_commit is updated and the N-1 remained files will
be skipped.

This fixes the bug by keeping a local copy of root's last_log_commit
inside each inode and this local copy will be maintained itself.

[1]: we regard each log transaction as a subset of btrfs's transaction,
i.e. sub_trans

Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
fs/btrfs/btrfs_inode.h
fs/btrfs/inode.c
fs/btrfs/transaction.h
fs/btrfs/tree-log.c