Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

nilfs2: add nilfs_get_folio()

Convert nilfs_get_page() to be a wrapper.
Also convert nilfs_check_page() to nilfs_check_folio().

Link: https://lkml.kernel.org/r/20231127143036.2425-10-konishi.ryusuke@gmail.com
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Matthew Wilcox (Oracle) and committed by
Andrew Morton
75ad5db6 9b77f66f

+39 -28
+39 -28
fs/nilfs2/dir.c
··· 107 107 unlock_page(page); 108 108 } 109 109 110 - static bool nilfs_check_page(struct page *page, char *kaddr) 110 + static bool nilfs_check_folio(struct folio *folio, char *kaddr) 111 111 { 112 - struct inode *dir = page->mapping->host; 112 + struct inode *dir = folio->mapping->host; 113 113 struct super_block *sb = dir->i_sb; 114 114 unsigned int chunk_size = nilfs_chunk_size(dir); 115 - unsigned int offs, rec_len; 116 - unsigned int limit = PAGE_SIZE; 115 + size_t offs, rec_len; 116 + size_t limit = folio_size(folio); 117 117 struct nilfs_dir_entry *p; 118 118 char *error; 119 119 120 - if ((dir->i_size >> PAGE_SHIFT) == page->index) { 121 - limit = dir->i_size & ~PAGE_MASK; 120 + if (dir->i_size < folio_pos(folio) + limit) { 121 + limit = dir->i_size - folio_pos(folio); 122 122 if (limit & (chunk_size - 1)) 123 123 goto Ebadsize; 124 124 if (!limit) ··· 140 140 if (offs != limit) 141 141 goto Eend; 142 142 out: 143 - SetPageChecked(page); 143 + folio_set_checked(folio); 144 144 return true; 145 145 146 146 /* Too bad, we had an error */ ··· 163 163 error = "directory entry across blocks"; 164 164 bad_entry: 165 165 nilfs_error(sb, 166 - "bad entry in directory #%lu: %s - offset=%lu, inode=%lu, rec_len=%d, name_len=%d", 167 - dir->i_ino, error, (page->index << PAGE_SHIFT) + offs, 166 + "bad entry in directory #%lu: %s - offset=%lu, inode=%lu, rec_len=%zd, name_len=%d", 167 + dir->i_ino, error, (folio->index << PAGE_SHIFT) + offs, 168 168 (unsigned long)le64_to_cpu(p->inode), 169 169 rec_len, p->name_len); 170 170 goto fail; ··· 172 172 p = (struct nilfs_dir_entry *)(kaddr + offs); 173 173 nilfs_error(sb, 174 174 "entry in directory #%lu spans the page boundary offset=%lu, inode=%lu", 175 - dir->i_ino, (page->index << PAGE_SHIFT) + offs, 175 + dir->i_ino, (folio->index << PAGE_SHIFT) + offs, 176 176 (unsigned long)le64_to_cpu(p->inode)); 177 177 fail: 178 - SetPageError(page); 178 + folio_set_error(folio); 179 179 return false; 180 + } 181 + 182 + static void *nilfs_get_folio(struct inode *dir, unsigned long n, 183 + struct folio **foliop) 184 + { 185 + struct address_space *mapping = dir->i_mapping; 186 + struct folio *folio = read_mapping_folio(mapping, n, NULL); 187 + void *kaddr; 188 + 189 + if (IS_ERR(folio)) 190 + return folio; 191 + 192 + kaddr = kmap_local_folio(folio, 0); 193 + if (unlikely(!folio_test_checked(folio))) { 194 + if (!nilfs_check_folio(folio, kaddr)) 195 + goto fail; 196 + } 197 + 198 + *foliop = folio; 199 + return kaddr; 200 + 201 + fail: 202 + folio_release_kmap(folio, kaddr); 203 + return ERR_PTR(-EIO); 180 204 } 181 205 182 206 static void *nilfs_get_page(struct inode *dir, unsigned long n, 183 207 struct page **pagep) 184 208 { 185 - struct address_space *mapping = dir->i_mapping; 186 - struct page *page = read_mapping_page(mapping, n, NULL); 187 - void *kaddr; 209 + struct folio *folio; 210 + void *kaddr = nilfs_get_folio(dir, n, &folio); 188 211 189 - if (IS_ERR(page)) 190 - return page; 191 - 192 - kaddr = kmap_local_page(page); 193 - if (unlikely(!PageChecked(page))) { 194 - if (!nilfs_check_page(page, kaddr)) 195 - goto fail; 196 - } 197 - 198 - *pagep = page; 212 + if (!IS_ERR(kaddr)) 213 + *pagep = &folio->page; 199 214 return kaddr; 200 - 201 - fail: 202 - unmap_and_put_page(page, kaddr); 203 - return ERR_PTR(-EIO); 204 215 } 205 216 206 217 /*