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

Merge tag 'nfs-for-6.3-1' of git://git.linux-nfs.org/projects/anna/linux-nfs

Pull NFS client updates from Anna Schumaker:
"New Features:

- Convert the read and write paths to use folios

Bugfixes and Cleanups:

- Fix tracepoint state manager flag printing

- Fix disabling swap files

- Fix NFSv4 client identifier sysfs path in the documentation

- Don't clear NFS_CAP_COPY if server returns NFS4ERR_OFFLOAD_DENIED

- Treat GETDEVICEINFO errors as a layout failure

- Replace kmap_atomic() calls with kmap_local_page()

- Constify sunrpc sysfs kobj_type structures"

* tag 'nfs-for-6.3-1' of git://git.linux-nfs.org/projects/anna/linux-nfs: (25 commits)
fs/nfs: Replace kmap_atomic() with kmap_local_page() in dir.c
pNFS/filelayout: treat GETDEVICEINFO errors as layout failure
Documentation: Fix sysfs path for the NFSv4 client identifier
nfs42: do not fail with EIO if ssc returns NFS4ERR_OFFLOAD_DENIED
NFS: fix disabling of swap
SUNRPC: make kobj_type structures constant
nfs4trace: fix state manager flag printing
NFS: Remove unnecessary check in nfs_read_folio()
NFS: Improve tracing of nfs_wb_folio()
NFS: Enable tracing of nfs_invalidate_folio() and nfs_launder_folio()
NFS: fix up nfs_release_folio() to try to release the page
NFS: Clean up O_DIRECT request allocation
NFS: Fix up nfs_vm_page_mkwrite() for folios
NFS: Convert nfs_write_begin/end to use folios
NFS: Remove unused function nfs_wb_page()
NFS: Convert buffered writes to use folios
NFS: Convert the function nfs_wb_page() to use folios
NFS: Convert buffered reads to use folios
NFS: Add a helper nfs_wb_folio()
NFS: Convert the remaining pagelist helper functions to support folios
...

