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>
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