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:
parent
95cd544477
commit
0b553fdda7
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user