+698 -434
+2 -2
Documentation/filesystems/nfs/client-identifier.rst
··· 152 152 via the kernel command line, or when the "nfs" module is 153 153 loaded. 154 154 155 - /sys/fs/nfs/client/net/identifier 155 + /sys/fs/nfs/net/nfs_client/identifier 156 156 This virtual file, available since Linux 5.3, is local to the 157 157 network namespace in which it is accessed and so can provide 158 158 distinction between network namespaces (containers) when the ··· 164 164 be formed at boot using the container's internal identifier: 165 165 166 166 sha256sum /etc/machine-id | awk '{print $1}' \\ 167 - > /sys/fs/nfs/client/net/identifier 167 + > /sys/fs/nfs/net/nfs_client/identifier 168 168 169 169 Security considerations 170 170 -----------------------
+14 -14
fs/nfs/dir.c
··· 203 203 { 204 204 struct nfs_cache_array *array; 205 205 206 - array = kmap_atomic(page); 206 + array = kmap_local_page(page); 207 207 array->change_attr = change_attr; 208 208 array->last_cookie = last_cookie; 209 209 array->size = 0; 210 210 array->page_full = 0; 211 211 array->page_is_eof = 0; 212 212 array->cookies_are_ordered = 1; 213 - kunmap_atomic(array); 213 + kunmap_local(array); 214 214 } 215 215 216 216 /* ··· 221 221 struct nfs_cache_array *array; 222 222 unsigned int i; 223 223 224 - array = kmap_atomic(page); 224 + array = kmap_local_page(page); 225 225 for (i = 0; i < array->size; i++) 226 226 kfree(array->array[i].name); 227 227 array->size = 0; 228 - kunmap_atomic(array); 228 + kunmap_local(array); 229 229 } 230 230 231 231 static void nfs_readdir_free_folio(struct folio *folio) ··· 371 371 static bool nfs_readdir_page_validate(struct page *page, u64 last_cookie, 372 372 u64 change_attr) 373 373 { 374 - struct nfs_cache_array *array = kmap_atomic(page); 374 + struct nfs_cache_array *array = kmap_local_page(page); 375 375 int ret = true; 376 376 377 377 if (array->change_attr != change_attr) 378 378 ret = false; 379 379 if (nfs_readdir_array_index_cookie(array) != last_cookie) 380 380 ret = false; 381 - kunmap_atomic(array); 381 + kunmap_local(array); 382 382 return ret; 383 383 } 384 384 ··· 418 418 struct nfs_cache_array *array; 419 419 u64 ret; 420 420 421 - array = kmap_atomic(page); 421 + array = kmap_local_page(page); 422 422 ret = array->last_cookie; 423 - kunmap_atomic(array); 423 + kunmap_local(array); 424 424 return ret; 425 425 } 426 426 ··· 429 429 struct nfs_cache_array *array; 430 430 bool ret; 431 431 432 - array = kmap_atomic(page); 432 + array = kmap_local_page(page); 433 433 ret = !nfs_readdir_array_is_full(array); 434 - kunmap_atomic(array); 434 + kunmap_local(array); 435 435 return ret; 436 436 } 437 437 ··· 439 439 { 440 440 struct nfs_cache_array *array; 441 441 442 - array = kmap_atomic(page); 442 + array = kmap_local_page(page); 443 443 nfs_readdir_array_set_eof(array); 444 - kunmap_atomic(array); 444 + kunmap_local(array); 445 445 } 446 446 447 447 static struct page *nfs_readdir_page_get_next(struct address_space *mapping, ··· 568 568 struct nfs_cache_array *array; 569 569 int status; 570 570 571 - array = kmap_atomic(desc->page); 571 + array = kmap_local_page(desc->page); 572 572 573 573 if (desc->dir_cookie == 0) 574 574 status = nfs_readdir_search_for_pos(array, desc); 575 575 else 576 576 status = nfs_readdir_search_for_cookie(array, desc); 577 577 578 - kunmap_atomic(array); 578 + kunmap_local(array); 579 579 return status; 580 580 } 581 581
+4 -8
fs/nfs/direct.c
··· 343 343 struct nfs_page *req; 344 344 unsigned int req_len = min_t(size_t, bytes, PAGE_SIZE - pgbase); 345 345 /* XXX do we need to do the eof zeroing found in async_filler? */ 346 - req = nfs_create_request(dreq->ctx, pagevec[i], 347 - pgbase, req_len); 346 + req = nfs_page_create_from_page(dreq->ctx, pagevec[i], 347 + pgbase, pos, req_len); 348 348 if (IS_ERR(req)) { 349 349 result = PTR_ERR(req); 350 350 break; 351 351 } 352 - req->wb_index = pos >> PAGE_SHIFT; 353 - req->wb_offset = pos & ~PAGE_MASK; 354 352 if (!nfs_pageio_add_request(&desc, req)) { 355 353 result = desc.pg_error; 356 354 nfs_release_request(req); ··· 800 802 struct nfs_page *req; 801 803 unsigned int req_len = min_t(size_t, bytes, PAGE_SIZE - pgbase); 802 804 803 - req = nfs_create_request(dreq->ctx, pagevec[i], 804 - pgbase, req_len); 805 + req = nfs_page_create_from_page(dreq->ctx, pagevec[i], 806 + pgbase, pos, req_len); 805 807 if (IS_ERR(req)) { 806 808 result = PTR_ERR(req); 807 809 break; ··· 814 816 } 815 817 816 818 nfs_lock_request(req); 817 - req->wb_index = pos >> PAGE_SHIFT; 818 - req->wb_offset = pos & ~PAGE_MASK; 819 819 if (!nfs_pageio_add_request(&desc, req)) { 820 820 result = desc.pg_error; 821 821 nfs_unlock_and_release_request(req);
+72 -52
fs/nfs/file.c
··· 277 277 * and that the new data won't completely replace the old data in 278 278 * that range of the file. 279 279 */ 280 - static bool nfs_full_page_write(struct page *page, loff_t pos, unsigned int len) 280 + static bool nfs_folio_is_full_write(struct folio *folio, loff_t pos, 281 + unsigned int len) 281 282 { 282 - unsigned int pglen = nfs_page_length(page); 283 - unsigned int offset = pos & (PAGE_SIZE - 1); 283 + unsigned int pglen = nfs_folio_length(folio); 284 + unsigned int offset = offset_in_folio(folio, pos); 284 285 unsigned int end = offset + len; 285 286 286 287 return !pglen || (end >= pglen && !offset); 287 288 } 288 289 289 - static bool nfs_want_read_modify_write(struct file *file, struct page *page, 290 - loff_t pos, unsigned int len) 290 + static bool nfs_want_read_modify_write(struct file *file, struct folio *folio, 291 + loff_t pos, unsigned int len) 291 292 { 292 293 /* 293 294 * Up-to-date pages, those with ongoing or full-page write 294 295 * don't need read/modify/write 295 296 */ 296 - if (PageUptodate(page) || PagePrivate(page) || 297 - nfs_full_page_write(page, pos, len)) 297 + if (folio_test_uptodate(folio) || folio_test_private(folio) || 298 + nfs_folio_is_full_write(folio, pos, len)) 298 299 return false; 299 300 300 - if (pnfs_ld_read_whole_page(file->f_mapping->host)) 301 + if (pnfs_ld_read_whole_page(file_inode(file))) 301 302 return true; 302 303 /* Open for reading too? */ 303 304 if (file->f_mode & FMODE_READ) 304 305 return true; 305 306 return false; 307 + } 308 + 309 + static struct folio * 310 + nfs_folio_grab_cache_write_begin(struct address_space *mapping, pgoff_t index) 311 + { 312 + unsigned fgp_flags = FGP_LOCK | FGP_WRITE | FGP_CREAT | FGP_STABLE; 313 + 314 + return __filemap_get_folio(mapping, index, fgp_flags, 315 + mapping_gfp_mask(mapping)); 306 316 } 307 317 308 318 /* ··· 324 314 * increment the page use counts until he is done with the page. 325 315 */ 326 316 static int nfs_write_begin(struct file *file, struct address_space *mapping, 327 - loff_t pos, unsigned len, 328 - struct page **pagep, void **fsdata) 317 + loff_t pos, unsigned len, struct page **pagep, 318 + void **fsdata) 329 319 { 330 - int ret; 331 - pgoff_t index = pos >> PAGE_SHIFT; 332 - struct page *page; 320 + struct folio *folio; 333 321 int once_thru = 0; 322 + int ret; 334 323 335 324 dfprintk(PAGECACHE, "NFS: write_begin(%pD2(%lu), %u@%lld)\n", 336 325 file, mapping->host->i_ino, len, (long long) pos); 337 326 338 327 start: 339 - page = grab_cache_page_write_begin(mapping, index); 340 - if (!page) 328 + folio = nfs_folio_grab_cache_write_begin(mapping, pos >> PAGE_SHIFT); 329 + if (!folio) 341 330 return -ENOMEM; 342 - *pagep = page; 331 + *pagep = &folio->page; 343 332 344 - ret = nfs_flush_incompatible(file, page); 333 + ret = nfs_flush_incompatible(file, folio); 345 334 if (ret) { 346 - unlock_page(page); 347 - put_page(page); 335 + folio_unlock(folio); 336 + folio_put(folio); 348 337 } else if (!once_thru && 349 - nfs_want_read_modify_write(file, page, pos, len)) { 338 + nfs_want_read_modify_write(file, folio, pos, len)) { 350 339 once_thru = 1; 351 - ret = nfs_read_folio(file, page_folio(page)); 352 - put_page(page); 340 + ret = nfs_read_folio(file, folio); 341 + folio_put(folio); 353 342 if (!ret) 354 343 goto start; 355 344 } ··· 356 347 } 357 348 358 349 static int nfs_write_end(struct file *file, struct address_space *mapping, 359 - loff_t pos, unsigned len, unsigned copied, 360 - struct page *page, void *fsdata) 350 + loff_t pos, unsigned len, unsigned copied, 351 + struct page *page, void *fsdata) 361 352 { 362 - unsigned offset = pos & (PAGE_SIZE - 1); 363 353 struct nfs_open_context *ctx = nfs_file_open_context(file); 354 + struct folio *folio = page_folio(page); 355 + unsigned offset = offset_in_folio(folio, pos); 364 356 int status; 365 357 366 358 dfprintk(PAGECACHE, "NFS: write_end(%pD2(%lu), %u@%lld)\n", ··· 371 361 * Zero any uninitialised parts of the page, and then mark the page 372 362 * as up to date if it turns out that we're extending the file. 373 363 */ 374 - if (!PageUptodate(page)) { 375 - unsigned pglen = nfs_page_length(page); 364 + if (!folio_test_uptodate(folio)) { 365 + size_t fsize = folio_size(folio); 366 + unsigned pglen = nfs_folio_length(folio); 376 367 unsigned end = offset + copied; 377 368 378 369 if (pglen == 0) { 379 - zero_user_segments(page, 0, offset, 380 - end, PAGE_SIZE); 381 - SetPageUptodate(page); 370 + folio_zero_segments(folio, 0, offset, end, fsize); 371 + folio_mark_uptodate(folio); 382 372 } else if (end >= pglen) { 383 - zero_user_segment(page, end, PAGE_SIZE); 373 + folio_zero_segment(folio, end, fsize); 384 374 if (offset == 0) 385 - SetPageUptodate(page); 375 + folio_mark_uptodate(folio); 386 376 } else 387 - zero_user_segment(page, pglen, PAGE_SIZE); 377 + folio_zero_segment(folio, pglen, fsize); 388 378 } 389 379 390 - status = nfs_updatepage(file, page, offset, copied); 380 + status = nfs_update_folio(file, folio, offset, copied); 391 381 392 - unlock_page(page); 393 - put_page(page); 382 + folio_unlock(folio); 383 + folio_put(folio); 394 384 395 385 if (status < 0) 396 386 return status; ··· 412 402 static void nfs_invalidate_folio(struct folio *folio, size_t offset, 413 403 size_t length) 414 404 { 405 + struct inode *inode = folio_file_mapping(folio)->host; 415 406 dfprintk(PAGECACHE, "NFS: invalidate_folio(%lu, %zu, %zu)\n", 416 407 folio->index, offset, length); 417 408 418 409 if (offset != 0 || length < folio_size(folio)) 419 410 return; 420 411 /* Cancel any unstarted writes on this page */ 421 - nfs_wb_folio_cancel(folio->mapping->host, folio); 412 + nfs_wb_folio_cancel(inode, folio); 422 413 folio_wait_fscache(folio); 414 + trace_nfs_invalidate_folio(inode, folio); 423 415 } 424 416 425 417 /* ··· 435 423 dfprintk(PAGECACHE, "NFS: release_folio(%p)\n", folio); 436 424 437 425 /* If the private flag is set, then the folio is not freeable */ 438 - if (folio_test_private(folio)) 439 - return false; 426 + if (folio_test_private(folio)) { 427 + if ((current_gfp_context(gfp) & GFP_KERNEL) != GFP_KERNEL || 428 + current_is_kswapd()) 429 + return false; 430 + if (nfs_wb_folio(folio_file_mapping(folio)->host, folio) < 0) 431 + return false; 432 + } 440 433 return nfs_fscache_release_folio(folio, gfp); 441 434 } 442 435 ··· 482 465 static int nfs_launder_folio(struct folio *folio) 483 466 { 484 467 struct inode *inode = folio->mapping->host; 468 + int ret; 485 469 486 470 dfprintk(PAGECACHE, "NFS: launder_folio(%ld, %llu)\n", 487 471 inode->i_ino, folio_pos(folio)); 488 472 489 473 folio_wait_fscache(folio); 490 - return nfs_wb_page(inode, &folio->page); 474 + ret = nfs_wb_folio(inode, folio); 475 + trace_nfs_launder_folio_done(inode, folio, ret); 476 + return ret; 491 477 } 492 478 493 479 static int nfs_swap_activate(struct swap_info_struct *sis, struct file *file, ··· 567 547 */ 568 548 static vm_fault_t nfs_vm_page_mkwrite(struct vm_fault *vmf) 569 549 { 570 - struct page *page = vmf->page; 571 550 struct file *filp = vmf->vma->vm_file; 572 551 struct inode *inode = file_inode(filp); 573 552 unsigned pagelen; 574 553 vm_fault_t ret = VM_FAULT_NOPAGE; 575 554 struct address_space *mapping; 555 + struct folio *folio = page_folio(vmf->page); 576 556 577 557 dfprintk(PAGECACHE, "NFS: vm_page_mkwrite(%pD2(%lu), offset %lld)\n", 578 - filp, filp->f_mapping->host->i_ino, 579 - (long long)page_offset(page)); 558 + filp, filp->f_mapping->host->i_ino, 559 + (long long)folio_file_pos(folio)); 580 560 581 561 sb_start_pagefault(inode->i_sb); 582 562 583 563 /* make sure the cache has finished storing the page */ 584 - if (PageFsCache(page) && 585 - wait_on_page_fscache_killable(vmf->page) < 0) { 564 + if (folio_test_fscache(folio) && 565 + folio_wait_fscache_killable(folio) < 0) { 586 566 ret = VM_FAULT_RETRY; 587 567 goto out; 588 568 } ··· 591 571 nfs_wait_bit_killable, 592 572 TASK_KILLABLE|TASK_FREEZABLE_UNSAFE); 593 573 594 - lock_page(page); 595 - mapping = page_file_mapping(page); 574 + folio_lock(folio); 575 + mapping = folio_file_mapping(folio); 596 576 if (mapping != inode->i_mapping) 597 577 goto out_unlock; 598 578 599 - wait_on_page_writeback(page); 579 + folio_wait_writeback(folio); 600 580 601 - pagelen = nfs_page_length(page); 581 + pagelen = nfs_folio_length(folio); 602 582 if (pagelen == 0) 603 583 goto out_unlock; 604 584 605 585 ret = VM_FAULT_LOCKED; 606 - if (nfs_flush_incompatible(filp, page) == 0 && 607 - nfs_updatepage(filp, page, 0, pagelen) == 0) 586 + if (nfs_flush_incompatible(filp, folio) == 0 && 587 + nfs_update_folio(filp, folio, 0, pagelen) == 0) 608 588 goto out; 609 589 610 590 ret = VM_FAULT_SIGBUS; 611 591 out_unlock: 612 - unlock_page(page); 592 + folio_unlock(folio); 613 593 out: 614 594 sb_end_pagefault(inode->i_sb); 615 595 return ret;
+2
fs/nfs/filelayout/filelayout.c
··· 862 862 863 863 status = filelayout_check_deviceid(lo, fl, gfp_flags); 864 864 if (status) { 865 + pnfs_error_mark_layout_for_return(ino, lseg); 866 + pnfs_set_lo_fail(lseg); 865 867 pnfs_put_lseg(lseg); 866 868 lseg = NULL; 867 869 }
+28 -10
fs/nfs/internal.h
··· 760 760 * Record the page as unstable (an extra writeback period) and mark its 761 761 * inode as dirty. 762 762 */ 763 - static inline 764 - void nfs_mark_page_unstable(struct page *page, struct nfs_commit_info *cinfo) 763 + static inline void nfs_folio_mark_unstable(struct folio *folio, 764 + struct nfs_commit_info *cinfo) 765 765 { 766 - if (!cinfo->dreq) { 767 - struct inode *inode = page_file_mapping(page)->host; 766 + if (folio && !cinfo->dreq) { 767 + struct inode *inode = folio_file_mapping(folio)->host; 768 + long nr = folio_nr_pages(folio); 768 769 769 770 /* This page is really still in write-back - just that the 770 771 * writeback is happening on the server now. 771 772 */ 772 - inc_node_page_state(page, NR_WRITEBACK); 773 - inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK); 773 + node_stat_mod_folio(folio, NR_WRITEBACK, nr); 774 + wb_stat_mod(&inode_to_bdi(inode)->wb, WB_WRITEBACK, nr); 774 775 __mark_inode_dirty(inode, I_DIRTY_DATASYNC); 775 776 } 776 777 } ··· 796 795 } 797 796 798 797 /* 798 + * Determine the number of bytes of data the page contains 799 + */ 800 + static inline size_t nfs_folio_length(struct folio *folio) 801 + { 802 + loff_t i_size = i_size_read(folio_file_mapping(folio)->host); 803 + 804 + if (i_size > 0) { 805 + pgoff_t index = folio_index(folio) >> folio_order(folio); 806 + pgoff_t end_index = (i_size - 1) >> folio_shift(folio); 807 + if (index < end_index) 808 + return folio_size(folio); 809 + if (index == end_index) 810 + return offset_in_folio(folio, i_size - 1) + 1; 811 + } 812 + return 0; 813 + } 814 + 815 + /* 799 816 * Convert a umode to a dirent->d_type 800 817 */ 801 818 static inline ··· 826 807 * Determine the number of pages in an array of length 'len' and 827 808 * with a base offset of 'base' 828 809 */ 829 - static inline 830 - unsigned int nfs_page_array_len(unsigned int base, size_t len) 810 + static inline unsigned int nfs_page_array_len(unsigned int base, size_t len) 831 811 { 832 - return ((unsigned long)len + (unsigned long)base + 833 - PAGE_SIZE - 1) >> PAGE_SHIFT; 812 + return ((unsigned long)len + (unsigned long)base + PAGE_SIZE - 1) >> 813 + PAGE_SHIFT; 834 814 } 835 815 836 816 /*
+2 -1
fs/nfs/nfs42proc.c
··· 460 460 461 461 if (err >= 0) 462 462 break; 463 - if (err == -ENOTSUPP && 463 + if ((err == -ENOTSUPP || 464 + err == -NFS4ERR_OFFLOAD_DENIED) && 464 465 nfs42_files_from_same_server(src, dst)) { 465 466 err = -EOPNOTSUPP; 466 467 break;
+3 -1
fs/nfs/nfs4proc.c
··· 10604 10604 /* The state manager thread will now exit once it is 10605 10605 * woken. 10606 10606 */ 10607 - wake_up_var(&NFS_SERVER(inode)->nfs_client->cl_state); 10607 + struct nfs_client *clp = NFS_SERVER(inode)->nfs_client; 10608 + 10609 + nfs4_schedule_state_manager(clp); 10608 10610 } 10609 10611 10610 10612 static const struct inode_operations nfs4_dir_inode_operations = {
+22 -20
fs/nfs/nfs4trace.h
··· 292 292 TRACE_DEFINE_ENUM(NFS4CLNT_LEASE_MOVED); 293 293 TRACE_DEFINE_ENUM(NFS4CLNT_DELEGATION_EXPIRED); 294 294 TRACE_DEFINE_ENUM(NFS4CLNT_RUN_MANAGER); 295 + TRACE_DEFINE_ENUM(NFS4CLNT_MANAGER_AVAILABLE); 295 296 TRACE_DEFINE_ENUM(NFS4CLNT_RECALL_RUNNING); 296 297 TRACE_DEFINE_ENUM(NFS4CLNT_RECALL_ANY_LAYOUT_READ); 297 298 TRACE_DEFINE_ENUM(NFS4CLNT_RECALL_ANY_LAYOUT_RW); 299 + TRACE_DEFINE_ENUM(NFS4CLNT_DELEGRETURN_DELAYED); 298 300 299 301 #define show_nfs4_clp_state(state) \ 300 302 __print_flags(state, "|", \ 301 - { NFS4CLNT_MANAGER_RUNNING, "MANAGER_RUNNING" }, \ 302 - { NFS4CLNT_CHECK_LEASE, "CHECK_LEASE" }, \ 303 - { NFS4CLNT_LEASE_EXPIRED, "LEASE_EXPIRED" }, \ 304 - { NFS4CLNT_RECLAIM_REBOOT, "RECLAIM_REBOOT" }, \ 305 - { NFS4CLNT_RECLAIM_NOGRACE, "RECLAIM_NOGRACE" }, \ 306 - { NFS4CLNT_DELEGRETURN, "DELEGRETURN" }, \ 307 - { NFS4CLNT_SESSION_RESET, "SESSION_RESET" }, \ 308 - { NFS4CLNT_LEASE_CONFIRM, "LEASE_CONFIRM" }, \ 309 - { NFS4CLNT_SERVER_SCOPE_MISMATCH, \ 310 - "SERVER_SCOPE_MISMATCH" }, \ 311 - { NFS4CLNT_PURGE_STATE, "PURGE_STATE" }, \ 312 - { NFS4CLNT_BIND_CONN_TO_SESSION, \ 313 - "BIND_CONN_TO_SESSION" }, \ 314 - { NFS4CLNT_MOVED, "MOVED" }, \ 315 - { NFS4CLNT_LEASE_MOVED, "LEASE_MOVED" }, \ 316 - { NFS4CLNT_DELEGATION_EXPIRED, "DELEGATION_EXPIRED" }, \ 317 - { NFS4CLNT_RUN_MANAGER, "RUN_MANAGER" }, \ 318 - { NFS4CLNT_RECALL_RUNNING, "RECALL_RUNNING" }, \ 319 - { NFS4CLNT_RECALL_ANY_LAYOUT_READ, "RECALL_ANY_LAYOUT_READ" }, \ 320 - { NFS4CLNT_RECALL_ANY_LAYOUT_RW, "RECALL_ANY_LAYOUT_RW" }) 303 + { BIT(NFS4CLNT_MANAGER_RUNNING), "MANAGER_RUNNING" }, \ 304 + { BIT(NFS4CLNT_CHECK_LEASE), "CHECK_LEASE" }, \ 305 + { BIT(NFS4CLNT_LEASE_EXPIRED), "LEASE_EXPIRED" }, \ 306 + { BIT(NFS4CLNT_RECLAIM_REBOOT), "RECLAIM_REBOOT" }, \ 307 + { BIT(NFS4CLNT_RECLAIM_NOGRACE), "RECLAIM_NOGRACE" }, \ 308 + { BIT(NFS4CLNT_DELEGRETURN), "DELEGRETURN" }, \ 309 + { BIT(NFS4CLNT_SESSION_RESET), "SESSION_RESET" }, \ 310 + { BIT(NFS4CLNT_LEASE_CONFIRM), "LEASE_CONFIRM" }, \ 311 + { BIT(NFS4CLNT_SERVER_SCOPE_MISMATCH), "SERVER_SCOPE_MISMATCH" }, \ 312 + { BIT(NFS4CLNT_PURGE_STATE), "PURGE_STATE" }, \ 313 + { BIT(NFS4CLNT_BIND_CONN_TO_SESSION), "BIND_CONN_TO_SESSION" }, \ 314 + { BIT(NFS4CLNT_MOVED), "MOVED" }, \ 315 + { BIT(NFS4CLNT_LEASE_MOVED), "LEASE_MOVED" }, \ 316 + { BIT(NFS4CLNT_DELEGATION_EXPIRED), "DELEGATION_EXPIRED" }, \ 317 + { BIT(NFS4CLNT_RUN_MANAGER), "RUN_MANAGER" }, \ 318 + { BIT(NFS4CLNT_MANAGER_AVAILABLE), "MANAGER_AVAILABLE" }, \ 319 + { BIT(NFS4CLNT_RECALL_RUNNING), "RECALL_RUNNING" }, \ 320 + { BIT(NFS4CLNT_RECALL_ANY_LAYOUT_READ), "RECALL_ANY_LAYOUT_READ" }, \ 321 + { BIT(NFS4CLNT_RECALL_ANY_LAYOUT_RW), "RECALL_ANY_LAYOUT_RW" }, \ 322 + { BIT(NFS4CLNT_DELEGRETURN_DELAYED), "DELERETURN_DELAYED" }) 321 323 322 324 TRACE_EVENT(nfs4_state_mgr, 323 325 TP_PROTO(
+44 -14
fs/nfs/nfstrace.h
··· 152 152 DEFINE_NFS_INODE_EVENT_DONE(nfs_getattr_exit); 153 153 DEFINE_NFS_INODE_EVENT(nfs_setattr_enter); 154 154 DEFINE_NFS_INODE_EVENT_DONE(nfs_setattr_exit); 155 - DEFINE_NFS_INODE_EVENT(nfs_writeback_page_enter); 156 - DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_page_exit); 157 155 DEFINE_NFS_INODE_EVENT(nfs_writeback_inode_enter); 158 156 DEFINE_NFS_INODE_EVENT_DONE(nfs_writeback_inode_exit); 159 157 DEFINE_NFS_INODE_EVENT(nfs_fsync_enter); ··· 931 933 ) 932 934 ); 933 935 934 - TRACE_EVENT(nfs_aop_readpage, 936 + DECLARE_EVENT_CLASS(nfs_folio_event, 935 937 TP_PROTO( 936 938 const struct inode *inode, 937 - struct page *page 939 + struct folio *folio 938 940 ), 939 941 940 - TP_ARGS(inode, page), 942 + TP_ARGS(inode, folio), 941 943 942 944 TP_STRUCT__entry( 943 945 __field(dev_t, dev) ··· 945 947 __field(u64, fileid) 946 948 __field(u64, version) 947 949 __field(loff_t, offset) 950 + __field(u32, count) 948 951 ), 949 952 950 953 TP_fast_assign( ··· 955 956 __entry->fileid = nfsi->fileid; 956 957 __entry->fhandle = nfs_fhandle_hash(&nfsi->fh); 957 958 __entry->version = inode_peek_iversion_raw(inode); 958 - __entry->offset = page_index(page) << PAGE_SHIFT; 959 + __entry->offset = folio_file_pos(folio); 960 + __entry->count = nfs_folio_length(folio); 959 961 ), 960 962 961 963 TP_printk( 962 - "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu offset=%lld", 964 + "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu " 965 + "offset=%lld count=%u", 963 966 MAJOR(__entry->dev), MINOR(__entry->dev), 964 967 (unsigned long long)__entry->fileid, 965 968 __entry->fhandle, __entry->version, 966 - __entry->offset 969 + __entry->offset, __entry->count 967 970 ) 968 971 ); 969 972 970 - TRACE_EVENT(nfs_aop_readpage_done, 973 + #define DEFINE_NFS_FOLIO_EVENT(name) \ 974 + DEFINE_EVENT(nfs_folio_event, name, \ 975 + TP_PROTO( \ 976 + const struct inode *inode, \ 977 + struct folio *folio \ 978 + ), \ 979 + TP_ARGS(inode, folio)) 980 + 981 + DECLARE_EVENT_CLASS(nfs_folio_event_done, 971 982 TP_PROTO( 972 983 const struct inode *inode, 973 - struct page *page, 984 + struct folio *folio, 974 985 int ret 975 986 ), 976 987 977 - TP_ARGS(inode, page, ret), 988 + TP_ARGS(inode, folio, ret), 978 989 979 990 TP_STRUCT__entry( 980 991 __field(dev_t, dev) ··· 993 984 __field(u64, fileid) 994 985 __field(u64, version) 995 986 __field(loff_t, offset) 987 + __field(u32, count) 996 988 ), 997 989 998 990 TP_fast_assign( ··· 1003 993 __entry->fileid = nfsi->fileid; 1004 994 __entry->fhandle = nfs_fhandle_hash(&nfsi->fh); 1005 995 __entry->version = inode_peek_iversion_raw(inode); 1006 - __entry->offset = page_index(page) << PAGE_SHIFT; 996 + __entry->offset = folio_file_pos(folio); 997 + __entry->count = nfs_folio_length(folio); 1007 998 __entry->ret = ret; 1008 999 ), 1009 1000 1010 1001 TP_printk( 1011 - "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu offset=%lld ret=%d", 1002 + "fileid=%02x:%02x:%llu fhandle=0x%08x version=%llu " 1003 + "offset=%lld count=%u ret=%d", 1012 1004 MAJOR(__entry->dev), MINOR(__entry->dev), 1013 1005 (unsigned long long)__entry->fileid, 1014 1006 __entry->fhandle, __entry->version, 1015 - __entry->offset, __entry->ret 1007 + __entry->offset, __entry->count, __entry->ret 1016 1008 ) 1017 1009 ); 1010 + 1011 + #define DEFINE_NFS_FOLIO_EVENT_DONE(name) \ 1012 + DEFINE_EVENT(nfs_folio_event_done, name, \ 1013 + TP_PROTO( \ 1014 + const struct inode *inode, \ 1015 + struct folio *folio, \ 1016 + int ret \ 1017 + ), \ 1018 + TP_ARGS(inode, folio, ret)) 1019 + 1020 + DEFINE_NFS_FOLIO_EVENT(nfs_aop_readpage); 1021 + DEFINE_NFS_FOLIO_EVENT_DONE(nfs_aop_readpage_done); 1022 + 1023 + DEFINE_NFS_FOLIO_EVENT(nfs_writeback_folio); 1024 + DEFINE_NFS_FOLIO_EVENT_DONE(nfs_writeback_folio_done); 1025 + 1026 + DEFINE_NFS_FOLIO_EVENT(nfs_invalidate_folio); 1027 + DEFINE_NFS_FOLIO_EVENT_DONE(nfs_launder_folio_done); 1018 1028 1019 1029 TRACE_EVENT(nfs_aop_readahead, 1020 1030 TP_PROTO(
+169 -48
fs/nfs/pagelist.c
··· 32 32 static struct kmem_cache *nfs_page_cachep; 33 33 static const struct rpc_call_ops nfs_pgio_common_ops; 34 34 35 + struct nfs_page_iter_page { 36 + const struct nfs_page *req; 37 + size_t count; 38 + }; 39 + 40 + static void nfs_page_iter_page_init(struct nfs_page_iter_page *i, 41 + const struct nfs_page *req) 42 + { 43 + i->req = req; 44 + i->count = 0; 45 + } 46 + 47 + static void nfs_page_iter_page_advance(struct nfs_page_iter_page *i, size_t sz) 48 + { 49 + const struct nfs_page *req = i->req; 50 + size_t tmp = i->count + sz; 51 + 52 + i->count = (tmp < req->wb_bytes) ? tmp : req->wb_bytes; 53 + } 54 + 55 + static struct page *nfs_page_iter_page_get(struct nfs_page_iter_page *i) 56 + { 57 + const struct nfs_page *req = i->req; 58 + struct page *page; 59 + 60 + if (i->count != req->wb_bytes) { 61 + size_t base = i->count + req->wb_pgbase; 62 + size_t len = PAGE_SIZE - offset_in_page(base); 63 + 64 + page = nfs_page_to_page(req, base); 65 + nfs_page_iter_page_advance(i, len); 66 + return page; 67 + } 68 + return NULL; 69 + } 70 + 35 71 static struct nfs_pgio_mirror * 36 72 nfs_pgio_get_mirror(struct nfs_pageio_descriptor *desc, u32 idx) 37 73 { ··· 427 391 * has extra ref from the write/commit path to handle handoff 428 392 * between write and commit lists. */ 429 393 if (test_bit(PG_INODE_REF, &prev->wb_head->wb_flags)) { 430 - inode = page_file_mapping(req->wb_page)->host; 394 + inode = nfs_page_to_inode(req); 431 395 set_bit(PG_INODE_REF, &req->wb_flags); 432 396 kref_get(&req->wb_kref); 433 397 atomic_long_inc(&NFS_I(inode)->nrequests); ··· 467 431 nfs_release_request(head); 468 432 } 469 433 470 - static struct nfs_page * 471 - __nfs_create_request(struct nfs_lock_context *l_ctx, struct page *page, 472 - unsigned int pgbase, unsigned int offset, 473 - unsigned int count) 434 + static struct nfs_page *nfs_page_create(struct nfs_lock_context *l_ctx, 435 + unsigned int pgbase, pgoff_t index, 436 + unsigned int offset, unsigned int count) 474 437 { 475 438 struct nfs_page *req; 476 439 struct nfs_open_context *ctx = l_ctx->open_context; ··· 488 453 /* Initialize the request struct. Initially, we assume a 489 454 * long write-back delay. This will be adjusted in 490 455 * update_nfs_request below if the region is not locked. */ 491 - req->wb_page = page; 492 - if (page) { 493 - req->wb_index = page_index(page); 494 - get_page(page); 495 - } 496 - req->wb_offset = offset; 497 - req->wb_pgbase = pgbase; 498 - req->wb_bytes = count; 456 + req->wb_pgbase = pgbase; 457 + req->wb_index = index; 458 + req->wb_offset = offset; 459 + req->wb_bytes = count; 499 460 kref_init(&req->wb_kref); 500 461 req->wb_nio = 0; 501 462 return req; 502 463 } 503 464 465 + static void nfs_page_assign_folio(struct nfs_page *req, struct folio *folio) 466 + { 467 + if (folio != NULL) { 468 + req->wb_folio = folio; 469 + folio_get(folio); 470 + set_bit(PG_FOLIO, &req->wb_flags); 471 + } 472 + } 473 + 474 + static void nfs_page_assign_page(struct nfs_page *req, struct page *page) 475 + { 476 + if (page != NULL) { 477 + req->wb_page = page; 478 + get_page(page); 479 + } 480 + } 481 + 504 482 /** 505 - * nfs_create_request - Create an NFS read/write request. 483 + * nfs_page_create_from_page - Create an NFS read/write request. 506 484 * @ctx: open context to use 507 485 * @page: page to write 508 - * @offset: starting offset within the page for the write 486 + * @pgbase: starting offset within the page for the write 487 + * @offset: file offset for the write 509 488 * @count: number of bytes to read/write 510 489 * 511 490 * The page must be locked by the caller. This makes sure we never 512 491 * create two different requests for the same page. 513 492 * User should ensure it is safe to sleep in this function. 514 493 */ 515 - struct nfs_page * 516 - nfs_create_request(struct nfs_open_context *ctx, struct page *page, 517 - unsigned int offset, unsigned int count) 494 + struct nfs_page *nfs_page_create_from_page(struct nfs_open_context *ctx, 495 + struct page *page, 496 + unsigned int pgbase, loff_t offset, 497 + unsigned int count) 518 498 { 519 499 struct nfs_lock_context *l_ctx = nfs_get_lock_context(ctx); 520 500 struct nfs_page *ret; 521 501 522 502 if (IS_ERR(l_ctx)) 523 503 return ERR_CAST(l_ctx); 524 - ret = __nfs_create_request(l_ctx, page, offset, offset, count); 525 - if (!IS_ERR(ret)) 504 + ret = nfs_page_create(l_ctx, pgbase, offset >> PAGE_SHIFT, 505 + offset_in_page(offset), count); 506 + if (!IS_ERR(ret)) { 507 + nfs_page_assign_page(ret, page); 526 508 nfs_page_group_init(ret, NULL); 509 + } 510 + nfs_put_lock_context(l_ctx); 511 + return ret; 512 + } 513 + 514 + /** 515 + * nfs_page_create_from_folio - Create an NFS read/write request. 516 + * @ctx: open context to use 517 + * @folio: folio to write 518 + * @offset: starting offset within the folio for the write 519 + * @count: number of bytes to read/write 520 + * 521 + * The page must be locked by the caller. This makes sure we never 522 + * create two different requests for the same page. 523 + * User should ensure it is safe to sleep in this function. 524 + */ 525 + struct nfs_page *nfs_page_create_from_folio(struct nfs_open_context *ctx, 526 + struct folio *folio, 527 + unsigned int offset, 528 + unsigned int count) 529 + { 530 + struct nfs_lock_context *l_ctx = nfs_get_lock_context(ctx); 531 + struct nfs_page *ret; 532 + 533 + if (IS_ERR(l_ctx)) 534 + return ERR_CAST(l_ctx); 535 + ret = nfs_page_create(l_ctx, offset, folio_index(folio), offset, count); 536 + if (!IS_ERR(ret)) { 537 + nfs_page_assign_folio(ret, folio); 538 + nfs_page_group_init(ret, NULL); 539 + } 527 540 nfs_put_lock_context(l_ctx); 528 541 return ret; 529 542 } ··· 584 501 { 585 502 struct nfs_page *last; 586 503 struct nfs_page *ret; 504 + struct folio *folio = nfs_page_to_folio(req); 505 + struct page *page = nfs_page_to_page(req, pgbase); 587 506 588 - ret = __nfs_create_request(req->wb_lock_context, req->wb_page, 589 - pgbase, offset, count); 507 + ret = nfs_page_create(req->wb_lock_context, pgbase, req->wb_index, 508 + offset, count); 590 509 if (!IS_ERR(ret)) { 510 + if (folio) 511 + nfs_page_assign_folio(ret, folio); 512 + else 513 + nfs_page_assign_page(ret, page); 591 514 /* find the last request */ 592 515 for (last = req->wb_head; 593 516 last->wb_this_page != req->wb_head; ··· 601 512 ; 602 513 603 514 nfs_lock_request(ret); 604 - ret->wb_index = req->wb_index; 605 515 nfs_page_group_init(ret, last); 606 516 ret->wb_nio = req->wb_nio; 607 517 } ··· 639 551 */ 640 552 static void nfs_clear_request(struct nfs_page *req) 641 553 { 554 + struct folio *folio = nfs_page_to_folio(req); 642 555 struct page *page = req->wb_page; 643 556 struct nfs_lock_context *l_ctx = req->wb_lock_context; 644 557 struct nfs_open_context *ctx; 645 558 646 - if (page != NULL) { 559 + if (folio != NULL) { 560 + folio_put(folio); 561 + req->wb_folio = NULL; 562 + clear_bit(PG_FOLIO, &req->wb_flags); 563 + } else if (page != NULL) { 647 564 put_page(page); 648 565 req->wb_page = NULL; 649 566 } ··· 786 693 /** 787 694 * nfs_pgio_rpcsetup - Set up arguments for a pageio call 788 695 * @hdr: The pageio hdr 696 + * @pgbase: base 789 697 * @count: Number of bytes to read 790 698 * @how: How to commit data (writes only) 791 699 * @cinfo: Commit information for the call (writes only) 792 700 */ 793 - static void nfs_pgio_rpcsetup(struct nfs_pgio_header *hdr, 794 - unsigned int count, 795 - int how, struct nfs_commit_info *cinfo) 701 + static void nfs_pgio_rpcsetup(struct nfs_pgio_header *hdr, unsigned int pgbase, 702 + unsigned int count, int how, 703 + struct nfs_commit_info *cinfo) 796 704 { 797 705 struct nfs_page *req = hdr->req; 798 706 ··· 804 710 hdr->args.offset = req_offset(req); 805 711 /* pnfs_set_layoutcommit needs this */ 806 712 hdr->mds_offset = hdr->args.offset; 807 - hdr->args.pgbase = req->wb_pgbase; 713 + hdr->args.pgbase = pgbase; 808 714 hdr->args.pages = hdr->page_array.pagevec; 809 715 hdr->args.count = count; 810 716 hdr->args.context = get_nfs_open_context(nfs_req_openctx(req)); ··· 990 896 struct nfs_commit_info cinfo; 991 897 struct nfs_page_array *pg_array = &hdr->page_array; 992 898 unsigned int pagecount, pageused; 899 + unsigned int pg_base = offset_in_page(mirror->pg_base); 993 900 gfp_t gfp_flags = nfs_io_gfp_mask(); 994 901 995 - pagecount = nfs_page_array_len(mirror->pg_base, mirror->pg_count); 902 + pagecount = nfs_page_array_len(pg_base, mirror->pg_count); 996 903 pg_array->npages = pagecount; 997 904 998 905 if (pagecount <= ARRAY_SIZE(pg_array->page_array)) ··· 1013 918 last_page = NULL; 1014 919 pageused = 0; 1015 920 while (!list_empty(head)) { 921 + struct nfs_page_iter_page i; 922 + struct page *page; 923 + 1016 924 req = nfs_list_entry(head->next); 1017 925 nfs_list_move_request(req, &hdr->pages); 1018 926 1019 - if (!last_page || last_page != req->wb_page) { 1020 - pageused++; 1021 - if (pageused > pagecount) 1022 - break; 1023 - *pages++ = last_page = req->wb_page; 927 + if (req->wb_pgbase == 0) 928 + last_page = NULL; 929 + 930 + nfs_page_iter_page_init(&i, req); 931 + while ((page = nfs_page_iter_page_get(&i)) != NULL) { 932 + if (last_page != page) { 933 + pageused++; 934 + if (pageused > pagecount) 935 + goto full; 936 + *pages++ = last_page = page; 937 + } 1024 938 } 1025 939 } 940 + full: 1026 941 if (WARN_ON_ONCE(pageused != pagecount)) { 1027 942 nfs_pgio_error(hdr); 1028 943 desc->pg_error = -EINVAL; ··· 1044 939 desc->pg_ioflags &= ~FLUSH_COND_STABLE; 1045 940 1046 941 /* Set up the argument struct */ 1047 - nfs_pgio_rpcsetup(hdr, mirror->pg_count, desc->pg_ioflags, &cinfo); 942 + nfs_pgio_rpcsetup(hdr, pg_base, mirror->pg_count, desc->pg_ioflags, 943 + &cinfo); 1048 944 desc->pg_rpc_callops = &nfs_pgio_common_ops; 1049 945 return 0; 1050 946 } ··· 1141 1035 return l1->lockowner == l2->lockowner; 1142 1036 } 1143 1037 1038 + static bool nfs_page_is_contiguous(const struct nfs_page *prev, 1039 + const struct nfs_page *req) 1040 + { 1041 + size_t prev_end = prev->wb_pgbase + prev->wb_bytes; 1042 + 1043 + if (req_offset(req) != req_offset(prev) + prev->wb_bytes) 1044 + return false; 1045 + if (req->wb_pgbase == 0) 1046 + return prev_end == nfs_page_max_length(prev); 1047 + if (req->wb_pgbase == prev_end) { 1048 + struct folio *folio = nfs_page_to_folio(req); 1049 + if (folio) 1050 + return folio == nfs_page_to_folio(prev); 1051 + return req->wb_page == prev->wb_page; 1052 + } 1053 + return false; 1054 + } 1055 + 1144 1056 /** 1145 1057 * nfs_coalesce_size - test two requests for compatibility 1146 1058 * @prev: pointer to nfs_page ··· 1187 1063 !nfs_match_lock_context(req->wb_lock_context, 1188 1064 prev->wb_lock_context)) 1189 1065 return 0; 1190 - if (req_offset(req) != req_offset(prev) + prev->wb_bytes) 1066 + if (!nfs_page_is_contiguous(prev, req)) 1191 1067 return 0; 1192 - if (req->wb_page == prev->wb_page) { 1193 - if (req->wb_pgbase != prev->wb_pgbase + prev->wb_bytes) 1194 - return 0; 1195 - } else { 1196 - if (req->wb_pgbase != 0 || 1197 - prev->wb_pgbase + prev->wb_bytes != PAGE_SIZE) 1198 - return 0; 1199 - } 1200 1068 } 1201 1069 return pgio->pg_ops->pg_test(pgio, prev, req); 1202 1070 } ··· 1528 1412 { 1529 1413 struct nfs_pgio_mirror *mirror; 1530 1414 struct nfs_page *prev; 1415 + struct folio *folio; 1531 1416 u32 midx; 1532 1417 1533 1418 for (midx = 0; midx < desc->pg_mirror_count; midx++) { 1534 1419 mirror = nfs_pgio_get_mirror(desc, midx); 1535 1420 if (!list_empty(&mirror->pg_list)) { 1536 1421 prev = nfs_list_entry(mirror->pg_list.prev); 1537 - if (index != prev->wb_index + 1) { 1538 - nfs_pageio_complete(desc); 1539 - break; 1540 - } 1422 + folio = nfs_page_to_folio(prev); 1423 + if (folio) { 1424 + if (index == folio_next_index(folio)) 1425 + continue; 1426 + } else if (index == prev->wb_index + 1) 1427 + continue; 1428 + nfs_pageio_complete(desc); 1429 + break; 1541 1430 } 1542 1431 } 1543 1432 }
+1 -1
fs/nfs/pnfs.c
··· 511 511 512 512 spin_lock(&inode->i_lock); 513 513 pnfs_layout_set_fail_bit(lo, pnfs_iomode_to_fail_bit(iomode)); 514 - pnfs_mark_matching_lsegs_invalid(lo, &head, &range, 0); 514 + pnfs_mark_matching_lsegs_return(lo, &head, &range, 0); 515 515 spin_unlock(&inode->i_lock); 516 516 pnfs_free_lseg_list(&head); 517 517 dprintk("%s Setting layout IOMODE_%s fail bit\n", __func__,
+5 -5
fs/nfs/pnfs.h
··· 193 193 void (*recover_commit_reqs) (struct list_head *list, 194 194 struct nfs_commit_info *cinfo); 195 195 struct nfs_page * (*search_commit_reqs)(struct nfs_commit_info *cinfo, 196 - struct page *page); 196 + struct folio *folio); 197 197 }; 198 198 199 199 struct pnfs_layout_hdr { ··· 395 395 void pnfs_generic_recover_commit_reqs(struct list_head *dst, 396 396 struct nfs_commit_info *cinfo); 397 397 struct nfs_page *pnfs_generic_search_commit_reqs(struct nfs_commit_info *cinfo, 398 - struct page *page); 398 + struct folio *folio); 399 399 int pnfs_generic_commit_pagelist(struct inode *inode, 400 400 struct list_head *mds_pages, 401 401 int how, ··· 557 557 558 558 static inline struct nfs_page * 559 559 pnfs_search_commit_reqs(struct inode *inode, struct nfs_commit_info *cinfo, 560 - struct page *page) 560 + struct folio *folio) 561 561 { 562 562 struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds; 563 563 564 564 if (!fl_cinfo->ops || !fl_cinfo->ops->search_commit_reqs) 565 565 return NULL; 566 - return fl_cinfo->ops->search_commit_reqs(cinfo, page); 566 + return fl_cinfo->ops->search_commit_reqs(cinfo, folio); 567 567 } 568 568 569 569 /* Should the pNFS client commit and return the layout upon a setattr */ ··· 864 864 865 865 static inline struct nfs_page * 866 866 pnfs_search_commit_reqs(struct inode *inode, struct nfs_commit_info *cinfo, 867 - struct page *page) 867 + struct folio *folio) 868 868 { 869 869 return NULL; 870 870 }
+9 -9
fs/nfs/pnfs_nfs.c
··· 353 353 354 354 static struct nfs_page * 355 355 pnfs_bucket_search_commit_reqs(struct pnfs_commit_bucket *buckets, 356 - unsigned int nbuckets, struct page *page) 356 + unsigned int nbuckets, struct folio *folio) 357 357 { 358 358 struct nfs_page *req; 359 359 struct pnfs_commit_bucket *b; ··· 363 363 * request is found */ 364 364 for (i = 0, b = buckets; i < nbuckets; i++, b++) { 365 365 list_for_each_entry(req, &b->written, wb_list) { 366 - if (req->wb_page == page) 366 + if (nfs_page_to_folio(req) == folio) 367 367 return req->wb_head; 368 368 } 369 369 list_for_each_entry(req, &b->committing, wb_list) { 370 - if (req->wb_page == page) 370 + if (nfs_page_to_folio(req) == folio) 371 371 return req->wb_head; 372 372 } 373 373 } ··· 375 375 } 376 376 377 377 /* pnfs_generic_search_commit_reqs - Search lists in @cinfo for the head request 378 - * for @page 378 + * for @folio 379 379 * @cinfo - commit info for current inode 380 - * @page - page to search for matching head request 380 + * @folio - page to search for matching head request 381 381 * 382 382 * Return: the head request if one is found, otherwise %NULL. 383 383 */ 384 - struct nfs_page * 385 - pnfs_generic_search_commit_reqs(struct nfs_commit_info *cinfo, struct page *page) 384 + struct nfs_page *pnfs_generic_search_commit_reqs(struct nfs_commit_info *cinfo, 385 + struct folio *folio) 386 386 { 387 387 struct pnfs_ds_commit_info *fl_cinfo = cinfo->ds; 388 388 struct pnfs_commit_array *array; ··· 390 390 391 391 list_for_each_entry(array, &fl_cinfo->commits, cinfo_list) { 392 392 req = pnfs_bucket_search_commit_reqs(array->buckets, 393 - array->nbuckets, page); 393 + array->nbuckets, folio); 394 394 if (req) 395 395 return req; 396 396 } ··· 1180 1180 1181 1181 nfs_request_add_commit_list_locked(req, list, cinfo); 1182 1182 mutex_unlock(&NFS_I(cinfo->inode)->commit_mutex); 1183 - nfs_mark_page_unstable(req->wb_page, cinfo); 1183 + nfs_folio_mark_unstable(nfs_page_to_folio(req), cinfo); 1184 1184 return; 1185 1185 out_resched: 1186 1186 mutex_unlock(&NFS_I(cinfo->inode)->commit_mutex);
+43 -51
fs/nfs/read.c
··· 49 49 kmem_cache_free(nfs_rdata_cachep, rhdr); 50 50 } 51 51 52 - static 53 - int nfs_return_empty_page(struct page *page) 52 + static int nfs_return_empty_folio(struct folio *folio) 54 53 { 55 - zero_user(page, 0, PAGE_SIZE); 56 - SetPageUptodate(page); 57 - unlock_page(page); 54 + folio_zero_segment(folio, 0, folio_size(folio)); 55 + folio_mark_uptodate(folio); 56 + folio_unlock(folio); 58 57 return 0; 59 58 } 60 59 ··· 110 111 static void nfs_readpage_release(struct nfs_page *req, int error) 111 112 { 112 113 struct inode *inode = d_inode(nfs_req_openctx(req)->dentry); 113 - struct page *page = req->wb_page; 114 + struct folio *folio = nfs_page_to_folio(req); 114 115 115 116 dprintk("NFS: read done (%s/%llu %d@%lld)\n", inode->i_sb->s_id, 116 117 (unsigned long long)NFS_FILEID(inode), req->wb_bytes, 117 118 (long long)req_offset(req)); 118 119 119 120 if (nfs_error_is_fatal_on_server(error) && error != -ETIMEDOUT) 120 - SetPageError(page); 121 + folio_set_error(folio); 121 122 if (nfs_page_group_sync_on_bit(req, PG_UNLOCKPAGE)) { 122 - if (PageUptodate(page)) 123 - nfs_fscache_write_page(inode, page); 124 - unlock_page(page); 123 + if (folio_test_uptodate(folio)) 124 + nfs_fscache_write_page(inode, &folio->page); 125 + folio_unlock(folio); 125 126 } 126 127 nfs_release_request(req); 127 128 } ··· 134 135 static void nfs_page_group_set_uptodate(struct nfs_page *req) 135 136 { 136 137 if (nfs_page_group_sync_on_bit(req, PG_UPTODATE)) 137 - SetPageUptodate(req->wb_page); 138 + folio_mark_uptodate(nfs_page_to_folio(req)); 138 139 } 139 140 140 141 static void nfs_read_completion(struct nfs_pgio_header *hdr) ··· 146 147 goto out; 147 148 while (!list_empty(&hdr->pages)) { 148 149 struct nfs_page *req = nfs_list_entry(hdr->pages.next); 149 - struct page *page = req->wb_page; 150 + struct folio *folio = nfs_page_to_folio(req); 150 151 unsigned long start = req->wb_pgbase; 151 152 unsigned long end = req->wb_pgbase + req->wb_bytes; 152 153 ··· 156 157 if (bytes > hdr->good_bytes) { 157 158 /* nothing in this request was good, so zero 158 159 * the full extent of the request */ 159 - zero_user_segment(page, start, end); 160 + folio_zero_segment(folio, start, end); 160 161 161 162 } else if (hdr->good_bytes - bytes < req->wb_bytes) { 162 163 /* part of this request has good bytes, but 163 164 * not all. zero the bad bytes */ 164 165 start += hdr->good_bytes - bytes; 165 166 WARN_ON(start < req->wb_pgbase); 166 - zero_user_segment(page, start, end); 167 + folio_zero_segment(folio, start, end); 167 168 } 168 169 } 169 170 error = 0; ··· 280 281 nfs_readpage_retry(task, hdr); 281 282 } 282 283 283 - static int 284 - readpage_async_filler(struct nfs_readdesc *desc, struct page *page) 284 + static int readpage_async_filler(struct nfs_readdesc *desc, struct folio *folio) 285 285 { 286 - struct inode *inode = page_file_mapping(page)->host; 287 - unsigned int rsize = NFS_SERVER(inode)->rsize; 286 + struct inode *inode = folio_file_mapping(folio)->host; 287 + struct nfs_server *server = NFS_SERVER(inode); 288 + size_t fsize = folio_size(folio); 289 + unsigned int rsize = server->rsize; 288 290 struct nfs_page *new; 289 291 unsigned int len, aligned_len; 290 292 int error; 291 293 292 - len = nfs_page_length(page); 294 + len = nfs_folio_length(folio); 293 295 if (len == 0) 294 - return nfs_return_empty_page(page); 296 + return nfs_return_empty_folio(folio); 295 297 296 - aligned_len = min_t(unsigned int, ALIGN(len, rsize), PAGE_SIZE); 298 + aligned_len = min_t(unsigned int, ALIGN(len, rsize), fsize); 297 299 298 - if (!IS_SYNC(page->mapping->host)) { 299 - error = nfs_fscache_read_page(page->mapping->host, page); 300 + if (!IS_SYNC(inode)) { 301 + error = nfs_fscache_read_page(inode, &folio->page); 300 302 if (error == 0) 301 303 goto out_unlock; 302 304 } 303 305 304 - new = nfs_create_request(desc->ctx, page, 0, aligned_len); 306 + new = nfs_page_create_from_folio(desc->ctx, folio, 0, aligned_len); 305 307 if (IS_ERR(new)) 306 308 goto out_error; 307 309 308 - if (len < PAGE_SIZE) 309 - zero_user_segment(page, len, PAGE_SIZE); 310 + if (len < fsize) 311 + folio_zero_segment(folio, len, fsize); 310 312 if (!nfs_pageio_add_request(&desc->pgio, new)) { 311 313 nfs_list_remove_request(new); 312 314 error = desc->pgio.pg_error; ··· 318 318 out_error: 319 319 error = PTR_ERR(new); 320 320 out_unlock: 321 - unlock_page(page); 321 + folio_unlock(folio); 322 322 out: 323 323 return error; 324 324 } ··· 331 331 */ 332 332 int nfs_read_folio(struct file *file, struct folio *folio) 333 333 { 334 - struct page *page = &folio->page; 335 334 struct nfs_readdesc desc; 336 - struct inode *inode = page_file_mapping(page)->host; 335 + struct inode *inode = file_inode(file); 337 336 int ret; 338 337 339 - trace_nfs_aop_readpage(inode, page); 338 + trace_nfs_aop_readpage(inode, folio); 340 339 nfs_inc_stats(inode, NFSIOS_VFSREADPAGE); 341 340 342 341 /* 343 342 * Try to flush any pending writes to the file.. 344 343 * 345 - * NOTE! Because we own the page lock, there cannot 344 + * NOTE! Because we own the folio lock, there cannot 346 345 * be any new pending writes generated at this point 347 - * for this page (other pages can be written to). 346 + * for this folio (other folios can be written to). 348 347 */ 349 - ret = nfs_wb_page(inode, page); 348 + ret = nfs_wb_folio(inode, folio); 350 349 if (ret) 351 350 goto out_unlock; 352 - if (PageUptodate(page)) 351 + if (folio_test_uptodate(folio)) 353 352 goto out_unlock; 354 353 355 354 ret = -ESTALE; 356 355 if (NFS_STALE(inode)) 357 356 goto out_unlock; 358 357 359 - if (file == NULL) { 360 - ret = -EBADF; 361 - desc.ctx = nfs_find_open_context(inode, NULL, FMODE_READ); 362 - if (desc.ctx == NULL) 363 - goto out_unlock; 364 - } else 365 - desc.ctx = get_nfs_open_context(nfs_file_open_context(file)); 358 + desc.ctx = get_nfs_open_context(nfs_file_open_context(file)); 366 359 367 360 xchg(&desc.ctx->error, 0); 368 361 nfs_pageio_init_read(&desc.pgio, inode, false, 369 362 &nfs_async_read_completion_ops); 370 363 371 - ret = readpage_async_filler(&desc, page); 364 + ret = readpage_async_filler(&desc, folio); 372 365 if (ret) 373 366 goto out; 374 367 375 368 nfs_pageio_complete_read(&desc.pgio); 376 369 ret = desc.pgio.pg_error < 0 ? desc.pgio.pg_error : 0; 377 370 if (!ret) { 378 - ret = wait_on_page_locked_killable(page); 379 - if (!PageUptodate(page) && !ret) 371 + ret = folio_wait_locked_killable(folio); 372 + if (!folio_test_uptodate(folio) && !ret) 380 373 ret = xchg(&desc.ctx->error, 0); 381 374 } 382 375 out: 383 376 put_nfs_open_context(desc.ctx); 384 - trace_nfs_aop_readpage_done(inode, page, ret); 377 + trace_nfs_aop_readpage_done(inode, folio, ret); 385 378 return ret; 386 379 out_unlock: 387 - unlock_page(page); 388 - trace_nfs_aop_readpage_done(inode, page, ret); 380 + folio_unlock(folio); 381 + trace_nfs_aop_readpage_done(inode, folio, ret); 389 382 return ret; 390 383 } 391 384 ··· 388 395 struct file *file = ractl->file; 389 396 struct nfs_readdesc desc; 390 397 struct inode *inode = ractl->mapping->host; 391 - struct page *page; 398 + struct folio *folio; 392 399 int ret; 393 400 394 401 trace_nfs_aop_readahead(inode, readahead_pos(ractl), nr_pages); ··· 409 416 nfs_pageio_init_read(&desc.pgio, inode, false, 410 417 &nfs_async_read_completion_ops); 411 418 412 - while ((page = readahead_page(ractl)) != NULL) { 413 - ret = readpage_async_filler(&desc, page); 414 - put_page(page); 419 + while ((folio = readahead_folio(ractl)) != NULL) { 420 + ret = readpage_async_filler(&desc, folio); 415 421 if (ret) 416 422 break; 417 423 }
+194 -186
fs/nfs/write.c
··· 64 64 struct inode *inode); 65 65 static struct nfs_page * 66 66 nfs_page_search_commits_for_head_request_locked(struct nfs_inode *nfsi, 67 - struct page *page); 67 + struct folio *folio); 68 68 69 69 static struct kmem_cache *nfs_wdata_cachep; 70 70 static mempool_t *nfs_wdata_mempool; ··· 171 171 return 0; 172 172 } 173 173 174 - static struct nfs_page * 175 - nfs_page_private_request(struct page *page) 174 + static struct nfs_page *nfs_folio_private_request(struct folio *folio) 176 175 { 177 - if (!PagePrivate(page)) 178 - return NULL; 179 - return (struct nfs_page *)page_private(page); 176 + return folio_get_private(folio); 180 177 } 181 178 182 - /* 183 - * nfs_page_find_head_request_locked - find head request associated with @page 179 + /** 180 + * nfs_folio_find_private_request - find head request associated with a folio 181 + * @folio: pointer to folio 184 182 * 185 183 * must be called while holding the inode lock. 186 184 * 187 185 * returns matching head request with reference held, or NULL if not found. 188 186 */ 189 - static struct nfs_page * 190 - nfs_page_find_private_request(struct page *page) 187 + static struct nfs_page *nfs_folio_find_private_request(struct folio *folio) 191 188 { 192 - struct address_space *mapping = page_file_mapping(page); 189 + struct address_space *mapping = folio_file_mapping(folio); 193 190 struct nfs_page *req; 194 191 195 - if (!PagePrivate(page)) 192 + if (!folio_test_private(folio)) 196 193 return NULL; 197 194 spin_lock(&mapping->private_lock); 198 - req = nfs_page_private_request(page); 195 + req = nfs_folio_private_request(folio); 199 196 if (req) { 200 197 WARN_ON_ONCE(req->wb_head != req); 201 198 kref_get(&req->wb_kref); ··· 201 204 return req; 202 205 } 203 206 204 - static struct nfs_page * 205 - nfs_page_find_swap_request(struct page *page) 207 + static struct nfs_page *nfs_folio_find_swap_request(struct folio *folio) 206 208 { 207 - struct inode *inode = page_file_mapping(page)->host; 209 + struct inode *inode = folio_file_mapping(folio)->host; 208 210 struct nfs_inode *nfsi = NFS_I(inode); 209 211 struct nfs_page *req = NULL; 210 - if (!PageSwapCache(page)) 212 + if (!folio_test_swapcache(folio)) 211 213 return NULL; 212 214 mutex_lock(&nfsi->commit_mutex); 213 - if (PageSwapCache(page)) { 215 + if (folio_test_swapcache(folio)) { 214 216 req = nfs_page_search_commits_for_head_request_locked(nfsi, 215 - page); 217 + folio); 216 218 if (req) { 217 219 WARN_ON_ONCE(req->wb_head != req); 218 220 kref_get(&req->wb_kref); ··· 221 225 return req; 222 226 } 223 227 224 - /* 225 - * nfs_page_find_head_request - find head request associated with @page 228 + /** 229 + * nfs_folio_find_head_request - find head request associated with a folio 230 + * @folio: pointer to folio 226 231 * 227 232 * returns matching head request with reference held, or NULL if not found. 228 233 */ 229 - static struct nfs_page *nfs_page_find_head_request(struct page *page) 234 + static struct nfs_page *nfs_folio_find_head_request(struct folio *folio) 230 235 { 231 236 struct nfs_page *req; 232 237 233 - req = nfs_page_find_private_request(page); 238 + req = nfs_folio_find_private_request(folio); 234 239 if (!req) 235 - req = nfs_page_find_swap_request(page); 240 + req = nfs_folio_find_swap_request(folio); 236 241 return req; 237 242 } 238 243 239 - static struct nfs_page *nfs_find_and_lock_page_request(struct page *page) 244 + static struct nfs_page *nfs_folio_find_and_lock_request(struct folio *folio) 240 245 { 241 - struct inode *inode = page_file_mapping(page)->host; 246 + struct inode *inode = folio_file_mapping(folio)->host; 242 247 struct nfs_page *req, *head; 243 248 int ret; 244 249 245 250 for (;;) { 246 - req = nfs_page_find_head_request(page); 251 + req = nfs_folio_find_head_request(folio); 247 252 if (!req) 248 253 return req; 249 254 head = nfs_page_group_lock_head(req); ··· 258 261 return ERR_PTR(ret); 259 262 } 260 263 /* Ensure that nobody removed the request before we locked it */ 261 - if (head == nfs_page_private_request(page)) 264 + if (head == nfs_folio_private_request(folio)) 262 265 break; 263 - if (PageSwapCache(page)) 266 + if (folio_test_swapcache(folio)) 264 267 break; 265 268 nfs_unlock_and_release_request(head); 266 269 } ··· 268 271 } 269 272 270 273 /* Adjust the file length if we're writing beyond the end */ 271 - static void nfs_grow_file(struct page *page, unsigned int offset, unsigned int count) 274 + static void nfs_grow_file(struct folio *folio, unsigned int offset, 275 + unsigned int count) 272 276 { 273 - struct inode *inode = page_file_mapping(page)->host; 277 + struct inode *inode = folio_file_mapping(folio)->host; 274 278 loff_t end, i_size; 275 279 pgoff_t end_index; 276 280 277 281 spin_lock(&inode->i_lock); 278 282 i_size = i_size_read(inode); 279 - end_index = (i_size - 1) >> PAGE_SHIFT; 280 - if (i_size > 0 && page_index(page) < end_index) 283 + end_index = ((i_size - 1) >> folio_shift(folio)) << folio_order(folio); 284 + if (i_size > 0 && folio_index(folio) < end_index) 281 285 goto out; 282 - end = page_file_offset(page) + ((loff_t)offset+count); 286 + end = folio_file_pos(folio) + (loff_t)offset + (loff_t)count; 283 287 if (i_size >= end) 284 288 goto out; 285 289 trace_nfs_size_grow(inode, end); ··· 306 308 spin_unlock(&inode->i_lock); 307 309 } 308 310 309 - static void nfs_mapping_set_error(struct page *page, int error) 311 + static void nfs_mapping_set_error(struct folio *folio, int error) 310 312 { 311 - struct address_space *mapping = page_file_mapping(page); 313 + struct address_space *mapping = folio_file_mapping(folio); 312 314 313 - SetPageError(page); 315 + folio_set_error(folio); 314 316 filemap_set_wb_err(mapping, error); 315 317 if (mapping->host) 316 318 errseq_set(&mapping->host->i_sb->s_wb_err, ··· 357 359 */ 358 360 static bool nfs_page_group_covers_page(struct nfs_page *req) 359 361 { 362 + unsigned int len = nfs_folio_length(nfs_page_to_folio(req)); 360 363 struct nfs_page *tmp; 361 364 unsigned int pos = 0; 362 - unsigned int len = nfs_page_length(req->wb_page); 363 365 364 366 nfs_page_group_lock(req); 365 367 ··· 379 381 */ 380 382 static void nfs_mark_uptodate(struct nfs_page *req) 381 383 { 382 - if (PageUptodate(req->wb_page)) 384 + struct folio *folio = nfs_page_to_folio(req); 385 + 386 + if (folio_test_uptodate(folio)) 383 387 return; 384 388 if (!nfs_page_group_covers_page(req)) 385 389 return; 386 - SetPageUptodate(req->wb_page); 390 + folio_mark_uptodate(folio); 387 391 } 388 392 389 393 static int wb_priority(struct writeback_control *wbc) ··· 407 407 #define NFS_CONGESTION_OFF_THRESH \ 408 408 (NFS_CONGESTION_ON_THRESH - (NFS_CONGESTION_ON_THRESH >> 2)) 409 409 410 - static void nfs_set_page_writeback(struct page *page) 410 + static void nfs_folio_set_writeback(struct folio *folio) 411 411 { 412 - struct inode *inode = page_file_mapping(page)->host; 413 - struct nfs_server *nfss = NFS_SERVER(inode); 414 - int ret = test_set_page_writeback(page); 412 + struct nfs_server *nfss = NFS_SERVER(folio_file_mapping(folio)->host); 415 413 416 - WARN_ON_ONCE(ret != 0); 417 - 418 - if (atomic_long_inc_return(&nfss->writeback) > 419 - NFS_CONGESTION_ON_THRESH) 414 + folio_start_writeback(folio); 415 + if (atomic_long_inc_return(&nfss->writeback) > NFS_CONGESTION_ON_THRESH) 420 416 nfss->write_congested = 1; 421 417 } 422 418 423 - static void nfs_end_page_writeback(struct nfs_page *req) 419 + static void nfs_folio_end_writeback(struct folio *folio) 424 420 { 425 - struct inode *inode = page_file_mapping(req->wb_page)->host; 426 - struct nfs_server *nfss = NFS_SERVER(inode); 427 - bool is_done; 421 + struct nfs_server *nfss = NFS_SERVER(folio_file_mapping(folio)->host); 428 422 429 - is_done = nfs_page_group_sync_on_bit(req, PG_WB_END); 430 - nfs_unlock_request(req); 431 - if (!is_done) 432 - return; 433 - 434 - end_page_writeback(req->wb_page); 435 - if (atomic_long_dec_return(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH) 423 + folio_end_writeback(folio); 424 + if (atomic_long_dec_return(&nfss->writeback) < 425 + NFS_CONGESTION_OFF_THRESH) 436 426 nfss->write_congested = 0; 427 + } 428 + 429 + static void nfs_page_end_writeback(struct nfs_page *req) 430 + { 431 + if (nfs_page_group_sync_on_bit(req, PG_WB_END)) { 432 + nfs_unlock_request(req); 433 + nfs_folio_end_writeback(nfs_page_to_folio(req)); 434 + } else 435 + nfs_unlock_request(req); 437 436 } 438 437 439 438 /* ··· 549 550 550 551 /* 551 552 * nfs_lock_and_join_requests - join all subreqs to the head req 552 - * @page: the page used to lookup the "page group" of nfs_page structures 553 + * @folio: the folio used to lookup the "page group" of nfs_page structures 553 554 * 554 555 * This function joins all sub requests to the head request by first 555 556 * locking all requests in the group, cancelling any pending operations ··· 559 560 * 560 561 * Returns a locked, referenced pointer to the head request - which after 561 562 * this call is guaranteed to be the only request associated with the page. 562 - * Returns NULL if no requests are found for @page, or a ERR_PTR if an 563 + * Returns NULL if no requests are found for @folio, or a ERR_PTR if an 563 564 * error was encountered. 564 565 */ 565 - static struct nfs_page * 566 - nfs_lock_and_join_requests(struct page *page) 566 + static struct nfs_page *nfs_lock_and_join_requests(struct folio *folio) 567 567 { 568 - struct inode *inode = page_file_mapping(page)->host; 568 + struct inode *inode = folio_file_mapping(folio)->host; 569 569 struct nfs_page *head; 570 570 int ret; 571 571 ··· 573 575 * reference to the whole page group - the group will not be destroyed 574 576 * until the head reference is released. 575 577 */ 576 - head = nfs_find_and_lock_page_request(page); 578 + head = nfs_folio_find_and_lock_request(folio); 577 579 if (IS_ERR_OR_NULL(head)) 578 580 return head; 579 581 ··· 591 593 592 594 static void nfs_write_error(struct nfs_page *req, int error) 593 595 { 594 - trace_nfs_write_error(page_file_mapping(req->wb_page)->host, req, 595 - error); 596 - nfs_mapping_set_error(req->wb_page, error); 596 + trace_nfs_write_error(nfs_page_to_inode(req), req, error); 597 + nfs_mapping_set_error(nfs_page_to_folio(req), error); 597 598 nfs_inode_remove_request(req); 598 - nfs_end_page_writeback(req); 599 + nfs_page_end_writeback(req); 599 600 nfs_release_request(req); 600 601 } 601 602 ··· 602 605 * Find an associated nfs write request, and prepare to flush it out 603 606 * May return an error if the user signalled nfs_wait_on_request(). 604 607 */ 605 - static int nfs_page_async_flush(struct page *page, 608 + static int nfs_page_async_flush(struct folio *folio, 606 609 struct writeback_control *wbc, 607 610 struct nfs_pageio_descriptor *pgio) 608 611 { 609 612 struct nfs_page *req; 610 613 int ret = 0; 611 614 612 - req = nfs_lock_and_join_requests(page); 615 + req = nfs_lock_and_join_requests(folio); 613 616 if (!req) 614 617 goto out; 615 618 ret = PTR_ERR(req); 616 619 if (IS_ERR(req)) 617 620 goto out; 618 621 619 - nfs_set_page_writeback(page); 622 + nfs_folio_set_writeback(folio); 620 623 WARN_ON_ONCE(test_bit(PG_CLEAN, &req->wb_flags)); 621 624 622 625 /* If there is a fatal error that covers this write, just exit */ ··· 634 637 goto out_launder; 635 638 if (wbc->sync_mode == WB_SYNC_NONE) 636 639 ret = AOP_WRITEPAGE_ACTIVATE; 637 - redirty_page_for_writepage(wbc, page); 640 + folio_redirty_for_writepage(wbc, folio); 638 641 nfs_redirty_request(req); 639 642 pgio->pg_error = 0; 640 643 } else 641 - nfs_add_stats(page_file_mapping(page)->host, 642 - NFSIOS_WRITEPAGES, 1); 644 + nfs_add_stats(folio_file_mapping(folio)->host, 645 + NFSIOS_WRITEPAGES, 1); 643 646 out: 644 647 return ret; 645 648 out_launder: ··· 647 650 return 0; 648 651 } 649 652 650 - static int nfs_do_writepage(struct page *page, struct writeback_control *wbc, 653 + static int nfs_do_writepage(struct folio *folio, struct writeback_control *wbc, 651 654 struct nfs_pageio_descriptor *pgio) 652 655 { 653 - nfs_pageio_cond_complete(pgio, page_index(page)); 654 - return nfs_page_async_flush(page, wbc, pgio); 656 + nfs_pageio_cond_complete(pgio, folio_index(folio)); 657 + return nfs_page_async_flush(folio, wbc, pgio); 655 658 } 656 659 657 660 /* 658 661 * Write an mmapped page to the server. 659 662 */ 660 - static int nfs_writepage_locked(struct page *page, 663 + static int nfs_writepage_locked(struct folio *folio, 661 664 struct writeback_control *wbc) 662 665 { 663 666 struct nfs_pageio_descriptor pgio; 664 - struct inode *inode = page_file_mapping(page)->host; 667 + struct inode *inode = folio_file_mapping(folio)->host; 665 668 int err; 666 669 667 670 if (wbc->sync_mode == WB_SYNC_NONE && ··· 669 672 return AOP_WRITEPAGE_ACTIVATE; 670 673 671 674 nfs_inc_stats(inode, NFSIOS_VFSWRITEPAGE); 672 - nfs_pageio_init_write(&pgio, inode, 0, 673 - false, &nfs_async_write_completion_ops); 674 - err = nfs_do_writepage(page, wbc, &pgio); 675 + nfs_pageio_init_write(&pgio, inode, 0, false, 676 + &nfs_async_write_completion_ops); 677 + err = nfs_do_writepage(folio, wbc, &pgio); 675 678 pgio.pg_error = 0; 676 679 nfs_pageio_complete(&pgio); 677 680 return err; ··· 679 682 680 683 int nfs_writepage(struct page *page, struct writeback_control *wbc) 681 684 { 685 + struct folio *folio = page_folio(page); 682 686 int ret; 683 687 684 - ret = nfs_writepage_locked(page, wbc); 688 + ret = nfs_writepage_locked(folio, wbc); 685 689 if (ret != AOP_WRITEPAGE_ACTIVATE) 686 690 unlock_page(page); 687 691 return ret; 688 692 } 689 693 690 - static int nfs_writepages_callback(struct page *page, struct writeback_control *wbc, void *data) 694 + static int nfs_writepages_callback(struct page *page, 695 + struct writeback_control *wbc, void *data) 691 696 { 697 + struct folio *folio = page_folio(page); 692 698 int ret; 693 699 694 - ret = nfs_do_writepage(page, wbc, data); 700 + ret = nfs_do_writepage(folio, wbc, data); 695 701 if (ret != AOP_WRITEPAGE_ACTIVATE) 696 702 unlock_page(page); 697 703 return ret; ··· 750 750 /* 751 751 * Insert a write request into an inode 752 752 */ 753 - static void nfs_inode_add_request(struct inode *inode, struct nfs_page *req) 753 + static void nfs_inode_add_request(struct nfs_page *req) 754 754 { 755 - struct address_space *mapping = page_file_mapping(req->wb_page); 756 - struct nfs_inode *nfsi = NFS_I(inode); 755 + struct folio *folio = nfs_page_to_folio(req); 756 + struct address_space *mapping = folio_file_mapping(folio); 757 + struct nfs_inode *nfsi = NFS_I(mapping->host); 757 758 758 759 WARN_ON_ONCE(req->wb_this_page != req); 759 760 ··· 766 765 * with invalidate/truncate. 767 766 */ 768 767 spin_lock(&mapping->private_lock); 769 - if (likely(!PageSwapCache(req->wb_page))) { 768 + if (likely(!folio_test_swapcache(folio))) { 770 769 set_bit(PG_MAPPED, &req->wb_flags); 771 - SetPagePrivate(req->wb_page); 772 - set_page_private(req->wb_page, (unsigned long)req); 770 + folio_set_private(folio); 771 + folio->private = req; 773 772 } 774 773 spin_unlock(&mapping->private_lock); 775 774 atomic_long_inc(&nfsi->nrequests); ··· 786 785 */ 787 786 static void nfs_inode_remove_request(struct nfs_page *req) 788 787 { 789 - struct address_space *mapping = page_file_mapping(req->wb_page); 790 - struct inode *inode = mapping->host; 791 - struct nfs_inode *nfsi = NFS_I(inode); 792 - struct nfs_page *head; 793 - 794 788 if (nfs_page_group_sync_on_bit(req, PG_REMOVE)) { 795 - head = req->wb_head; 789 + struct folio *folio = nfs_page_to_folio(req->wb_head); 790 + struct address_space *mapping = folio_file_mapping(folio); 796 791 797 792 spin_lock(&mapping->private_lock); 798 - if (likely(head->wb_page && !PageSwapCache(head->wb_page))) { 799 - set_page_private(head->wb_page, 0); 800 - ClearPagePrivate(head->wb_page); 801 - clear_bit(PG_MAPPED, &head->wb_flags); 793 + if (likely(folio && !folio_test_swapcache(folio))) { 794 + folio->private = NULL; 795 + folio_clear_private(folio); 796 + clear_bit(PG_MAPPED, &req->wb_head->wb_flags); 802 797 } 803 798 spin_unlock(&mapping->private_lock); 804 799 } 805 800 806 801 if (test_and_clear_bit(PG_INODE_REF, &req->wb_flags)) { 807 802 nfs_release_request(req); 808 - atomic_long_dec(&nfsi->nrequests); 803 + atomic_long_dec(&NFS_I(nfs_page_to_inode(req))->nrequests); 809 804 } 810 805 } 811 806 812 - static void 813 - nfs_mark_request_dirty(struct nfs_page *req) 807 + static void nfs_mark_request_dirty(struct nfs_page *req) 814 808 { 815 - if (req->wb_page) 816 - __set_page_dirty_nobuffers(req->wb_page); 809 + struct folio *folio = nfs_page_to_folio(req); 810 + if (folio) 811 + filemap_dirty_folio(folio_mapping(folio), folio); 817 812 } 818 813 819 814 /* 820 815 * nfs_page_search_commits_for_head_request_locked 821 816 * 822 - * Search through commit lists on @inode for the head request for @page. 817 + * Search through commit lists on @inode for the head request for @folio. 823 818 * Must be called while holding the inode (which is cinfo) lock. 824 819 * 825 820 * Returns the head request if found, or NULL if not found. 826 821 */ 827 822 static struct nfs_page * 828 823 nfs_page_search_commits_for_head_request_locked(struct nfs_inode *nfsi, 829 - struct page *page) 824 + struct folio *folio) 830 825 { 831 826 struct nfs_page *freq, *t; 832 827 struct nfs_commit_info cinfo; ··· 831 834 nfs_init_cinfo_from_inode(&cinfo, inode); 832 835 833 836 /* search through pnfs commit lists */ 834 - freq = pnfs_search_commit_reqs(inode, &cinfo, page); 837 + freq = pnfs_search_commit_reqs(inode, &cinfo, folio); 835 838 if (freq) 836 839 return freq->wb_head; 837 840 838 841 /* Linearly search the commit list for the correct request */ 839 842 list_for_each_entry_safe(freq, t, &cinfo.mds->list, wb_list) { 840 - if (freq->wb_page == page) 843 + if (nfs_page_to_folio(freq) == folio) 841 844 return freq->wb_head; 842 845 } 843 846 ··· 885 888 mutex_lock(&NFS_I(cinfo->inode)->commit_mutex); 886 889 nfs_request_add_commit_list_locked(req, &cinfo->mds->list, cinfo); 887 890 mutex_unlock(&NFS_I(cinfo->inode)->commit_mutex); 888 - if (req->wb_page) 889 - nfs_mark_page_unstable(req->wb_page, cinfo); 891 + nfs_folio_mark_unstable(nfs_page_to_folio(req), cinfo); 890 892 } 891 893 EXPORT_SYMBOL_GPL(nfs_request_add_commit_list); 892 894 ··· 944 948 nfs_request_add_commit_list(req, cinfo); 945 949 } 946 950 947 - static void 948 - nfs_clear_page_commit(struct page *page) 951 + static void nfs_folio_clear_commit(struct folio *folio) 949 952 { 950 - dec_node_page_state(page, NR_WRITEBACK); 951 - dec_wb_stat(&inode_to_bdi(page_file_mapping(page)->host)->wb, 952 - WB_WRITEBACK); 953 + if (folio) { 954 + long nr = folio_nr_pages(folio); 955 + 956 + node_stat_mod_folio(folio, NR_WRITEBACK, -nr); 957 + wb_stat_mod(&inode_to_bdi(folio_file_mapping(folio)->host)->wb, 958 + WB_WRITEBACK, -nr); 959 + } 953 960 } 954 961 955 962 /* Called holding the request lock on @req */ ··· 970 971 nfs_request_remove_commit_list(req, &cinfo); 971 972 } 972 973 mutex_unlock(&NFS_I(inode)->commit_mutex); 973 - nfs_clear_page_commit(req->wb_page); 974 + nfs_folio_clear_commit(nfs_page_to_folio(req)); 974 975 } 975 976 } 976 977 ··· 1002 1003 if (test_bit(NFS_IOHDR_ERROR, &hdr->flags) && 1003 1004 (hdr->good_bytes < bytes)) { 1004 1005 trace_nfs_comp_error(hdr->inode, req, hdr->error); 1005 - nfs_mapping_set_error(req->wb_page, hdr->error); 1006 + nfs_mapping_set_error(nfs_page_to_folio(req), 1007 + hdr->error); 1006 1008 goto remove_req; 1007 1009 } 1008 1010 if (nfs_write_need_commit(hdr)) { ··· 1017 1017 remove_req: 1018 1018 nfs_inode_remove_request(req); 1019 1019 next: 1020 - nfs_end_page_writeback(req); 1020 + nfs_page_end_writeback(req); 1021 1021 nfs_release_request(req); 1022 1022 } 1023 1023 out: ··· 1093 1093 * If the attempt fails, then the existing request is flushed out 1094 1094 * to disk. 1095 1095 */ 1096 - static struct nfs_page *nfs_try_to_update_request(struct inode *inode, 1097 - struct page *page, 1098 - unsigned int offset, 1099 - unsigned int bytes) 1096 + static struct nfs_page *nfs_try_to_update_request(struct folio *folio, 1097 + unsigned int offset, 1098 + unsigned int bytes) 1100 1099 { 1101 1100 struct nfs_page *req; 1102 1101 unsigned int rqend; ··· 1104 1105 1105 1106 end = offset + bytes; 1106 1107 1107 - req = nfs_lock_and_join_requests(page); 1108 + req = nfs_lock_and_join_requests(folio); 1108 1109 if (IS_ERR_OR_NULL(req)) 1109 1110 return req; 1110 1111 ··· 1137 1138 */ 1138 1139 nfs_mark_request_dirty(req); 1139 1140 nfs_unlock_and_release_request(req); 1140 - error = nfs_wb_page(inode, page); 1141 + error = nfs_wb_folio(folio_file_mapping(folio)->host, folio); 1141 1142 return (error < 0) ? ERR_PTR(error) : NULL; 1142 1143 } 1143 1144 ··· 1148 1149 * if we have to add a new request. Also assumes that the caller has 1149 1150 * already called nfs_flush_incompatible() if necessary. 1150 1151 */ 1151 - static struct nfs_page * nfs_setup_write_request(struct nfs_open_context* ctx, 1152 - struct page *page, unsigned int offset, unsigned int bytes) 1152 + static struct nfs_page *nfs_setup_write_request(struct nfs_open_context *ctx, 1153 + struct folio *folio, 1154 + unsigned int offset, 1155 + unsigned int bytes) 1153 1156 { 1154 - struct inode *inode = page_file_mapping(page)->host; 1155 - struct nfs_page *req; 1157 + struct nfs_page *req; 1156 1158 1157 - req = nfs_try_to_update_request(inode, page, offset, bytes); 1159 + req = nfs_try_to_update_request(folio, offset, bytes); 1158 1160 if (req != NULL) 1159 1161 goto out; 1160 - req = nfs_create_request(ctx, page, offset, bytes); 1162 + req = nfs_page_create_from_folio(ctx, folio, offset, bytes); 1161 1163 if (IS_ERR(req)) 1162 1164 goto out; 1163 - nfs_inode_add_request(inode, req); 1165 + nfs_inode_add_request(req); 1164 1166 out: 1165 1167 return req; 1166 1168 } 1167 1169 1168 - static int nfs_writepage_setup(struct nfs_open_context *ctx, struct page *page, 1169 - unsigned int offset, unsigned int count) 1170 + static int nfs_writepage_setup(struct nfs_open_context *ctx, 1171 + struct folio *folio, unsigned int offset, 1172 + unsigned int count) 1170 1173 { 1171 - struct nfs_page *req; 1174 + struct nfs_page *req; 1172 1175 1173 - req = nfs_setup_write_request(ctx, page, offset, count); 1176 + req = nfs_setup_write_request(ctx, folio, offset, count); 1174 1177 if (IS_ERR(req)) 1175 1178 return PTR_ERR(req); 1176 1179 /* Update file length */ 1177 - nfs_grow_file(page, offset, count); 1180 + nfs_grow_file(folio, offset, count); 1178 1181 nfs_mark_uptodate(req); 1179 1182 nfs_mark_request_dirty(req); 1180 1183 nfs_unlock_and_release_request(req); 1181 1184 return 0; 1182 1185 } 1183 1186 1184 - int nfs_flush_incompatible(struct file *file, struct page *page) 1187 + int nfs_flush_incompatible(struct file *file, struct folio *folio) 1185 1188 { 1186 1189 struct nfs_open_context *ctx = nfs_file_open_context(file); 1187 1190 struct nfs_lock_context *l_ctx; ··· 1199 1198 * dropped page. 1200 1199 */ 1201 1200 do { 1202 - req = nfs_page_find_head_request(page); 1201 + req = nfs_folio_find_head_request(folio); 1203 1202 if (req == NULL) 1204 1203 return 0; 1205 1204 l_ctx = req->wb_lock_context; 1206 - do_flush = req->wb_page != page || 1207 - !nfs_match_open_context(nfs_req_openctx(req), ctx); 1205 + do_flush = nfs_page_to_folio(req) != folio || 1206 + !nfs_match_open_context(nfs_req_openctx(req), ctx); 1208 1207 if (l_ctx && flctx && 1209 1208 !(list_empty_careful(&flctx->flc_posix) && 1210 1209 list_empty_careful(&flctx->flc_flock))) { ··· 1213 1212 nfs_release_request(req); 1214 1213 if (!do_flush) 1215 1214 return 0; 1216 - status = nfs_wb_page(page_file_mapping(page)->host, page); 1215 + status = nfs_wb_folio(folio_file_mapping(folio)->host, folio); 1217 1216 } while (status == 0); 1218 1217 return status; 1219 1218 } ··· 1285 1284 * the PageUptodate() flag. In this case, we will need to turn off 1286 1285 * write optimisations that depend on the page contents being correct. 1287 1286 */ 1288 - static bool nfs_write_pageuptodate(struct page *page, struct inode *inode, 1289 - unsigned int pagelen) 1287 + static bool nfs_folio_write_uptodate(struct folio *folio, unsigned int pagelen) 1290 1288 { 1289 + struct inode *inode = folio_file_mapping(folio)->host; 1291 1290 struct nfs_inode *nfsi = NFS_I(inode); 1292 1291 1293 1292 if (nfs_have_delegated_attributes(inode)) ··· 1301 1300 out: 1302 1301 if (nfsi->cache_validity & NFS_INO_INVALID_DATA && pagelen != 0) 1303 1302 return false; 1304 - return PageUptodate(page) != 0; 1303 + return folio_test_uptodate(folio) != 0; 1305 1304 } 1306 1305 1307 1306 static bool ··· 1319 1318 * If the file is opened for synchronous writes then we can just skip the rest 1320 1319 * of the checks. 1321 1320 */ 1322 - static int nfs_can_extend_write(struct file *file, struct page *page, 1323 - struct inode *inode, unsigned int pagelen) 1321 + static int nfs_can_extend_write(struct file *file, struct folio *folio, 1322 + unsigned int pagelen) 1324 1323 { 1325 - int ret; 1324 + struct inode *inode = file_inode(file); 1326 1325 struct file_lock_context *flctx = locks_inode_context(inode); 1327 1326 struct file_lock *fl; 1327 + int ret; 1328 1328 1329 1329 if (file->f_flags & O_DSYNC) 1330 1330 return 0; 1331 - if (!nfs_write_pageuptodate(page, inode, pagelen)) 1331 + if (!nfs_folio_write_uptodate(folio, pagelen)) 1332 1332 return 0; 1333 1333 if (NFS_PROTO(inode)->have_delegation(inode, FMODE_WRITE)) 1334 1334 return 1; ··· 1361 1359 * XXX: Keep an eye on generic_file_read to make sure it doesn't do bad 1362 1360 * things with a page scheduled for an RPC call (e.g. invalidate it). 1363 1361 */ 1364 - int nfs_updatepage(struct file *file, struct page *page, 1365 - unsigned int offset, unsigned int count) 1362 + int nfs_update_folio(struct file *file, struct folio *folio, 1363 + unsigned int offset, unsigned int count) 1366 1364 { 1367 1365 struct nfs_open_context *ctx = nfs_file_open_context(file); 1368 - struct address_space *mapping = page_file_mapping(page); 1369 - struct inode *inode = mapping->host; 1370 - unsigned int pagelen = nfs_page_length(page); 1366 + struct address_space *mapping = folio_file_mapping(folio); 1367 + struct inode *inode = mapping->host; 1368 + unsigned int pagelen = nfs_folio_length(folio); 1371 1369 int status = 0; 1372 1370 1373 1371 nfs_inc_stats(inode, NFSIOS_VFSUPDATEPAGE); 1374 1372 1375 - dprintk("NFS: nfs_updatepage(%pD2 %d@%lld)\n", 1376 - file, count, (long long)(page_file_offset(page) + offset)); 1373 + dprintk("NFS: nfs_update_folio(%pD2 %d@%lld)\n", file, count, 1374 + (long long)(folio_file_pos(folio) + offset)); 1377 1375 1378 1376 if (!count) 1379 1377 goto out; 1380 1378 1381 - if (nfs_can_extend_write(file, page, inode, pagelen)) { 1379 + if (nfs_can_extend_write(file, folio, pagelen)) { 1382 1380 count = max(count + offset, pagelen); 1383 1381 offset = 0; 1384 1382 } 1385 1383 1386 - status = nfs_writepage_setup(ctx, page, offset, count); 1384 + status = nfs_writepage_setup(ctx, folio, offset, count); 1387 1385 if (status < 0) 1388 1386 nfs_set_pageerror(mapping); 1389 1387 out: 1390 - dprintk("NFS: nfs_updatepage returns %d (isize %lld)\n", 1388 + dprintk("NFS: nfs_update_folio returns %d (isize %lld)\n", 1391 1389 status, (long long)i_size_read(inode)); 1392 1390 return status; 1393 1391 } ··· 1423 1421 */ 1424 1422 static void nfs_redirty_request(struct nfs_page *req) 1425 1423 { 1426 - struct nfs_inode *nfsi = NFS_I(page_file_mapping(req->wb_page)->host); 1424 + struct nfs_inode *nfsi = NFS_I(nfs_page_to_inode(req)); 1427 1425 1428 1426 /* Bump the transmission count */ 1429 1427 req->wb_nio++; 1430 1428 nfs_mark_request_dirty(req); 1431 1429 atomic_long_inc(&nfsi->redirtied_pages); 1432 - nfs_end_page_writeback(req); 1430 + nfs_page_end_writeback(req); 1433 1431 nfs_release_request(req); 1434 1432 } 1435 1433 ··· 1787 1785 req = nfs_list_entry(page_list->next); 1788 1786 nfs_list_remove_request(req); 1789 1787 nfs_mark_request_commit(req, lseg, cinfo, ds_commit_idx); 1790 - if (!cinfo->dreq) 1791 - nfs_clear_page_commit(req->wb_page); 1788 + nfs_folio_clear_commit(nfs_page_to_folio(req)); 1792 1789 nfs_unlock_and_release_request(req); 1793 1790 } 1794 1791 } 1795 1792 EXPORT_SYMBOL_GPL(nfs_retry_commit); 1796 1793 1797 - static void 1798 - nfs_commit_resched_write(struct nfs_commit_info *cinfo, 1799 - struct nfs_page *req) 1794 + static void nfs_commit_resched_write(struct nfs_commit_info *cinfo, 1795 + struct nfs_page *req) 1800 1796 { 1801 - __set_page_dirty_nobuffers(req->wb_page); 1797 + struct folio *folio = nfs_page_to_folio(req); 1798 + 1799 + filemap_dirty_folio(folio_mapping(folio), folio); 1802 1800 } 1803 1801 1804 1802 /* ··· 1849 1847 int status = data->task.tk_status; 1850 1848 struct nfs_commit_info cinfo; 1851 1849 struct nfs_server *nfss; 1850 + struct folio *folio; 1852 1851 1853 1852 while (!list_empty(&data->pages)) { 1854 1853 req = nfs_list_entry(data->pages.next); 1855 1854 nfs_list_remove_request(req); 1856 - if (req->wb_page) 1857 - nfs_clear_page_commit(req->wb_page); 1855 + folio = nfs_page_to_folio(req); 1856 + nfs_folio_clear_commit(folio); 1858 1857 1859 1858 dprintk("NFS: commit (%s/%llu %d@%lld)", 1860 1859 nfs_req_openctx(req)->dentry->d_sb->s_id, ··· 1863 1860 req->wb_bytes, 1864 1861 (long long)req_offset(req)); 1865 1862 if (status < 0) { 1866 - if (req->wb_page) { 1863 + if (folio) { 1867 1864 trace_nfs_commit_error(data->inode, req, 1868 1865 status); 1869 - nfs_mapping_set_error(req->wb_page, status); 1866 + nfs_mapping_set_error(folio, status); 1870 1867 nfs_inode_remove_request(req); 1871 1868 } 1872 1869 dprintk_cont(", error = %d\n", status); ··· 1877 1874 * returned by the server against all stored verfs. */ 1878 1875 if (nfs_write_match_verf(verf, req)) { 1879 1876 /* We have a match */ 1880 - if (req->wb_page) 1877 + if (folio) 1881 1878 nfs_inode_remove_request(req); 1882 1879 dprintk_cont(" OK\n"); 1883 1880 goto next; ··· 2058 2055 2059 2056 /* blocking call to cancel all requests and join to a single (head) 2060 2057 * request */ 2061 - req = nfs_lock_and_join_requests(&folio->page); 2058 + req = nfs_lock_and_join_requests(folio); 2062 2059 2063 2060 if (IS_ERR(req)) { 2064 2061 ret = PTR_ERR(req); ··· 2074 2071 return ret; 2075 2072 } 2076 2073 2077 - /* 2078 - * Write back all requests on one page - we do this before reading it. 2074 + /** 2075 + * nfs_wb_folio - Write back all requests on one page 2076 + * @inode: pointer to page 2077 + * @folio: pointer to folio 2078 + * 2079 + * Assumes that the folio has been locked by the caller, and will 2080 + * not unlock it. 2079 2081 */ 2080 - int nfs_wb_page(struct inode *inode, struct page *page) 2082 + int nfs_wb_folio(struct inode *inode, struct folio *folio) 2081 2083 { 2082 - loff_t range_start = page_file_offset(page); 2083 - loff_t range_end = range_start + (loff_t)(PAGE_SIZE - 1); 2084 + loff_t range_start = folio_file_pos(folio); 2085 + loff_t range_end = range_start + (loff_t)folio_size(folio) - 1; 2084 2086 struct writeback_control wbc = { 2085 2087 .sync_mode = WB_SYNC_ALL, 2086 2088 .nr_to_write = 0, ··· 2094 2086 }; 2095 2087 int ret; 2096 2088 2097 - trace_nfs_writeback_page_enter(inode); 2089 + trace_nfs_writeback_folio(inode, folio); 2098 2090 2099 2091 for (;;) { 2100 - wait_on_page_writeback(page); 2101 - if (clear_page_dirty_for_io(page)) { 2102 - ret = nfs_writepage_locked(page, &wbc); 2092 + folio_wait_writeback(folio); 2093 + if (folio_clear_dirty_for_io(folio)) { 2094 + ret = nfs_writepage_locked(folio, &wbc); 2103 2095 if (ret < 0) 2104 2096 goto out_error; 2105 2097 continue; 2106 2098 } 2107 2099 ret = 0; 2108 - if (!PagePrivate(page)) 2100 + if (!folio_test_private(folio)) 2109 2101 break; 2110 2102 ret = nfs_commit_inode(inode, FLUSH_SYNC); 2111 2103 if (ret < 0) 2112 2104 goto out_error; 2113 2105 } 2114 2106 out_error: 2115 - trace_nfs_writeback_page_exit(inode, ret); 2107 + trace_nfs_writeback_folio_done(inode, folio, ret); 2116 2108 return ret; 2117 2109 } 2118 2110
+4 -3
include/linux/nfs_fs.h
··· 569 569 extern int nfs_congestion_kb; 570 570 extern int nfs_writepage(struct page *page, struct writeback_control *wbc); 571 571 extern int nfs_writepages(struct address_space *, struct writeback_control *); 572 - extern int nfs_flush_incompatible(struct file *file, struct page *page); 573 - extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int); 572 + extern int nfs_flush_incompatible(struct file *file, struct folio *folio); 573 + extern int nfs_update_folio(struct file *file, struct folio *folio, 574 + unsigned int offset, unsigned int count); 574 575 575 576 /* 576 577 * Try to write back everything synchronously (but check the ··· 579 578 */ 580 579 extern int nfs_sync_inode(struct inode *inode); 581 580 extern int nfs_wb_all(struct inode *inode); 582 - extern int nfs_wb_page(struct inode *inode, struct page *page); 581 + extern int nfs_wb_folio(struct inode *inode, struct folio *folio); 583 582 int nfs_wb_folio_cancel(struct inode *inode, struct folio *folio); 584 583 extern int nfs_commit_inode(struct inode *, int); 585 584 extern struct nfs_commit_data *nfs_commitdata_alloc(void);
+74 -5
include/linux/nfs_page.h
··· 25 25 enum { 26 26 PG_BUSY = 0, /* nfs_{un}lock_request */ 27 27 PG_MAPPED, /* page private set for buffered io */ 28 + PG_FOLIO, /* Tracking a folio (unset for O_DIRECT) */ 28 29 PG_CLEAN, /* write succeeded */ 29 30 PG_COMMIT_TO_DS, /* used by pnfs layouts */ 30 31 PG_INODE_REF, /* extra ref held by inode when in writeback */ ··· 42 41 struct nfs_inode; 43 42 struct nfs_page { 44 43 struct list_head wb_list; /* Defines state of page: */ 45 - struct page *wb_page; /* page to read in/write out */ 44 + union { 45 + struct page *wb_page; /* page to read in/write out */ 46 + struct folio *wb_folio; 47 + }; 46 48 struct nfs_lock_context *wb_lock_context; /* lock context info */ 47 49 pgoff_t wb_index; /* Offset >> PAGE_SHIFT */ 48 50 unsigned int wb_offset, /* Offset & ~PAGE_MASK */ ··· 121 117 122 118 #define NFS_WBACK_BUSY(req) (test_bit(PG_BUSY,&(req)->wb_flags)) 123 119 124 - extern struct nfs_page *nfs_create_request(struct nfs_open_context *ctx, 125 - struct page *page, 126 - unsigned int offset, 127 - unsigned int count); 120 + extern struct nfs_page *nfs_page_create_from_page(struct nfs_open_context *ctx, 121 + struct page *page, 122 + unsigned int pgbase, 123 + loff_t offset, 124 + unsigned int count); 125 + extern struct nfs_page *nfs_page_create_from_folio(struct nfs_open_context *ctx, 126 + struct folio *folio, 127 + unsigned int offset, 128 + unsigned int count); 128 129 extern void nfs_release_request(struct nfs_page *); 129 130 130 131 ··· 161 152 extern int nfs_page_set_headlock(struct nfs_page *req); 162 153 extern void nfs_page_clear_headlock(struct nfs_page *req); 163 154 extern bool nfs_async_iocounter_wait(struct rpc_task *, struct nfs_lock_context *); 155 + 156 + /** 157 + * nfs_page_to_folio - Retrieve a struct folio for the request 158 + * @req: pointer to a struct nfs_page 159 + * 160 + * If a folio was assigned to @req, then return it, otherwise return NULL. 161 + */ 162 + static inline struct folio *nfs_page_to_folio(const struct nfs_page *req) 163 + { 164 + if (test_bit(PG_FOLIO, &req->wb_flags)) 165 + return req->wb_folio; 166 + return NULL; 167 + } 168 + 169 + /** 170 + * nfs_page_to_page - Retrieve a struct page for the request 171 + * @req: pointer to a struct nfs_page 172 + * @pgbase: folio byte offset 173 + * 174 + * Return the page containing the byte that is at offset @pgbase relative 175 + * to the start of the folio. 176 + * Note: The request starts at offset @req->wb_pgbase. 177 + */ 178 + static inline struct page *nfs_page_to_page(const struct nfs_page *req, 179 + size_t pgbase) 180 + { 181 + struct folio *folio = nfs_page_to_folio(req); 182 + 183 + if (folio == NULL) 184 + return req->wb_page; 185 + return folio_page(folio, pgbase >> PAGE_SHIFT); 186 + } 187 + 188 + /** 189 + * nfs_page_to_inode - Retrieve an inode for the request 190 + * @req: pointer to a struct nfs_page 191 + */ 192 + static inline struct inode *nfs_page_to_inode(const struct nfs_page *req) 193 + { 194 + struct folio *folio = nfs_page_to_folio(req); 195 + 196 + if (folio == NULL) 197 + return page_file_mapping(req->wb_page)->host; 198 + return folio_file_mapping(folio)->host; 199 + } 200 + 201 + /** 202 + * nfs_page_max_length - Retrieve the maximum possible length for a request 203 + * @req: pointer to a struct nfs_page 204 + * 205 + * Returns the maximum possible length of a request 206 + */ 207 + static inline size_t nfs_page_max_length(const struct nfs_page *req) 208 + { 209 + struct folio *folio = nfs_page_to_folio(req); 210 + 211 + if (folio == NULL) 212 + return PAGE_SIZE; 213 + return folio_size(folio); 214 + } 164 215 165 216 /* 166 217 * Lock the page of an asynchronous request
+2
net/sunrpc/clnt.c
··· 3350 3350 void 3351 3351 rpc_clnt_swap_deactivate(struct rpc_clnt *clnt) 3352 3352 { 3353 + while (clnt != clnt->cl_parent) 3354 + clnt = clnt->cl_parent; 3353 3355 if (atomic_dec_if_positive(&clnt->cl_swapper) == 0) 3354 3356 rpc_clnt_iterate_for_each_xprt(clnt, 3355 3357 rpc_clnt_swap_deactivate_callback, NULL);
+4 -4
net/sunrpc/sysfs.c
··· 36 36 return &net_ns_type_operations; 37 37 } 38 38 39 - static struct kobj_type rpc_sysfs_object_type = { 39 + static const struct kobj_type rpc_sysfs_object_type = { 40 40 .release = rpc_sysfs_object_release, 41 41 .sysfs_ops = &kobj_sysfs_ops, 42 42 .child_ns_type = rpc_sysfs_object_child_ns_type, ··· 427 427 }; 428 428 ATTRIBUTE_GROUPS(rpc_sysfs_xprt_switch); 429 429 430 - static struct kobj_type rpc_sysfs_client_type = { 430 + static const struct kobj_type rpc_sysfs_client_type = { 431 431 .release = rpc_sysfs_client_release, 432 432 .sysfs_ops = &kobj_sysfs_ops, 433 433 .namespace = rpc_sysfs_client_namespace, 434 434 }; 435 435 436 - static struct kobj_type rpc_sysfs_xprt_switch_type = { 436 + static const struct kobj_type rpc_sysfs_xprt_switch_type = { 437 437 .release = rpc_sysfs_xprt_switch_release, 438 438 .default_groups = rpc_sysfs_xprt_switch_groups, 439 439 .sysfs_ops = &kobj_sysfs_ops, 440 440 .namespace = rpc_sysfs_xprt_switch_namespace, 441 441 }; 442 442 443 - static struct kobj_type rpc_sysfs_xprt_type = { 443 + static const struct kobj_type rpc_sysfs_xprt_type = { 444 444 .release = rpc_sysfs_xprt_release, 445 445 .default_groups = rpc_sysfs_xprt_groups, 446 446 .sysfs_ops = &kobj_sysfs_ops,