diff options
Diffstat (limited to 'fs/btrfs/tree-log.c')
| -rw-r--r-- | fs/btrfs/tree-log.c | 12 | 
1 files changed, 10 insertions, 2 deletions
| diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index ad7f4bab640b..c800d067fcbf 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -4181,6 +4181,7 @@ static int btrfs_log_changed_extents(struct btrfs_trans_handle *trans,  	struct extent_map *em, *n;  	struct list_head extents;  	struct extent_map_tree *tree = &inode->extent_tree; +	u64 logged_start, logged_end;  	u64 test_gen;  	int ret = 0;  	int num = 0; @@ -4190,10 +4191,11 @@ static int btrfs_log_changed_extents(struct btrfs_trans_handle *trans,  	down_write(&inode->dio_sem);  	write_lock(&tree->lock);  	test_gen = root->fs_info->last_trans_committed; +	logged_start = start; +	logged_end = end;  	list_for_each_entry_safe(em, n, &tree->modified_extents, list) {  		list_del_init(&em->list); -  		/*  		 * Just an arbitrary number, this can be really CPU intensive  		 * once we start getting a lot of extents, and really once we @@ -4208,6 +4210,12 @@ static int btrfs_log_changed_extents(struct btrfs_trans_handle *trans,  		if (em->generation <= test_gen)  			continue; + +		if (em->start < logged_start) +			logged_start = em->start; +		if ((em->start + em->len - 1) > logged_end) +			logged_end = em->start + em->len - 1; +  		/* Need a ref to keep it from getting evicted from cache */  		refcount_inc(&em->refs);  		set_bit(EXTENT_FLAG_LOGGING, &em->flags); @@ -4216,7 +4224,7 @@ static int btrfs_log_changed_extents(struct btrfs_trans_handle *trans,  	}  	list_sort(NULL, &extents, extent_cmp); -	btrfs_get_logged_extents(inode, logged_list, start, end); +	btrfs_get_logged_extents(inode, logged_list, logged_start, logged_end);  	/*  	 * Some ordered extents started by fsync might have completed  	 * before we could collect them into the list logged_list, which |