Message ID | 20240417150416.752929-5-willy@infradead.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Convert UDF to folios | expand |
On Wed 17-04-24 16:04:10, Matthew Wilcox (Oracle) wrote: > Now that all three callers have a folio, convert this function to > take a folio, and use the folio APIs. > > Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> One comment below: > -static void udf_adinicb_readpage(struct page *page) > +static void udf_adinicb_read_folio(struct folio *folio) > { > - struct inode *inode = page->mapping->host; > - char *kaddr; > + struct inode *inode = folio->mapping->host; > struct udf_inode_info *iinfo = UDF_I(inode); > loff_t isize = i_size_read(inode); > > - kaddr = kmap_local_page(page); > - memcpy(kaddr, iinfo->i_data + iinfo->i_lenEAttr, isize); > - memset(kaddr + isize, 0, PAGE_SIZE - isize); > - flush_dcache_page(page); So where did the flush_dcache_page() call go? AFAIU we should be calling flush_dcache_folio(folio) here, shouldn't we? > - SetPageUptodate(page); > - kunmap_local(kaddr); > + folio_fill_tail(folio, 0, iinfo->i_data + iinfo->i_lenEAttr, isize); > + folio_mark_uptodate(folio); > } Honza
On Thu, Apr 18, 2024 at 12:50:00PM +0200, Jan Kara wrote: > > - kaddr = kmap_local_page(page); > > - memcpy(kaddr, iinfo->i_data + iinfo->i_lenEAttr, isize); > > - memset(kaddr + isize, 0, PAGE_SIZE - isize); > > - flush_dcache_page(page); > > So where did the flush_dcache_page() call go? AFAIU we should be calling > flush_dcache_folio(folio) here, shouldn't we? > > > - SetPageUptodate(page); > > - kunmap_local(kaddr); > > + folio_fill_tail(folio, 0, iinfo->i_data + iinfo->i_lenEAttr, isize); > > + folio_mark_uptodate(folio); > > } It's inside folio_zero_tail(), called from folio_fill_tail().
On Thu 18-04-24 13:29:20, Matthew Wilcox wrote: > On Thu, Apr 18, 2024 at 12:50:00PM +0200, Jan Kara wrote: > > > - kaddr = kmap_local_page(page); > > > - memcpy(kaddr, iinfo->i_data + iinfo->i_lenEAttr, isize); > > > - memset(kaddr + isize, 0, PAGE_SIZE - isize); > > > - flush_dcache_page(page); > > > > So where did the flush_dcache_page() call go? AFAIU we should be calling > > flush_dcache_folio(folio) here, shouldn't we? > > > > > - SetPageUptodate(page); > > > - kunmap_local(kaddr); > > > + folio_fill_tail(folio, 0, iinfo->i_data + iinfo->i_lenEAttr, isize); > > > + folio_mark_uptodate(folio); > > > } > > It's inside folio_zero_tail(), called from folio_fill_tail(). Ah, missed that. Well hidden ;) Thanks for clarification. Honza
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 59215494e6f6..d34562156522 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c @@ -208,19 +208,14 @@ static int udf_writepages(struct address_space *mapping, return write_cache_pages(mapping, wbc, udf_adinicb_writepage, NULL); } -static void udf_adinicb_readpage(struct page *page) +static void udf_adinicb_read_folio(struct folio *folio) { - struct inode *inode = page->mapping->host; - char *kaddr; + struct inode *inode = folio->mapping->host; struct udf_inode_info *iinfo = UDF_I(inode); loff_t isize = i_size_read(inode); - kaddr = kmap_local_page(page); - memcpy(kaddr, iinfo->i_data + iinfo->i_lenEAttr, isize); - memset(kaddr + isize, 0, PAGE_SIZE - isize); - flush_dcache_page(page); - SetPageUptodate(page); - kunmap_local(kaddr); + folio_fill_tail(folio, 0, iinfo->i_data + iinfo->i_lenEAttr, isize); + folio_mark_uptodate(folio); } static int udf_read_folio(struct file *file, struct folio *folio) @@ -228,7 +223,7 @@ static int udf_read_folio(struct file *file, struct folio *folio) struct udf_inode_info *iinfo = UDF_I(file_inode(file)); if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { - udf_adinicb_readpage(&folio->page); + udf_adinicb_read_folio(folio); folio_unlock(folio); return 0; } @@ -272,7 +267,7 @@ static int udf_write_begin(struct file *file, struct address_space *mapping, return PTR_ERR(folio); *pagep = &folio->page; if (!folio_test_uptodate(folio)) - udf_adinicb_readpage(&folio->page); + udf_adinicb_read_folio(folio); return 0; } @@ -364,7 +359,7 @@ int udf_expand_file_adinicb(struct inode *inode) return PTR_ERR(folio); if (!folio_test_uptodate(folio)) - udf_adinicb_readpage(&folio->page); + udf_adinicb_read_folio(folio); down_write(&iinfo->i_data_sem); memset(iinfo->i_data + iinfo->i_lenEAttr, 0x00, iinfo->i_lenAlloc);
Now that all three callers have a folio, convert this function to take a folio, and use the folio APIs. Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> --- fs/udf/inode.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-)