From aff0d208e7a5af92c7d84cffd84604c4ec1f58ec Mon Sep 17 00:00:00 2001 From: Shaun Tancheff Date: Wed, 8 Feb 2023 20:06:07 -0800 Subject: [PATCH] LU-16292 llite: delete_from_page_cache not exported Linux commit v5.16-rc4-44-g452e9e6992fe filemap: Add filemap_remove_folio and __filemap_remove_folio Directly removing a folio/page from the page cache is not available. Fallback to generic_error_remove_page for regular files, and truncate_inode_pages_range as appropriate. Lustre-change: https://review.whamcloud.com/49069 Lustre-commit: 738e69d4b97d28ef037fe50f4146aabead9a2528 Test-Parameters: trivial HPE-bug-id: LUS-11198 Signed-off-by: Shaun Tancheff Change-Id: I634e7d7719d497ce035a78b424be8e9e8c5a8104 Reviewed-by: Petros Koutoupis Reviewed-by: jsimmons Reviewed-by: Neil Brown Reviewed-by: Arshad Hussain Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/49877 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger --- lustre/autoconf/lustre-core.m4 | 15 +++++++++++++++ lustre/include/lustre_compat.h | 27 +++++++++++++++++++++++++++ lustre/llite/dir.c | 3 ++- lustre/llite/pcc.c | 2 +- lustre/mdc/mdc_request.c | 4 ++-- 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4 index 2ef5b50..c123787 100644 --- a/lustre/autoconf/lustre-core.m4 +++ b/lustre/autoconf/lustre-core.m4 @@ -2693,6 +2693,20 @@ EXTRA_KCFLAGS="$tmp_flags" ]) # LC_HAVE_KIOCB_COMPLETE_2ARGS # +# LC_EXPORTS_DELETE_FROM_PAGE_CACHE +# +# Linux commit v5.16-rc4-44-g452e9e6992fe +# filemap: Add filemap_remove_folio and __filemap_remove_folio +# +# Also removes the export of delete_from_page_cache +# +AC_DEFUN([LC_EXPORTS_DELETE_FROM_PAGE_CACHE], [ +LB_CHECK_EXPORT([delete_from_page_cache], [mm/filemap.c], + [AC_DEFINE(HAVE_DELETE_FROM_PAGE_CACHE, 1, + [delete_from_page_cache is exported])]) +]) # LC_EXPORTS_DELETE_FROM_PAGE_CACHE + +# # LC_HAVE_INVALIDATE_FOLIO # # linux commit v5.17-rc4-10-g128d1f8241d6 @@ -2969,6 +2983,7 @@ AC_DEFUN([LC_PROG_LINUX], [ # 5.16 LC_HAVE_KIOCB_COMPLETE_2ARGS + LC_EXPORTS_DELETE_FROM_PAGE_CACHE # 5.17 LC_HAVE_INVALIDATE_FOLIO diff --git a/lustre/include/lustre_compat.h b/lustre/include/lustre_compat.h index c02ffd2..4b38b9c 100644 --- a/lustre/include/lustre_compat.h +++ b/lustre/include/lustre_compat.h @@ -559,4 +559,31 @@ static inline void ll_security_release_secctx(char *secdata, u32 seclen) #define ll_set_acl(ns, inode, acl, type) ll_set_acl(inode, acl, type) #endif +/** + * delete_from_page_cache is not exported anymore + */ +#ifdef HAVE_DELETE_FROM_PAGE_CACHE +#define cfs_delete_from_page_cache(page) delete_from_page_cache((page)) +#else +static inline void cfs_delete_from_page_cache(struct page *page) +{ + if (!page->mapping) + return; + LASSERT(PageLocked(page)); + get_page(page); + unlock_page(page); + /* on entry page is locked */ + if (S_ISREG(page->mapping->host->i_mode)) { + generic_error_remove_page(page->mapping, page); + } else { + loff_t lstart = page->index << PAGE_SHIFT; + loff_t lend = lstart + PAGE_SIZE - 1; + + truncate_inode_pages_range(page->mapping, lstart, lend); + } + lock_page(page); + put_page(page); +} +#endif + #endif /* _LUSTRE_COMPAT_H */ diff --git a/lustre/llite/dir.c b/lustre/llite/dir.c index 19ee399..79dfaba 100644 --- a/lustre/llite/dir.c +++ b/lustre/llite/dir.c @@ -53,6 +53,7 @@ #include #include #include +#include #include #include #include @@ -171,7 +172,7 @@ void ll_release_page(struct inode *inode, struct page *page, if (remove) { lock_page(page); if (likely(page->mapping != NULL)) - delete_from_page_cache(page); + cfs_delete_from_page_cache(page); unlock_page(page); } put_page(page); diff --git a/lustre/llite/pcc.c b/lustre/llite/pcc.c index 33f3117..e783e17 100644 --- a/lustre/llite/pcc.c +++ b/lustre/llite/pcc.c @@ -3040,7 +3040,7 @@ static int pcc_mmap_pages_convert(struct inode *inode, * hardware. */ /* Remove the page from the mapping of the PCC copy. */ - delete_from_page_cache(page); + cfs_delete_from_page_cache(page); /* Add the page into the mapping of the Lustre file. */ rc = add_to_page_cache_locked(page, inode->i_mapping, page->index, GFP_KERNEL); diff --git a/lustre/mdc/mdc_request.c b/lustre/mdc/mdc_request.c index b2d1e9a..500a76d 100644 --- a/lustre/mdc/mdc_request.c +++ b/lustre/mdc/mdc_request.c @@ -1128,7 +1128,7 @@ static void mdc_release_page(struct page *page, int remove) if (remove) { lock_page(page); if (likely(page->mapping != NULL)) - delete_from_page_cache(page); + cfs_delete_from_page_cache(page); unlock_page(page); } put_page(page); @@ -1371,7 +1371,7 @@ static int mdc_read_page_remote(void *data, struct page *page0) rc = mdc_getpage(rp->rp_exp, fid, rp->rp_off, page_pool, npages, &req); if (rc < 0) { /* page0 is special, which was added into page cache early */ - delete_from_page_cache(page0); + cfs_delete_from_page_cache(page0); } else { int lu_pgs; -- 1.8.3.1