Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 859acaf1 authored by Arne Jansen's avatar Arne Jansen Committed by David Sterba
Browse files

btrfs: don't check DUP chunks twice



Because scrub enumerates the dev extent tree to find the chunks to scrub,
it currently finds each DUP chunk twice and also scrubs it twice. This
patch makes sure that scrub_chunk only checks that part of the chunk the
dev extent has been found for. This only changes the behaviour for DUP
chunks.

Reported-and-tested-by: default avatarStefan Behrens <sbehrens@giantdisaster.de>
Signed-off-by: default avatarArne Jansen <sensille@gmx.net>
parent 2cac13e4
Loading
Loading
Loading
Loading
+5 −3
Original line number Original line Diff line number Diff line
@@ -1367,7 +1367,8 @@ static noinline_for_stack int scrub_stripe(struct scrub_dev *sdev,
}
}


static noinline_for_stack int scrub_chunk(struct scrub_dev *sdev,
static noinline_for_stack int scrub_chunk(struct scrub_dev *sdev,
	u64 chunk_tree, u64 chunk_objectid, u64 chunk_offset, u64 length)
	u64 chunk_tree, u64 chunk_objectid, u64 chunk_offset, u64 length,
	u64 dev_offset)
{
{
	struct btrfs_mapping_tree *map_tree =
	struct btrfs_mapping_tree *map_tree =
		&sdev->dev->dev_root->fs_info->mapping_tree;
		&sdev->dev->dev_root->fs_info->mapping_tree;
@@ -1391,7 +1392,8 @@ static noinline_for_stack int scrub_chunk(struct scrub_dev *sdev,
		goto out;
		goto out;


	for (i = 0; i < map->num_stripes; ++i) {
	for (i = 0; i < map->num_stripes; ++i) {
		if (map->stripes[i].dev == sdev->dev) {
		if (map->stripes[i].dev == sdev->dev &&
		    map->stripes[i].physical == dev_offset) {
			ret = scrub_stripe(sdev, map, i, chunk_offset, length);
			ret = scrub_stripe(sdev, map, i, chunk_offset, length);
			if (ret)
			if (ret)
				goto out;
				goto out;
@@ -1487,7 +1489,7 @@ int scrub_enumerate_chunks(struct scrub_dev *sdev, u64 start, u64 end)
			break;
			break;
		}
		}
		ret = scrub_chunk(sdev, chunk_tree, chunk_objectid,
		ret = scrub_chunk(sdev, chunk_tree, chunk_objectid,
				  chunk_offset, length);
				  chunk_offset, length, found_key.offset);
		btrfs_put_block_group(cache);
		btrfs_put_block_group(cache);
		if (ret)
		if (ret)
			break;
			break;