1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-03-11 20:58:50 +03:00

libdm: allow resize of regions mapping growing extents

Instead of deleting and re-creating an extent that has increased
in length, use dm_stats_resize_region() to enlarge the region
in-place.
This commit is contained in:
Bryn M. Reeves 2016-12-19 21:31:56 +00:00
parent 95cd544477
commit 0b553fdda7

View File

@ -4513,15 +4513,12 @@ bad:
return NULL; return NULL;
} }
#define MATCH_EXTENT(e, s, l) \
(((e).start == (s)) && ((e).len == (l)))
static struct _extent *_find_extent(size_t nr_extents, struct _extent *extents, static struct _extent *_find_extent(size_t nr_extents, struct _extent *extents,
uint64_t start, uint64_t len) uint64_t start, uint64_t len)
{ {
size_t i; size_t i;
for (i = 0; i < nr_extents; i++) for (i = 0; i < nr_extents; i++)
if (MATCH_EXTENT(extents[i], start, len)) if (extents[i].start == start)
return extents + i; return extents + i;
return NULL; return NULL;
} }
@ -4553,8 +4550,10 @@ static int _stats_unmap_regions(struct dm_stats *dms, uint64_t group_id,
{ {
struct dm_stats_region *region = NULL; struct dm_stats_region *region = NULL;
struct dm_stats_group *group = NULL; struct dm_stats_group *group = NULL;
struct _extent ext, *file_ext;
int64_t nr_kept, nr_old, i; int64_t nr_kept, nr_old, i;
struct _extent ext; uint64_t d_size;
int have_resize;
group = &dms->groups[group_id]; group = &dms->groups[group_id];
@ -4566,6 +4565,9 @@ static int _stats_unmap_regions(struct dm_stats *dms, uint64_t group_id,
return 0; return 0;
} }
/* Can driver extend regions in-place? */
have_resize = dm_stats_driver_supports_resize();
nr_kept = nr_old = 0; /* counts of old and retained extents */ nr_kept = nr_old = 0; /* counts of old and retained extents */
/* /*
@ -4577,18 +4579,34 @@ static int _stats_unmap_regions(struct dm_stats *dms, uint64_t group_id,
region = &dms->regions[i]; region = &dms->regions[i];
nr_old++; nr_old++;
if (_find_extent(*count, extents, if ((file_ext = _find_extent(*count, extents,
region->start, region->len)) { region->start, region->len))) {
/* growing extent? */
if (region->len < file_ext->len) {
if (!have_resize)
goto delete_region;
d_size = file_ext->len - region->len;
log_very_verbose("Resizing region ID " FMTu64
" to " FMTu64 " sectors.", i,
region->len);
if (!dm_stats_resize_region(dms, i, d_size))
log_error("Failed to resize region ID "
FMTu64, i);
}
ext.start = region->start; ext.start = region->start;
ext.len = region->len; ext.len = region->len;
ext.id = i; ext.id = i;
nr_kept++; nr_kept++;
dm_pool_grow_object(mem, &ext, dm_pool_grow_object(mem, &ext, sizeof(ext));
sizeof(ext));
log_very_verbose("Kept region " FMTu64, i); log_very_verbose("Kept region " FMTu64, i);
} else {
} else {
delete_region:
if (i == group_id) if (i == group_id)
*regroup = 1; *regroup = 1;
@ -4597,7 +4615,6 @@ static int _stats_unmap_regions(struct dm_stats *dms, uint64_t group_id,
i); i);
goto out; goto out;
} }
log_very_verbose("Deleted region " FMTu64, i); log_very_verbose("Deleted region " FMTu64, i);
} }
} }