On Wed, Apr 24, 2024 at 12:06 PM Matthew Wilcox <willy@xxxxxxxxxxxxx> wrote: > > On Wed, Apr 24, 2024 at 10:17:04AM +0800, Huang, Ying wrote: > > Kairui Song <ryncsn@xxxxxxxxx> writes: > > > static inline loff_t folio_file_pos(struct folio *folio) > > > { > > > - return page_file_offset(&folio->page); > > > + if (unlikely(folio_test_swapcache(folio))) > > > + return __folio_swap_dev_pos(folio); > > > + return ((loff_t)folio->index << PAGE_SHIFT); > > > > This still looks confusing for me. The function returns the byte > > position of the folio in its file. But we returns the swap device > > position of the folio. > > > > Tried to search folio_file_pos() usage. The 2 usage in page_io.c is > > swap specific, we can use swap_dev_pos() directly. > > > > There are also other file system users (NFS and AFS) of > > folio_file_pos(), I don't know why they need to work with swap > > cache. Cced file system maintainers for help. > > Time for a history lesson! > > In d56b4ddf7781 (2012) we introduced page_file_index() and > page_file_mapping() to support swap-over-NFS. Writes to the swapfile went > through ->direct_IO but reads went through ->readpage. So NFS was changed > to remove direct references to page->mapping and page->index because > those aren't right for anon pages (or shmem pages being swapped out). > > In e1209d3a7a67 (2022), we stopped using ->readpage in favour of using > ->swap_rw. Now we don't need to use page_file_*(); we get the swap_file > and ki_pos directly in the swap_iocb. But there are still relics in NFS > that nobody has dared rip out. And there are all the copy-and-pasted > filesystems that use page_file_* because they don't know any better. > > We should delete page_file_*() and folio_file_*(). They shouldn't be > needed any more. Thanks for the explanation! I'll update the series, and just delete paeg_file_offset and folio_file_pos with more auditing, to make the code cleaner. Should I add a suggest-by for the removal?