diff --git a/kexec-tools-2.0.12-makedumpfile-Support-_count-_refcount-rename-in-struct-p.patch b/kexec-tools-2.0.12-makedumpfile-Support-_count-_refcount-rename-in-struct-p.patch new file mode 100644 index 0000000..479e234 --- /dev/null +++ b/kexec-tools-2.0.12-makedumpfile-Support-_count-_refcount-rename-in-struct-p.patch @@ -0,0 +1,108 @@ +From 2c21d4656e8d3c2af2b1e14809d076941ae69e96 Mon Sep 17 00:00:00 2001 +Message-Id: <2c21d4656e8d3c2af2b1e14809d076941ae69e96.1468205827.git.panand@redhat.com> +From: Vitaly Kuznetsov +Date: Fri, 17 Jun 2016 18:41:26 +0900 +Subject: [PATCH] [PATCH v2] Support _count -> _refcount rename in struct page + +_count member was renamed to _refcount in linux commit 0139aa7b7fa12 +("mm: rename _count, field of the struct page, to _refcount") and this +broke makedumpfile. The reason for making the change was to find all users +accessing it directly and not through the recommended API. I tried +suggesting to revert the change but failed, I see no other choice than to +start supporting both _count and _refcount in makedumpfile. + +Signed-off-by: Vitaly Kuznetsov +--- + makedumpfile-1.6.0/makedumpfile.c | 26 +++++++++++++++++++++----- + makedumpfile-1.6.0/makedumpfile.h | 3 ++- + 2 files changed, 23 insertions(+), 6 deletions(-) + +diff --git a/makedumpfile-1.6.0/makedumpfile.c b/makedumpfile-1.6.0/makedumpfile.c +index 853b99951706..fd884d3796be 100644 +--- a/makedumpfile-1.6.0/makedumpfile.c ++++ b/makedumpfile-1.6.0/makedumpfile.c +@@ -1579,7 +1579,14 @@ get_structure_info(void) + */ + SIZE_INIT(page, "page"); + OFFSET_INIT(page.flags, "page", "flags"); +- OFFSET_INIT(page._count, "page", "_count"); ++ OFFSET_INIT(page._refcount, "page", "_refcount"); ++ if (OFFSET(page._refcount) == NOT_FOUND_STRUCTURE) { ++ info->flag_use_count = TRUE; ++ OFFSET_INIT(page._refcount, "page", "_count"); ++ } else { ++ info->flag_use_count = FALSE; ++ } ++ + OFFSET_INIT(page.mapping, "page", "mapping"); + OFFSET_INIT(page._mapcount, "page", "_mapcount"); + OFFSET_INIT(page.private, "page", "private"); +@@ -2044,7 +2051,7 @@ get_mem_type(void) + + if ((SIZE(page) == NOT_FOUND_STRUCTURE) + || (OFFSET(page.flags) == NOT_FOUND_STRUCTURE) +- || (OFFSET(page._count) == NOT_FOUND_STRUCTURE) ++ || (OFFSET(page._refcount) == NOT_FOUND_STRUCTURE) + || (OFFSET(page.mapping) == NOT_FOUND_STRUCTURE)) { + ret = NOT_FOUND_MEMTYPE; + } else if ((((SYMBOL(node_data) != NOT_FOUND_SYMBOL) +@@ -2151,7 +2158,10 @@ write_vmcoreinfo_data(void) + * write the member offset of 1st kernel + */ + WRITE_MEMBER_OFFSET("page.flags", page.flags); +- WRITE_MEMBER_OFFSET("page._count", page._count); ++ if (info->flag_use_count) ++ WRITE_MEMBER_OFFSET("page._count", page._refcount); ++ else ++ WRITE_MEMBER_OFFSET("page._refcount", page._refcount); + WRITE_MEMBER_OFFSET("page.mapping", page.mapping); + WRITE_MEMBER_OFFSET("page.lru", page.lru); + WRITE_MEMBER_OFFSET("page._mapcount", page._mapcount); +@@ -2491,7 +2501,13 @@ read_vmcoreinfo(void) + + + READ_MEMBER_OFFSET("page.flags", page.flags); +- READ_MEMBER_OFFSET("page._count", page._count); ++ READ_MEMBER_OFFSET("page._refcount", page._refcount); ++ if (OFFSET(page._refcount) == NOT_FOUND_STRUCTURE) { ++ info->flag_use_count = TRUE; ++ READ_MEMBER_OFFSET("page._count", page._refcount); ++ } else { ++ info->flag_use_count = FALSE; ++ } + READ_MEMBER_OFFSET("page.mapping", page.mapping); + READ_MEMBER_OFFSET("page.lru", page.lru); + READ_MEMBER_OFFSET("page._mapcount", page._mapcount); +@@ -5615,7 +5631,7 @@ __exclude_unnecessary_pages(unsigned long mem_map, + pcache = page_cache + (index_pg * SIZE(page)); + + flags = ULONG(pcache + OFFSET(page.flags)); +- _count = UINT(pcache + OFFSET(page._count)); ++ _count = UINT(pcache + OFFSET(page._refcount)); + mapping = ULONG(pcache + OFFSET(page.mapping)); + + if (OFFSET(page.compound_order) != NOT_FOUND_STRUCTURE) { +diff --git a/makedumpfile-1.6.0/makedumpfile.h b/makedumpfile-1.6.0/makedumpfile.h +index 251d4bfac060..533e5b89f345 100644 +--- a/makedumpfile-1.6.0/makedumpfile.h ++++ b/makedumpfile-1.6.0/makedumpfile.h +@@ -1100,6 +1100,7 @@ struct DumpInfo { + int flag_nospace; /* the flag of "No space on device" error */ + int flag_vmemmap; /* kernel supports vmemmap address space */ + int flag_excludevm; /* -e - excluding unused vmemmap pages */ ++ int flag_use_count; /* _refcount is named _count in struct page */ + unsigned long vaddr_for_vtop; /* virtual address for debugging */ + long page_size; /* size of page */ + long page_shift; +@@ -1483,7 +1484,7 @@ struct size_table { + struct offset_table { + struct page { + long flags; +- long _count; ++ long _refcount; + long mapping; + long lru; + long _mapcount; +-- +2.5.5 + diff --git a/kexec-tools.spec b/kexec-tools.spec index 8ff7a3b..a46be98 100644 --- a/kexec-tools.spec +++ b/kexec-tools.spec @@ -85,6 +85,7 @@ Patch503: kexec-tools-2.0.12-Properly-align-powerpc64-.toc.patch # Patches 601 onward are generic patches # Patch601: kexec-tools-2.0.3-disable-kexec-test.patch +Patch602: kexec-tools-2.0.12-makedumpfile-Support-_count-_refcount-rename-in-struct-p.patch %description kexec-tools provides /sbin/kexec binary that facilitates a new @@ -112,6 +113,7 @@ tar -z -x -v -f %{SOURCE23} %patch502 -p1 %patch503 -p1 %patch601 -p1 +%patch602 -p1 %ifarch ppc %define archdef ARCH=ppc