Btrfs: check roots last log commit when checking if an inode has been logged
authorJosef Bacik <jbacik@fusionio.com>
Wed, 11 Sep 2013 13:55:42 +0000 (09:55 -0400)
committerChris Mason <chris.mason@fusionio.com>
Sat, 21 Sep 2013 15:05:24 +0000 (11:05 -0400)
commita5874ce6ce4a3e4fc3db254ccf6d59d8501a56d8
treeb445fd797a1d4a99d67050c7eef9a6235d635da4
parentde2b530bfb683fd75c31ab65ec42949f5f7a5b58
Btrfs: check roots last log commit when checking if an inode has been logged

Liu introduced a local copy of the last log commit for an inode to make sure we
actually log an inode even if a log commit has already taken place.  In order to
make sure we didn't relog the same inode multiple times he set this local copy
to the current trans when we log the inode, because usually we log the inode and
then sync the log.  The exception to this is during rename, we will relog an
inode if the name changed and it is already in the log.  The problem with this
is then we go to sync the inode, and our check to see if the inode has already
been logged is tripped and we don't sync the log.  To fix this we need to _also_
check against the roots last log commit, because it could be less than what is
in our local copy of the log commit.  This fixes a bug where we rename a file
into a directory and then fsync the directory and then on remount the directory
is no longer there.  Thanks,

Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
fs/btrfs/btrfs_inode.h