In recent kernels, radix_tree_root has been replaced by
xarray. lookup_swap_cache() needs to switch depending on what type
i_pages in address_space structure has.

See the following commit of linux kernel git repository for reference:

    eb797a8ee0ab4cd03df556980ce7bf167cadaa50
    page cache: Rearrange address_space
---
 diskdump.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/diskdump.c b/diskdump.c
index 572ef70..88d0dee 100644
--- a/diskdump.c
+++ b/diskdump.c
@@ -2657,6 +2657,11 @@ lookup_swap_cache(ulonglong pte_val, unsigned char 
*zram_buf)
        ulong swp_type, swp_space, page;
        struct list_pair lp;
        physaddr_t paddr;
+       static int is_xarray = -1;
+
+       if (is_xarray < 0) {
+               is_xarray = STREQ(MEMBER_TYPE_NAME("address_space", "i_pages"), 
"xarray");
+       }
 
        swp_type = __swp_type(pte_val);
        if (THIS_KERNEL_VERSION >= LINUX(2,6,0)) {
@@ -2675,7 +2680,7 @@ lookup_swap_cache(ulonglong pte_val, unsigned char 
*zram_buf)
        swp_space += (swp_offset >> SWAP_ADDRESS_SPACE_SHIFT) * 
SIZE(address_space);
 
        lp.index = swp_offset;
-       if (do_radix_tree(swp_space, RADIX_TREE_SEARCH, &lp)){
+       if ((is_xarray ? do_xarray : do_radix_tree)(swp_space, 
RADIX_TREE_SEARCH, &lp)) {
                readmem((ulong)lp.value, KVADDR, &page, sizeof(void *),
                                "swap_cache page", FAULT_ON_ERROR);
                if (!is_page_ptr(page, &paddr)) {
-- 
1.8.3.1

--
Crash-utility mailing list
Crash-utility@redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility

Reply via email to