diff --git a/configure.d/1_page_mapping.conf b/configure.d/1_page_mapping.conf new file mode 100644 index 0000000..7f44345 --- /dev/null +++ b/configure.d/1_page_mapping.conf @@ -0,0 +1,45 @@ +#!/bin/bash +# +# Copyright(c) 2025 Huawei Technologies +# SPDX-License-Identifier: BSD-3-Clause +# + +. $(dirname $3)/conf_framework.sh + +check() { + cur_name=$(basename $2) + config_file_path=$1 + if compile_module $cur_name "page_folio((struct page *)NULL);" "linux/page-flags.h" + then + echo $cur_name "1" >> $config_file_path + else + echo $cur_name "2" >> $config_file_path + fi +} + +apply() { + case "$1" in + "1") + add_function " + static inline struct address_space *cas_page_mapping(struct page *page) + { + struct folio *folio = page_folio(page); + + return folio->mapping; + }" ;; + + "2") + add_function " + static inline struct address_space *cas_page_mapping(struct page *page) + { + if (PageCompound(page)) + return NULL; + + return page->mapping; + }" ;; + *) + exit 1 + esac +} + +conf_run $@ diff --git a/modules/cas_cache/classifier.c b/modules/cas_cache/classifier.c index 89bb854..876ba52 100644 --- a/modules/cas_cache/classifier.c +++ b/modules/cas_cache/classifier.c @@ -53,7 +53,7 @@ static cas_cls_eval_t _cas_cls_metadata_test(struct cas_classifier *cls, if (PageAnon(io->page)) return cas_cls_eval_no; - if (PageSlab(io->page) || PageCompound(io->page)) { + if (PageSlab(io->page)) { /* A filesystem issues IO on pages that does not belongs * to the file page cache. It means that it is a * part of metadata @@ -61,7 +61,7 @@ static cas_cls_eval_t _cas_cls_metadata_test(struct cas_classifier *cls, return cas_cls_eval_yes; } - if (!io->page->mapping) { + if (!cas_page_mapping(io->page)) { /* XFS case, page are allocated internally and do not * have references into inode */ @@ -1229,6 +1229,7 @@ static void _cas_cls_get_bio_context(struct bio *bio, struct cas_cls_io *ctx) { struct page *page = NULL; + struct address_space *mapping; if (!bio) return; @@ -1246,13 +1247,14 @@ static void _cas_cls_get_bio_context(struct bio *bio, if (PageAnon(page)) return; - if (PageSlab(page) || PageCompound(page)) + if (PageSlab(page)) return; - if (!page->mapping) + mapping = cas_page_mapping(page); + if (!mapping) return; - ctx->inode = page->mapping->host; + ctx->inode = mapping->host; return; }