Btrfs: Avoid superfluous tree-log writeout
We allow two log transactions at a time, but use same flag to mark dirty tree-log btree blocks. So we may flush dirty blocks belonging to newer log transaction when committing a log transaction. This patch fixes the issue by using two flags to mark dirty tree-log btree blocks. Signed-off-by: Yan Zheng <zheng.yan@oracle.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
@@ -354,7 +354,7 @@ int btrfs_end_transaction_throttle(struct btrfs_trans_handle *trans,
|
||||
* those extents are sent to disk but does not wait on them
|
||||
*/
|
||||
int btrfs_write_marked_extents(struct btrfs_root *root,
|
||||
struct extent_io_tree *dirty_pages)
|
||||
struct extent_io_tree *dirty_pages, int mark)
|
||||
{
|
||||
int ret;
|
||||
int err = 0;
|
||||
@@ -367,7 +367,7 @@ int btrfs_write_marked_extents(struct btrfs_root *root,
|
||||
|
||||
while (1) {
|
||||
ret = find_first_extent_bit(dirty_pages, start, &start, &end,
|
||||
EXTENT_DIRTY);
|
||||
mark);
|
||||
if (ret)
|
||||
break;
|
||||
while (start <= end) {
|
||||
@@ -413,7 +413,7 @@ int btrfs_write_marked_extents(struct btrfs_root *root,
|
||||
* on all the pages and clear them from the dirty pages state tree
|
||||
*/
|
||||
int btrfs_wait_marked_extents(struct btrfs_root *root,
|
||||
struct extent_io_tree *dirty_pages)
|
||||
struct extent_io_tree *dirty_pages, int mark)
|
||||
{
|
||||
int ret;
|
||||
int err = 0;
|
||||
@@ -425,12 +425,12 @@ int btrfs_wait_marked_extents(struct btrfs_root *root,
|
||||
unsigned long index;
|
||||
|
||||
while (1) {
|
||||
ret = find_first_extent_bit(dirty_pages, 0, &start, &end,
|
||||
EXTENT_DIRTY);
|
||||
ret = find_first_extent_bit(dirty_pages, start, &start, &end,
|
||||
mark);
|
||||
if (ret)
|
||||
break;
|
||||
|
||||
clear_extent_dirty(dirty_pages, start, end, GFP_NOFS);
|
||||
clear_extent_bits(dirty_pages, start, end, mark, GFP_NOFS);
|
||||
while (start <= end) {
|
||||
index = start >> PAGE_CACHE_SHIFT;
|
||||
start = (u64)(index + 1) << PAGE_CACHE_SHIFT;
|
||||
@@ -460,13 +460,13 @@ int btrfs_wait_marked_extents(struct btrfs_root *root,
|
||||
* those extents are on disk for transaction or log commit
|
||||
*/
|
||||
int btrfs_write_and_wait_marked_extents(struct btrfs_root *root,
|
||||
struct extent_io_tree *dirty_pages)
|
||||
struct extent_io_tree *dirty_pages, int mark)
|
||||
{
|
||||
int ret;
|
||||
int ret2;
|
||||
|
||||
ret = btrfs_write_marked_extents(root, dirty_pages);
|
||||
ret2 = btrfs_wait_marked_extents(root, dirty_pages);
|
||||
ret = btrfs_write_marked_extents(root, dirty_pages, mark);
|
||||
ret2 = btrfs_wait_marked_extents(root, dirty_pages, mark);
|
||||
return ret || ret2;
|
||||
}
|
||||
|
||||
@@ -479,7 +479,8 @@ int btrfs_write_and_wait_transaction(struct btrfs_trans_handle *trans,
|
||||
return filemap_write_and_wait(btree_inode->i_mapping);
|
||||
}
|
||||
return btrfs_write_and_wait_marked_extents(root,
|
||||
&trans->transaction->dirty_pages);
|
||||
&trans->transaction->dirty_pages,
|
||||
EXTENT_DIRTY);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user