Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP4:GA
btrfsprogs
btrfs-progs-convert-use-search_cache_extent-in-...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File btrfs-progs-convert-use-search_cache_extent-in-migrate_one_reserved_range.patch of Package btrfsprogs
From: Jeff Mahoney <jeffm@suse.com> Subject: btrfs-progs: convert: use search_cache_extent in migrate_one_reserved_range Git-commit: f2c14eb282a87d7e622538f76dfbc356cb73c1d4 Patch-mainline: v4.12.1 References: bsc#1042369 When we are looking for extents in migrate_one_reserved_range, it's likely that there will be multiple extents that fall into the 0-1MB range. If lookup_cache_extent is called with a range that covers multiple cache entries, it will return the first entry it encounters while searching from the top of the tree that happens to fall in that range. That means that we can end up skipping regions within that range, resulting in a file system image that can't be rolled back since it wasn't all migrated properly. This is reproducible using convert-tests/008-readonly-image. There was a range from 0-160kB, but the only entry that was returned began at ~ 280kB. The fix is to use search_cache_extent to iterate through multiple regions within that range. Signed-off-by: Jeff Mahoney <jeffm@suse.com> Reviewed-by: Qu Wenruo <quwenruo.btrfs@gmx.com> Signed-off-by: David Sterba <dsterba@suse.com> --- btrfs-convert.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/btrfs-convert.c b/convert/main.c index 800fb1e2..03da9e49 100644 --- a/btrfs-convert.c +++ b/btrfs-convert.c @@ -343,10 +343,12 @@ static int migrate_one_reserved_range(struct btrfs_trans_handle *trans, int ret = 0; while (cur_off < start + len) { - cache = lookup_cache_extent(used, cur_off, cur_len); + cache = search_cache_extent(used, cur_off); if (!cache) break; cur_off = max(cache->start, cur_off); + if (cur_off >= start + len) + break; cur_len = min(cache->start + cache->size, start + len) - cur_off; BUG_ON(cur_len < root->sectorsize);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor