Whamcloud - gitweb
LU-19113 llite: cfs_delete_from_page_cache() keep page locked 29/59829/4
authorBruno Faccini <bfaccini@nvidia.com>
Wed, 18 Jun 2025 16:46:46 +0000 (18:46 +0200)
committerOleg Drokin <green@whamcloud.com>
Tue, 8 Jul 2025 03:53:12 +0000 (03:53 +0000)
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 <bfaccini@nvidia.com>
Change-Id: If39575f4339afe460b3b1c955201e8f9cdfeb871
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/59829
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Reviewed-by: Zhenyu Xu <bobijam@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
lustre/include/lustre_compat.h

index 0e3243a..29465a2 100644 (file)
@@ -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