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

f2fs: use memcpy_{to,from}_page() where possible

This is simpler, and as a side effect it replaces several uses of
kmap_atomic() with its recommended replacement kmap_local_page().

Signed-off-by: Eric Biggers <ebiggers@google.com>
Reviewed-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>

authored by

Eric Biggers and committed by
Jaegeuk Kim
b87846bd 605b0a77

+8 -28
+4 -11
fs/f2fs/inline.c
··· 64 64 void f2fs_do_read_inline_data(struct page *page, struct page *ipage) 65 65 { 66 66 struct inode *inode = page->mapping->host; 67 - void *src_addr, *dst_addr; 68 67 69 68 if (PageUptodate(page)) 70 69 return; ··· 73 74 zero_user_segment(page, MAX_INLINE_DATA(inode), PAGE_SIZE); 74 75 75 76 /* Copy the whole inline data block */ 76 - src_addr = inline_data_addr(inode, ipage); 77 - dst_addr = kmap_atomic(page); 78 - memcpy(dst_addr, src_addr, MAX_INLINE_DATA(inode)); 79 - flush_dcache_page(page); 80 - kunmap_atomic(dst_addr); 77 + memcpy_to_page(page, 0, inline_data_addr(inode, ipage), 78 + MAX_INLINE_DATA(inode)); 81 79 if (!PageUptodate(page)) 82 80 SetPageUptodate(page); 83 81 } ··· 242 246 243 247 int f2fs_write_inline_data(struct inode *inode, struct page *page) 244 248 { 245 - void *src_addr, *dst_addr; 246 249 struct dnode_of_data dn; 247 250 int err; 248 251 ··· 258 263 f2fs_bug_on(F2FS_I_SB(inode), page->index); 259 264 260 265 f2fs_wait_on_page_writeback(dn.inode_page, NODE, true, true); 261 - src_addr = kmap_atomic(page); 262 - dst_addr = inline_data_addr(inode, dn.inode_page); 263 - memcpy(dst_addr, src_addr, MAX_INLINE_DATA(inode)); 264 - kunmap_atomic(src_addr); 266 + memcpy_from_page(inline_data_addr(inode, dn.inode_page), 267 + page, 0, MAX_INLINE_DATA(inode)); 265 268 set_page_dirty(dn.inode_page); 266 269 267 270 f2fs_clear_page_cache_dirty_tag(page);
+2 -9
fs/f2fs/super.c
··· 2470 2470 size_t toread; 2471 2471 loff_t i_size = i_size_read(inode); 2472 2472 struct page *page; 2473 - char *kaddr; 2474 2473 2475 2474 if (off > i_size) 2476 2475 return 0; ··· 2502 2503 return -EIO; 2503 2504 } 2504 2505 2505 - kaddr = kmap_atomic(page); 2506 - memcpy(data, kaddr + offset, tocopy); 2507 - kunmap_atomic(kaddr); 2506 + memcpy_from_page(data, page, offset, tocopy); 2508 2507 f2fs_put_page(page, 1); 2509 2508 2510 2509 offset = 0; ··· 2524 2527 size_t towrite = len; 2525 2528 struct page *page; 2526 2529 void *fsdata = NULL; 2527 - char *kaddr; 2528 2530 int err = 0; 2529 2531 int tocopy; 2530 2532 ··· 2542 2546 break; 2543 2547 } 2544 2548 2545 - kaddr = kmap_atomic(page); 2546 - memcpy(kaddr + offset, data, tocopy); 2547 - kunmap_atomic(kaddr); 2548 - flush_dcache_page(page); 2549 + memcpy_to_page(page, offset, data, tocopy); 2549 2550 2550 2551 a_ops->write_end(NULL, mapping, off, tocopy, tocopy, 2551 2552 page, fsdata);
+2 -8
fs/f2fs/verity.c
··· 47 47 size_t n = min_t(size_t, count, 48 48 PAGE_SIZE - offset_in_page(pos)); 49 49 struct page *page; 50 - void *addr; 51 50 52 51 page = read_mapping_page(inode->i_mapping, pos >> PAGE_SHIFT, 53 52 NULL); 54 53 if (IS_ERR(page)) 55 54 return PTR_ERR(page); 56 55 57 - addr = kmap_atomic(page); 58 - memcpy(buf, addr + offset_in_page(pos), n); 59 - kunmap_atomic(addr); 56 + memcpy_from_page(buf, page, offset_in_page(pos), n); 60 57 61 58 put_page(page); 62 59 ··· 82 85 PAGE_SIZE - offset_in_page(pos)); 83 86 struct page *page; 84 87 void *fsdata; 85 - void *addr; 86 88 int res; 87 89 88 90 res = aops->write_begin(NULL, mapping, pos, n, &page, &fsdata); 89 91 if (res) 90 92 return res; 91 93 92 - addr = kmap_atomic(page); 93 - memcpy(addr + offset_in_page(pos), buf, n); 94 - kunmap_atomic(addr); 94 + memcpy_to_page(page, offset_in_page(pos), buf, n); 95 95 96 96 res = aops->write_end(NULL, mapping, pos, n, n, page, fsdata); 97 97 if (res < 0)