From 3dec26990738ad3f5008d46ee9d3d03df7454925 Mon Sep 17 00:00:00 2001 From: Bruno Faccini Date: Wed, 18 Jun 2025 18:46:46 +0200 Subject: [PATCH] LU-19113 llite: cfs_delete_from_page_cache() keep page locked Like in other places where generic_error_remove_folio() is also being called, in both Lustre and Kernel, page should not be unlocked prior to call it in cfs_delete_from_page_cache(). This was also allowing a race where page->mapping may become NULL. Taking an extra reference is also useless if page not unlocked anymore. Fixes: 738e69d4b9 ("LU-16292 llite: delete_from_page_cache not exported") Signed-off-by: Bruno Faccini Change-Id: If39575f4339afe460b3b1c955201e8f9cdfeb871 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/59829 Reviewed-by: Patrick Farrell Reviewed-by: Zhenyu Xu Reviewed-by: Oleg Drokin Tested-by: jenkins Tested-by: Maloo --- lustre/include/lustre_compat.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lustre/include/lustre_compat.h b/lustre/include/lustre_compat.h index 0e3243a..29465a2 100644 --- a/lustre/include/lustre_compat.h +++ b/lustre/include/lustre_compat.h @@ -767,19 +767,19 @@ 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_folio(page->mapping, page_folio(page)); } else { loff_t lstart = page->index << PAGE_SHIFT; loff_t lend = lstart + PAGE_SIZE - 1; + struct address_space *mapping = page->mapping; - truncate_inode_pages_range(page->mapping, lstart, lend); + get_page(page); + unlock_page(page); + truncate_inode_pages_range(mapping, lstart, lend); + lock_page(page); + put_page(page); } - lock_page(page); - put_page(page); } #endif -- 1.8.3.1