Hi, Matthew, Matthew Wilcox <willy@xxxxxxxxxxxxx> writes: > 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 a lot for your detailed explanation! Yes, this will simplify the semantics and improve the readability of the corresponding code. -- Best Regards, Huang, Ying