From: Bruno Faccini Date: Wed, 18 Jun 2025 16:46:46 +0000 (+0200) Subject: LU-19113 llite: cfs_delete_from_page_cache() keep page locked X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=3dec26990738ad3f5008d46ee9d3d03df7454925;p=fs%2Flustre-release.git 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 --- 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