diff options
Diffstat (limited to 'fs/btrfs/extent_map.c')
| -rw-r--r-- | fs/btrfs/extent_map.c | 13 | 
1 files changed, 12 insertions, 1 deletions
diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c index f169d6b11d7..2e8cae63d24 100644 --- a/fs/btrfs/extent_map.c +++ b/fs/btrfs/extent_map.c @@ -171,6 +171,10 @@ static int mergable_maps(struct extent_map *prev, struct extent_map *next)  	if (test_bit(EXTENT_FLAG_COMPRESSED, &prev->flags))  		return 0; +	if (test_bit(EXTENT_FLAG_LOGGING, &prev->flags) || +	    test_bit(EXTENT_FLAG_LOGGING, &next->flags)) +		return 0; +  	if (extent_map_end(prev) == next->start &&  	    prev->flags == next->flags &&  	    prev->bdev == next->bdev && @@ -255,7 +259,8 @@ int unpin_extent_cache(struct extent_map_tree *tree, u64 start, u64 len,  	if (!em)  		goto out; -	list_move(&em->list, &tree->modified_extents); +	if (!test_bit(EXTENT_FLAG_LOGGING, &em->flags)) +		list_move(&em->list, &tree->modified_extents);  	em->generation = gen;  	clear_bit(EXTENT_FLAG_PINNED, &em->flags);  	em->mod_start = em->start; @@ -280,6 +285,12 @@ out:  } +void clear_em_logging(struct extent_map_tree *tree, struct extent_map *em) +{ +	clear_bit(EXTENT_FLAG_LOGGING, &em->flags); +	try_merge_map(tree, em); +} +  /**   * add_extent_mapping - add new extent map to the extent tree   * @tree:	tree to insert new map in  |