On Tue, Nov 02, 2021 at 08:31:14AM +0000, David Howells wrote: > -static int v9fs_vfs_writepage_locked(struct page *page) > +static int v9fs_vfs_write_folio_locked(struct folio *folio) > { > - struct inode *inode = page->mapping->host; > + struct inode *inode = folio_inode(folio); > struct v9fs_inode *v9inode = V9FS_I(inode); > - loff_t start = page_offset(page); > + loff_t start = folio_pos(folio); > loff_t size = i_size_read(inode); > struct iov_iter from; > - int err, len; > + size_t gran = folio_size(folio), len; > + int err; > > - if (page->index == size >> PAGE_SHIFT) > - len = size & ~PAGE_MASK; > - else > - len = PAGE_SIZE; > + len = (size >= start + gran) ? gran : size - start; This seems like the most complicated way to write this ... how about: size_t len = min_t(loff_t, isize - start, folio_size(folio)); > @@ -322,23 +322,24 @@ static void afs_req_issue_op(struct netfs_read_subrequest *subreq) > > static int afs_symlink_readpage(struct file *file, struct page *page) > { > - struct afs_vnode *vnode = AFS_FS_I(page->mapping->host); > + struct afs_vnode *vnode = AFS_FS_I(page_mapping(page)->host); How does swap end up calling readpage on a symlink? > ret = afs_fetch_data(fsreq->vnode, fsreq); > - page_endio(page, false, ret); > + page_endio(&folio->page, false, ret); We need a folio_endio() ... > int afs_write_end(struct file *file, struct address_space *mapping, > loff_t pos, unsigned len, unsigned copied, > - struct page *page, void *fsdata) > + struct page *subpage, void *fsdata) > { > + struct folio *folio = page_folio(subpage); > struct afs_vnode *vnode = AFS_FS_I(file_inode(file)); > unsigned long priv; > - unsigned int f, from = pos & (thp_size(page) - 1); > + unsigned int f, from = pos & (folio_size(folio) - 1); Isn't that: size_t from = offset_in_folio(folio, pos); (not that i think we're getting folios larger than 4GB any time soon, but it'd be nice to be prepared for it)