So if we have dir_index items in the log that means we also have the inode item as well, which means that the inode's i_size is correct. However when we process dir_index'es we call btrfs_add_link() which will increase the directory's i_size for the new entry. So to fix this just drop the name len size before we call btrfs_add_link() so the i_size ends out properly. Thanks, Signed-off-by: Josef Bacik <jbacik@xxxxxxxxxxxx> --- fs/btrfs/tree-log.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index c91309d..f0d34f5 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -1497,6 +1497,12 @@ static noinline int insert_one_name(struct btrfs_trans_handle *trans, iput(inode); return -EIO; } + /* + * We need to drop the name_len since add_link we re-add the size. If + * we have the dir_index items then we had to have had the inode in the + * log which means we have the correct i_size. + */ + btrfs_i_size_write(dir, dir->i_size - (name_len * 2)); ret = btrfs_add_link(trans, dir, inode, name, name_len, 1, index); /* FIXME, put inode into FIXUP list */ -- 1.7.7.6 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html