File diskdump-Add-struct-mdf_flatmap-to-hold-flattened-fo.patch of Package libkdumpfile.36085
From: Petr Tesarik <petr@tesarici.cz>
Date: Wed, 25 Sep 2024 09:03:09 +0200
Subject: diskdump: Add struct mdf_flatmap to hold flattened format data
References: bsc#1223399
Upstream: merged
Git-commit: 38670238f126d58a1467e2f9b13838c574228e61
The translation between flattened offsets and rearranged offsets is
currently implemented using flatmap and flatoffs. Put both data structures
into a newly introduced struct mdf_flatmap. This should make it easier to
separate flattened format handling from struct disk_dump_priv.
Signed-off-by: Petr Tesarik <ptesarik@suse.com>
---
src/kdumpfile/diskdump.c | 60 +++++++++++++++++++++++++++++------------------
1 file changed, 38 insertions(+), 22 deletions(-)
--- a/src/kdumpfile/diskdump.c
+++ b/src/kdumpfile/diskdump.c
@@ -170,6 +170,15 @@ struct page_desc {
uint64_t page_flags; /**< Page flags. */
};
+/** Offset mapping for a file in the flattened format. */
+struct flattened_file_map {
+ /** Map (rearranged) offset to an index in the offset arrray. */
+ addrxlat_map_t *map;
+
+ /** Differences between flattened and rearranged file offsets. */
+ off_t *offs;
+};
+
/** PFN region mapping. */
struct pfn_rgn {
kdump_pfn_t pfn; /**< Starting PFN. */
@@ -186,11 +195,8 @@ struct disk_dump_priv {
struct pfn_rgn *pfn_rgn; /**< PFN region map. */
size_t pfn_rgn_num; /**< Number of elements in the map. */
- /** File offset mapping for flattened files. */
- addrxlat_map_t *flatmap;
-
- /** Differences between flattened and rearranged file offsets. */
- off_t *flatoffs;
+ /** File offset mappings for flattened files. */
+ struct flattened_file_map *flatmap;
};
struct setup_data {
@@ -230,8 +236,8 @@ flattened_pread(kdump_ctx_t *ctx, void *
const addrxlat_range_t *range, *end;
off_t off;
- range = addrxlat_map_ranges(ddp->flatmap);
- end = range + addrxlat_map_len(ddp->flatmap);
+ range = addrxlat_map_ranges(ddp->flatmap->map);
+ end = range + addrxlat_map_len(ddp->flatmap->map);
for (off = pos; range < end && off > range->endoff; ++range)
off -= range->endoff + 1;
while (range < end && len) {
@@ -242,11 +248,12 @@ flattened_pread(kdump_ctx_t *ctx, void *
seglen = len;
if (range->meth != ADDRXLAT_SYS_METH_NONE) {
+ off_t *flatoffs = ddp->flatmap->offs;
unsigned segidx = range->meth;
kdump_status ret;
ret = fcache_pread(ctx->shared->fcache, buf, seglen,
- pos + ddp->flatoffs[segidx]);
+ pos + flatoffs[segidx]);
if (ret != KDUMP_OK)
return ret;
} else
@@ -301,12 +308,12 @@ flattened_get_chunk(kdump_ctx_t *ctx, st
const addrxlat_range_t *range, *end;
off_t off;
- range = addrxlat_map_ranges(ddp->flatmap);
- end = range + addrxlat_map_len(ddp->flatmap);
+ range = addrxlat_map_ranges(ddp->flatmap->map);
+ end = range + addrxlat_map_len(ddp->flatmap->map);
for (off = pos; range < end && off > range->endoff; ++range)
off -= range->endoff + 1;
if (len <= range->endoff + 1 - off) {
- pos += ddp->flatoffs[range->meth];
+ pos += ddp->flatmap->offs[range->meth];
return fcache_get_chunk(ctx->shared->fcache, fch, len, pos);
}
@@ -1076,8 +1083,8 @@ init_flattened_file(kdump_ctx_t *ctx)
off_t flatpos;
kdump_status status;
- ddp->flatmap = addrxlat_map_new();
- if (!ddp->flatmap)
+ ddp->flatmap->map = addrxlat_map_new();
+ if (!ddp->flatmap->map)
return set_error(ctx, KDUMP_ERR_SYSTEM,
"Cannot allocate %s", "flattened map");
@@ -1109,20 +1116,20 @@ init_flattened_file(kdump_ctx_t *ctx)
unsigned newlen = segidx + FLATOFFS_ALLOC_INC;
off_t *newbuf;
- newbuf = realloc(ddp->flatoffs,
- sizeof(*ddp->flatoffs) * newlen);
+ newbuf = realloc(ddp->flatmap->offs,
+ sizeof(*ddp->flatmap->offs) * newlen);
if (!newbuf)
return set_error(ctx, KDUMP_ERR_SYSTEM,
"Cannot allocate %s",
"flattened offset array");
- ddp->flatoffs = newbuf;
+ ddp->flatmap->offs = newbuf;
}
flatpos += sizeof(hdr);
- ddp->flatoffs[segidx] = flatpos - pos;
+ ddp->flatmap->offs[segidx] = flatpos - pos;
range.endoff = size - 1;
range.meth = segidx;
- if (addrxlat_map_set(ddp->flatmap, pos, &range) != ADDRXLAT_OK)
+ if (addrxlat_map_set(ddp->flatmap->map, pos, &range) != ADDRXLAT_OK)
return set_error(ctx, KDUMP_ERR_SYSTEM,
"Cannot allocate %s",
"flattened map entry");
@@ -1142,8 +1149,14 @@ init_flattened_file(kdump_ctx_t *ctx)
static kdump_status
init_flattened_maps(kdump_ctx_t *ctx)
{
+ struct disk_dump_priv *ddp = ctx->shared->fmtdata;
kdump_status status;
+ ddp->flatmap = calloc(1, sizeof(*ddp->flatmap));
+ if (!ddp->flatmap)
+ return set_error(ctx, KDUMP_ERR_SYSTEM,
+ "Cannot allocate %s", "flatmap array");
+
status = init_flattened_file(ctx);
if (status != KDUMP_OK)
return set_error(ctx, status,
@@ -1231,10 +1244,13 @@ diskdump_cleanup(struct kdump_shared *sh
if (ddp) {
if (ddp->pfn_rgn)
free(ddp->pfn_rgn);
- if (ddp->flatmap)
- addrxlat_map_decref(ddp->flatmap);
- if (ddp->flatoffs)
- free(ddp->flatoffs);
+ if (ddp->flatmap) {
+ if (ddp->flatmap->map)
+ addrxlat_map_decref(ddp->flatmap->map);
+ if (ddp->flatmap->offs)
+ free(ddp->flatmap->offs);
+ free(ddp->flatmap);
+ }
free(ddp);
shared->fmtdata = NULL;
}