1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * linux/fs/nfs/pagelist.c 4 * 5 * A set of helper functions for managing NFS read and write requests. 6 * The main purpose of these routines is to provide support for the 7 * coalescing of several requests into a single RPC call. 8 * 9 * Copyright 2000, 2001 (c) Trond Myklebust <trond.myklebust@fys.uio.no> 10 * 11 */ 12 13 #include <linux/slab.h> 14 #include <linux/file.h> 15 #include <linux/sched.h> 16 #include <linux/sunrpc/clnt.h> 17 #include <linux/nfs.h> 18 #include <linux/nfs3.h> 19 #include <linux/nfs4.h> 20 #include <linux/nfs_fs.h> 21 #include <linux/nfs_page.h> 22 #include <linux/nfs_mount.h> 23 #include <linux/export.h> 24 25 #include "internal.h" 26 #include "pnfs.h" 27 #include "nfstrace.h" 28 29 #define NFSDBG_FACILITY NFSDBG_PAGECACHE 30 31 static struct kmem_cache *nfs_page_cachep; 32 static const struct rpc_call_ops nfs_pgio_common_ops; 33 34 static struct nfs_pgio_mirror * 35 nfs_pgio_get_mirror(struct nfs_pageio_descriptor *desc, u32 idx) 36 { 37 if (desc->pg_ops->pg_get_mirror) 38 return desc->pg_ops->pg_get_mirror(desc, idx); 39 return &desc->pg_mirrors[0]; 40 } 41 42 struct nfs_pgio_mirror * 43 nfs_pgio_current_mirror(struct nfs_pageio_descriptor *desc) 44 { 45 return nfs_pgio_get_mirror(desc, desc->pg_mirror_idx); 46 } 47 EXPORT_SYMBOL_GPL(nfs_pgio_current_mirror); 48 49 static u32 50 nfs_pgio_set_current_mirror(struct nfs_pageio_descriptor *desc, u32 idx) 51 { 52 if (desc->pg_ops->pg_set_mirror) 53 return desc->pg_ops->pg_set_mirror(desc, idx); 54 return desc->pg_mirror_idx; 55 } 56 57 void nfs_pgheader_init(struct nfs_pageio_descriptor *desc, 58 struct nfs_pgio_header *hdr, 59 void (*release)(struct nfs_pgio_header *hdr)) 60 { 61 struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc); 62 63 64 hdr->req = nfs_list_entry(mirror->pg_list.next); 65 hdr->inode = desc->pg_inode; 66 hdr->cred = nfs_req_openctx(hdr->req)->cred; 67 hdr->io_start = req_offset(hdr->req); 68 hdr->good_bytes = mirror->pg_count; 69 hdr->io_completion = desc->pg_io_completion; 70 hdr->dreq = desc->pg_dreq; 71 hdr->release = release; 72 hdr->completion_ops = desc->pg_completion_ops; 73 if (hdr->completion_ops->init_hdr) 74 hdr->completion_ops->init_hdr(hdr); 75 76 hdr->pgio_mirror_idx = desc->pg_mirror_idx; 77 } 78 EXPORT_SYMBOL_GPL(nfs_pgheader_init); 79 80 void nfs_set_pgio_error(struct nfs_pgio_header *hdr, int error, loff_t pos) 81 { 82 unsigned int new = pos - hdr->io_start; 83 84 trace_nfs_pgio_error(hdr, error, pos); 85 if (hdr->good_bytes > new) { 86 hdr->good_bytes = new; 87 clear_bit(NFS_IOHDR_EOF, &hdr->flags); 88 if (!test_and_set_bit(NFS_IOHDR_ERROR, &hdr->flags)) 89 hdr->error = error; 90 } 91 } 92 93 static inline struct nfs_page * 94 nfs_page_alloc(void) 95 { 96 struct nfs_page *p = kmem_cache_zalloc(nfs_page_cachep, GFP_KERNEL); 97 if (p) 98 INIT_LIST_HEAD(&p->wb_list); 99 return p; 100 } 101 102 static inline void 103 nfs_page_free(struct nfs_page *p) 104 { 105 kmem_cache_free(nfs_page_cachep, p); 106 } 107 108 /** 109 * nfs_iocounter_wait - wait for i/o to complete 110 * @l_ctx: nfs_lock_context with io_counter to use 111 * 112 * returns -ERESTARTSYS if interrupted by a fatal signal. 113 * Otherwise returns 0 once the io_count hits 0. 114 */ 115 int 116 nfs_iocounter_wait(struct nfs_lock_context *l_ctx) 117 { 118 return wait_var_event_killable(&l_ctx->io_count, 119 !atomic_read(&l_ctx->io_count)); 120 } 121 122 /** 123 * nfs_async_iocounter_wait - wait on a rpc_waitqueue for I/O 124 * to complete 125 * @task: the rpc_task that should wait 126 * @l_ctx: nfs_lock_context with io_counter to check 127 * 128 * Returns true if there is outstanding I/O to wait on and the 129 * task has been put to sleep. 130 */ 131 bool 132 nfs_async_iocounter_wait(struct rpc_task *task, struct nfs_lock_context *l_ctx) 133 { 134 struct inode *inode = d_inode(l_ctx->open_context->dentry); 135 bool ret = false; 136 137 if (atomic_read(&l_ctx->io_count) > 0) { 138 rpc_sleep_on(&NFS_SERVER(inode)->uoc_rpcwaitq, task, NULL); 139 ret = true; 140 } 141 142 if (atomic_read(&l_ctx->io_count) == 0) { 143 rpc_wake_up_queued_task(&NFS_SERVER(inode)->uoc_rpcwaitq, task); 144 ret = false; 145 } 146 147 return ret; 148 } 149 EXPORT_SYMBOL_GPL(nfs_async_iocounter_wait); 150 151 /* 152 * nfs_page_lock_head_request - page lock the head of the page group 153 * @req: any member of the page group 154 */ 155 struct nfs_page * 156 nfs_page_group_lock_head(struct nfs_page *req) 157 { 158 struct nfs_page *head = req->wb_head; 159 160 while (!nfs_lock_request(head)) { 161 int ret = nfs_wait_on_request(head); 162 if (ret < 0) 163 return ERR_PTR(ret); 164 } 165 if (head != req) 166 kref_get(&head->wb_kref); 167 return head; 168 } 169 170 /* 171 * nfs_unroll_locks - unlock all newly locked reqs and wait on @req 172 * @head: head request of page group, must be holding head lock 173 * @req: request that couldn't lock and needs to wait on the req bit lock 174 * 175 * This is a helper function for nfs_lock_and_join_requests 176 * returns 0 on success, < 0 on error. 177 */ 178 static void 179 nfs_unroll_locks(struct nfs_page *head, struct nfs_page *req) 180 { 181 struct nfs_page *tmp; 182 183 /* relinquish all the locks successfully grabbed this run */ 184 for (tmp = head->wb_this_page ; tmp != req; tmp = tmp->wb_this_page) { 185 if (!kref_read(&tmp->wb_kref)) 186 continue; 187 nfs_unlock_and_release_request(tmp); 188 } 189 } 190 191 /* 192 * nfs_page_group_lock_subreq - try to lock a subrequest 193 * @head: head request of page group 194 * @subreq: request to lock 195 * 196 * This is a helper function for nfs_lock_and_join_requests which 197 * must be called with the head request and page group both locked. 198 * On error, it returns with the page group unlocked. 199 */ 200 static int 201 nfs_page_group_lock_subreq(struct nfs_page *head, struct nfs_page *subreq) 202 { 203 int ret; 204 205 if (!kref_get_unless_zero(&subreq->wb_kref)) 206 return 0; 207 while (!nfs_lock_request(subreq)) { 208 nfs_page_group_unlock(head); 209 ret = nfs_wait_on_request(subreq); 210 if (!ret) 211 ret = nfs_page_group_lock(head); 212 if (ret < 0) { 213 nfs_unroll_locks(head, subreq); 214 nfs_release_request(subreq); 215 return ret; 216 } 217 } 218 return 0; 219 } 220 221 /* 222 * nfs_page_group_lock_subrequests - try to lock the subrequests 223 * @head: head request of page group 224 * 225 * This is a helper function for nfs_lock_and_join_requests which 226 * must be called with the head request locked. 227 */ 228 int nfs_page_group_lock_subrequests(struct nfs_page *head) 229 { 230 struct nfs_page *subreq; 231 int ret; 232 233 ret = nfs_page_group_lock(head); 234 if (ret < 0) 235 return ret; 236 /* lock each request in the page group */ 237 for (subreq = head->wb_this_page; subreq != head; 238 subreq = subreq->wb_this_page) { 239 ret = nfs_page_group_lock_subreq(head, subreq); 240 if (ret < 0) 241 return ret; 242 } 243 nfs_page_group_unlock(head); 244 return 0; 245 } 246 247 /* 248 * nfs_page_set_headlock - set the request PG_HEADLOCK 249 * @req: request that is to be locked 250 * 251 * this lock must be held when modifying req->wb_head 252 * 253 * return 0 on success, < 0 on error 254 */ 255 int 256 nfs_page_set_headlock(struct nfs_page *req) 257 { 258 if (!test_and_set_bit(PG_HEADLOCK, &req->wb_flags)) 259 return 0; 260 261 set_bit(PG_CONTENDED1, &req->wb_flags); 262 smp_mb__after_atomic(); 263 return wait_on_bit_lock(&req->wb_flags, PG_HEADLOCK, 264 TASK_UNINTERRUPTIBLE); 265 } 266 267 /* 268 * nfs_page_clear_headlock - clear the request PG_HEADLOCK 269 * @req: request that is to be locked 270 */ 271 void 272 nfs_page_clear_headlock(struct nfs_page *req) 273 { 274 clear_bit_unlock(PG_HEADLOCK, &req->wb_flags); 275 smp_mb__after_atomic(); 276 if (!test_bit(PG_CONTENDED1, &req->wb_flags)) 277 return; 278 wake_up_bit(&req->wb_flags, PG_HEADLOCK); 279 } 280 281 /* 282 * nfs_page_group_lock - lock the head of the page group 283 * @req: request in group that is to be locked 284 * 285 * this lock must be held when traversing or modifying the page 286 * group list 287 * 288 * return 0 on success, < 0 on error 289 */ 290 int 291 nfs_page_group_lock(struct nfs_page *req) 292 { 293 int ret; 294 295 ret = nfs_page_set_headlock(req); 296 if (ret || req->wb_head == req) 297 return ret; 298 return nfs_page_set_headlock(req->wb_head); 299 } 300 301 /* 302 * nfs_page_group_unlock - unlock the head of the page group 303 * @req: request in group that is to be unlocked 304 */ 305 void 306 nfs_page_group_unlock(struct nfs_page *req) 307 { 308 if (req != req->wb_head) 309 nfs_page_clear_headlock(req->wb_head); 310 nfs_page_clear_headlock(req); 311 } 312 313 /* 314 * nfs_page_group_sync_on_bit_locked 315 * 316 * must be called with page group lock held 317 */ 318 static bool 319 nfs_page_group_sync_on_bit_locked(struct nfs_page *req, unsigned int bit) 320 { 321 struct nfs_page *head = req->wb_head; 322 struct nfs_page *tmp; 323 324 WARN_ON_ONCE(!test_bit(PG_HEADLOCK, &head->wb_flags)); 325 WARN_ON_ONCE(test_and_set_bit(bit, &req->wb_flags)); 326 327 tmp = req->wb_this_page; 328 while (tmp != req) { 329 if (!test_bit(bit, &tmp->wb_flags)) 330 return false; 331 tmp = tmp->wb_this_page; 332 } 333 334 /* true! reset all bits */ 335 tmp = req; 336 do { 337 clear_bit(bit, &tmp->wb_flags); 338 tmp = tmp->wb_this_page; 339 } while (tmp != req); 340 341 return true; 342 } 343 344 /* 345 * nfs_page_group_sync_on_bit - set bit on current request, but only 346 * return true if the bit is set for all requests in page group 347 * @req - request in page group 348 * @bit - PG_* bit that is used to sync page group 349 */ 350 bool nfs_page_group_sync_on_bit(struct nfs_page *req, unsigned int bit) 351 { 352 bool ret; 353 354 nfs_page_group_lock(req); 355 ret = nfs_page_group_sync_on_bit_locked(req, bit); 356 nfs_page_group_unlock(req); 357 358 return ret; 359 } 360 361 /* 362 * nfs_page_group_init - Initialize the page group linkage for @req 363 * @req - a new nfs request 364 * @prev - the previous request in page group, or NULL if @req is the first 365 * or only request in the group (the head). 366 */ 367 static inline void 368 nfs_page_group_init(struct nfs_page *req, struct nfs_page *prev) 369 { 370 struct inode *inode; 371 WARN_ON_ONCE(prev == req); 372 373 if (!prev) { 374 /* a head request */ 375 req->wb_head = req; 376 req->wb_this_page = req; 377 } else { 378 /* a subrequest */ 379 WARN_ON_ONCE(prev->wb_this_page != prev->wb_head); 380 WARN_ON_ONCE(!test_bit(PG_HEADLOCK, &prev->wb_head->wb_flags)); 381 req->wb_head = prev->wb_head; 382 req->wb_this_page = prev->wb_this_page; 383 prev->wb_this_page = req; 384 385 /* All subrequests take a ref on the head request until 386 * nfs_page_group_destroy is called */ 387 kref_get(&req->wb_head->wb_kref); 388 389 /* grab extra ref and bump the request count if head request 390 * has extra ref from the write/commit path to handle handoff 391 * between write and commit lists. */ 392 if (test_bit(PG_INODE_REF, &prev->wb_head->wb_flags)) { 393 inode = page_file_mapping(req->wb_page)->host; 394 set_bit(PG_INODE_REF, &req->wb_flags); 395 kref_get(&req->wb_kref); 396 atomic_long_inc(&NFS_I(inode)->nrequests); 397 } 398 } 399 } 400 401 /* 402 * nfs_page_group_destroy - sync the destruction of page groups 403 * @req - request that no longer needs the page group 404 * 405 * releases the page group reference from each member once all 406 * members have called this function. 407 */ 408 static void 409 nfs_page_group_destroy(struct kref *kref) 410 { 411 struct nfs_page *req = container_of(kref, struct nfs_page, wb_kref); 412 struct nfs_page *head = req->wb_head; 413 struct nfs_page *tmp, *next; 414 415 if (!nfs_page_group_sync_on_bit(req, PG_TEARDOWN)) 416 goto out; 417 418 tmp = req; 419 do { 420 next = tmp->wb_this_page; 421 /* unlink and free */ 422 tmp->wb_this_page = tmp; 423 tmp->wb_head = tmp; 424 nfs_free_request(tmp); 425 tmp = next; 426 } while (tmp != req); 427 out: 428 /* subrequests must release the ref on the head request */ 429 if (head != req) 430 nfs_release_request(head); 431 } 432 433 static struct nfs_page * 434 __nfs_create_request(struct nfs_lock_context *l_ctx, struct page *page, 435 unsigned int pgbase, unsigned int offset, 436 unsigned int count) 437 { 438 struct nfs_page *req; 439 struct nfs_open_context *ctx = l_ctx->open_context; 440 441 if (test_bit(NFS_CONTEXT_BAD, &ctx->flags)) 442 return ERR_PTR(-EBADF); 443 /* try to allocate the request struct */ 444 req = nfs_page_alloc(); 445 if (req == NULL) 446 return ERR_PTR(-ENOMEM); 447 448 req->wb_lock_context = l_ctx; 449 refcount_inc(&l_ctx->count); 450 atomic_inc(&l_ctx->io_count); 451 452 /* Initialize the request struct. Initially, we assume a 453 * long write-back delay. This will be adjusted in 454 * update_nfs_request below if the region is not locked. */ 455 req->wb_page = page; 456 if (page) { 457 req->wb_index = page_index(page); 458 get_page(page); 459 } 460 req->wb_offset = offset; 461 req->wb_pgbase = pgbase; 462 req->wb_bytes = count; 463 kref_init(&req->wb_kref); 464 req->wb_nio = 0; 465 return req; 466 } 467 468 /** 469 * nfs_create_request - Create an NFS read/write request. 470 * @ctx: open context to use 471 * @page: page to write 472 * @offset: starting offset within the page for the write 473 * @count: number of bytes to read/write 474 * 475 * The page must be locked by the caller. This makes sure we never 476 * create two different requests for the same page. 477 * User should ensure it is safe to sleep in this function. 478 */ 479 struct nfs_page * 480 nfs_create_request(struct nfs_open_context *ctx, struct page *page, 481 unsigned int offset, unsigned int count) 482 { 483 struct nfs_lock_context *l_ctx = nfs_get_lock_context(ctx); 484 struct nfs_page *ret; 485 486 if (IS_ERR(l_ctx)) 487 return ERR_CAST(l_ctx); 488 ret = __nfs_create_request(l_ctx, page, offset, offset, count); 489 if (!IS_ERR(ret)) 490 nfs_page_group_init(ret, NULL); 491 nfs_put_lock_context(l_ctx); 492 return ret; 493 } 494 495 static struct nfs_page * 496 nfs_create_subreq(struct nfs_page *req, 497 unsigned int pgbase, 498 unsigned int offset, 499 unsigned int count) 500 { 501 struct nfs_page *last; 502 struct nfs_page *ret; 503 504 ret = __nfs_create_request(req->wb_lock_context, req->wb_page, 505 pgbase, offset, count); 506 if (!IS_ERR(ret)) { 507 /* find the last request */ 508 for (last = req->wb_head; 509 last->wb_this_page != req->wb_head; 510 last = last->wb_this_page) 511 ; 512 513 nfs_lock_request(ret); 514 ret->wb_index = req->wb_index; 515 nfs_page_group_init(ret, last); 516 ret->wb_nio = req->wb_nio; 517 } 518 return ret; 519 } 520 521 /** 522 * nfs_unlock_request - Unlock request and wake up sleepers. 523 * @req: pointer to request 524 */ 525 void nfs_unlock_request(struct nfs_page *req) 526 { 527 clear_bit_unlock(PG_BUSY, &req->wb_flags); 528 smp_mb__after_atomic(); 529 if (!test_bit(PG_CONTENDED2, &req->wb_flags)) 530 return; 531 wake_up_bit(&req->wb_flags, PG_BUSY); 532 } 533 534 /** 535 * nfs_unlock_and_release_request - Unlock request and release the nfs_page 536 * @req: pointer to request 537 */ 538 void nfs_unlock_and_release_request(struct nfs_page *req) 539 { 540 nfs_unlock_request(req); 541 nfs_release_request(req); 542 } 543 544 /* 545 * nfs_clear_request - Free up all resources allocated to the request 546 * @req: 547 * 548 * Release page and open context resources associated with a read/write 549 * request after it has completed. 550 */ 551 static void nfs_clear_request(struct nfs_page *req) 552 { 553 struct page *page = req->wb_page; 554 struct nfs_lock_context *l_ctx = req->wb_lock_context; 555 struct nfs_open_context *ctx; 556 557 if (page != NULL) { 558 put_page(page); 559 req->wb_page = NULL; 560 } 561 if (l_ctx != NULL) { 562 if (atomic_dec_and_test(&l_ctx->io_count)) { 563 wake_up_var(&l_ctx->io_count); 564 ctx = l_ctx->open_context; 565 if (test_bit(NFS_CONTEXT_UNLOCK, &ctx->flags)) 566 rpc_wake_up(&NFS_SERVER(d_inode(ctx->dentry))->uoc_rpcwaitq); 567 } 568 nfs_put_lock_context(l_ctx); 569 req->wb_lock_context = NULL; 570 } 571 } 572 573 /** 574 * nfs_free_request - Release the count on an NFS read/write request 575 * @req: request to release 576 * 577 * Note: Should never be called with the spinlock held! 578 */ 579 void nfs_free_request(struct nfs_page *req) 580 { 581 WARN_ON_ONCE(req->wb_this_page != req); 582 583 /* extra debug: make sure no sync bits are still set */ 584 WARN_ON_ONCE(test_bit(PG_TEARDOWN, &req->wb_flags)); 585 WARN_ON_ONCE(test_bit(PG_UNLOCKPAGE, &req->wb_flags)); 586 WARN_ON_ONCE(test_bit(PG_UPTODATE, &req->wb_flags)); 587 WARN_ON_ONCE(test_bit(PG_WB_END, &req->wb_flags)); 588 WARN_ON_ONCE(test_bit(PG_REMOVE, &req->wb_flags)); 589 590 /* Release struct file and open context */ 591 nfs_clear_request(req); 592 nfs_page_free(req); 593 } 594 595 void nfs_release_request(struct nfs_page *req) 596 { 597 kref_put(&req->wb_kref, nfs_page_group_destroy); 598 } 599 EXPORT_SYMBOL_GPL(nfs_release_request); 600 601 /** 602 * nfs_wait_on_request - Wait for a request to complete. 603 * @req: request to wait upon. 604 * 605 * Interruptible by fatal signals only. 606 * The user is responsible for holding a count on the request. 607 */ 608 int 609 nfs_wait_on_request(struct nfs_page *req) 610 { 611 if (!test_bit(PG_BUSY, &req->wb_flags)) 612 return 0; 613 set_bit(PG_CONTENDED2, &req->wb_flags); 614 smp_mb__after_atomic(); 615 return wait_on_bit_io(&req->wb_flags, PG_BUSY, 616 TASK_UNINTERRUPTIBLE); 617 } 618 EXPORT_SYMBOL_GPL(nfs_wait_on_request); 619 620 /* 621 * nfs_generic_pg_test - determine if requests can be coalesced 622 * @desc: pointer to descriptor 623 * @prev: previous request in desc, or NULL 624 * @req: this request 625 * 626 * Returns zero if @req cannot be coalesced into @desc, otherwise it returns 627 * the size of the request. 628 */ 629 size_t nfs_generic_pg_test(struct nfs_pageio_descriptor *desc, 630 struct nfs_page *prev, struct nfs_page *req) 631 { 632 struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc); 633 634 635 if (mirror->pg_count > mirror->pg_bsize) { 636 /* should never happen */ 637 WARN_ON_ONCE(1); 638 return 0; 639 } 640 641 /* 642 * Limit the request size so that we can still allocate a page array 643 * for it without upsetting the slab allocator. 644 */ 645 if (((mirror->pg_count + req->wb_bytes) >> PAGE_SHIFT) * 646 sizeof(struct page *) > PAGE_SIZE) 647 return 0; 648 649 return min(mirror->pg_bsize - mirror->pg_count, (size_t)req->wb_bytes); 650 } 651 EXPORT_SYMBOL_GPL(nfs_generic_pg_test); 652 653 struct nfs_pgio_header *nfs_pgio_header_alloc(const struct nfs_rw_ops *ops) 654 { 655 struct nfs_pgio_header *hdr = ops->rw_alloc_header(); 656 657 if (hdr) { 658 INIT_LIST_HEAD(&hdr->pages); 659 hdr->rw_ops = ops; 660 } 661 return hdr; 662 } 663 EXPORT_SYMBOL_GPL(nfs_pgio_header_alloc); 664 665 /** 666 * nfs_pgio_data_destroy - make @hdr suitable for reuse 667 * 668 * Frees memory and releases refs from nfs_generic_pgio, so that it may 669 * be called again. 670 * 671 * @hdr: A header that has had nfs_generic_pgio called 672 */ 673 static void nfs_pgio_data_destroy(struct nfs_pgio_header *hdr) 674 { 675 if (hdr->args.context) 676 put_nfs_open_context(hdr->args.context); 677 if (hdr->page_array.pagevec != hdr->page_array.page_array) 678 kfree(hdr->page_array.pagevec); 679 } 680 681 /* 682 * nfs_pgio_header_free - Free a read or write header 683 * @hdr: The header to free 684 */ 685 void nfs_pgio_header_free(struct nfs_pgio_header *hdr) 686 { 687 nfs_pgio_data_destroy(hdr); 688 hdr->rw_ops->rw_free_header(hdr); 689 } 690 EXPORT_SYMBOL_GPL(nfs_pgio_header_free); 691 692 /** 693 * nfs_pgio_rpcsetup - Set up arguments for a pageio call 694 * @hdr: The pageio hdr 695 * @count: Number of bytes to read 696 * @how: How to commit data (writes only) 697 * @cinfo: Commit information for the call (writes only) 698 */ 699 static void nfs_pgio_rpcsetup(struct nfs_pgio_header *hdr, 700 unsigned int count, 701 int how, struct nfs_commit_info *cinfo) 702 { 703 struct nfs_page *req = hdr->req; 704 705 /* Set up the RPC argument and reply structs 706 * NB: take care not to mess about with hdr->commit et al. */ 707 708 hdr->args.fh = NFS_FH(hdr->inode); 709 hdr->args.offset = req_offset(req); 710 /* pnfs_set_layoutcommit needs this */ 711 hdr->mds_offset = hdr->args.offset; 712 hdr->args.pgbase = req->wb_pgbase; 713 hdr->args.pages = hdr->page_array.pagevec; 714 hdr->args.count = count; 715 hdr->args.context = get_nfs_open_context(nfs_req_openctx(req)); 716 hdr->args.lock_context = req->wb_lock_context; 717 hdr->args.stable = NFS_UNSTABLE; 718 switch (how & (FLUSH_STABLE | FLUSH_COND_STABLE)) { 719 case 0: 720 break; 721 case FLUSH_COND_STABLE: 722 if (nfs_reqs_to_commit(cinfo)) 723 break; 724 fallthrough; 725 default: 726 hdr->args.stable = NFS_FILE_SYNC; 727 } 728 729 hdr->res.fattr = &hdr->fattr; 730 hdr->res.count = 0; 731 hdr->res.eof = 0; 732 hdr->res.verf = &hdr->verf; 733 nfs_fattr_init(&hdr->fattr); 734 } 735 736 /** 737 * nfs_pgio_prepare - Prepare pageio hdr to go over the wire 738 * @task: The current task 739 * @calldata: pageio header to prepare 740 */ 741 static void nfs_pgio_prepare(struct rpc_task *task, void *calldata) 742 { 743 struct nfs_pgio_header *hdr = calldata; 744 int err; 745 err = NFS_PROTO(hdr->inode)->pgio_rpc_prepare(task, hdr); 746 if (err) 747 rpc_exit(task, err); 748 } 749 750 int nfs_initiate_pgio(struct rpc_clnt *clnt, struct nfs_pgio_header *hdr, 751 const struct cred *cred, const struct nfs_rpc_ops *rpc_ops, 752 const struct rpc_call_ops *call_ops, int how, int flags) 753 { 754 struct rpc_task *task; 755 struct rpc_message msg = { 756 .rpc_argp = &hdr->args, 757 .rpc_resp = &hdr->res, 758 .rpc_cred = cred, 759 }; 760 struct rpc_task_setup task_setup_data = { 761 .rpc_client = clnt, 762 .task = &hdr->task, 763 .rpc_message = &msg, 764 .callback_ops = call_ops, 765 .callback_data = hdr, 766 .workqueue = nfsiod_workqueue, 767 .flags = RPC_TASK_ASYNC | flags, 768 }; 769 770 hdr->rw_ops->rw_initiate(hdr, &msg, rpc_ops, &task_setup_data, how); 771 772 dprintk("NFS: initiated pgio call " 773 "(req %s/%llu, %u bytes @ offset %llu)\n", 774 hdr->inode->i_sb->s_id, 775 (unsigned long long)NFS_FILEID(hdr->inode), 776 hdr->args.count, 777 (unsigned long long)hdr->args.offset); 778 779 task = rpc_run_task(&task_setup_data); 780 if (IS_ERR(task)) 781 return PTR_ERR(task); 782 rpc_put_task(task); 783 return 0; 784 } 785 EXPORT_SYMBOL_GPL(nfs_initiate_pgio); 786 787 /** 788 * nfs_pgio_error - Clean up from a pageio error 789 * @hdr: pageio header 790 */ 791 static void nfs_pgio_error(struct nfs_pgio_header *hdr) 792 { 793 set_bit(NFS_IOHDR_REDO, &hdr->flags); 794 hdr->completion_ops->completion(hdr); 795 } 796 797 /** 798 * nfs_pgio_release - Release pageio data 799 * @calldata: The pageio header to release 800 */ 801 static void nfs_pgio_release(void *calldata) 802 { 803 struct nfs_pgio_header *hdr = calldata; 804 hdr->completion_ops->completion(hdr); 805 } 806 807 static void nfs_pageio_mirror_init(struct nfs_pgio_mirror *mirror, 808 unsigned int bsize) 809 { 810 INIT_LIST_HEAD(&mirror->pg_list); 811 mirror->pg_bytes_written = 0; 812 mirror->pg_count = 0; 813 mirror->pg_bsize = bsize; 814 mirror->pg_base = 0; 815 mirror->pg_recoalesce = 0; 816 } 817 818 /** 819 * nfs_pageio_init - initialise a page io descriptor 820 * @desc: pointer to descriptor 821 * @inode: pointer to inode 822 * @pg_ops: pointer to pageio operations 823 * @compl_ops: pointer to pageio completion operations 824 * @rw_ops: pointer to nfs read/write operations 825 * @bsize: io block size 826 * @io_flags: extra parameters for the io function 827 */ 828 void nfs_pageio_init(struct nfs_pageio_descriptor *desc, 829 struct inode *inode, 830 const struct nfs_pageio_ops *pg_ops, 831 const struct nfs_pgio_completion_ops *compl_ops, 832 const struct nfs_rw_ops *rw_ops, 833 size_t bsize, 834 int io_flags) 835 { 836 desc->pg_moreio = 0; 837 desc->pg_inode = inode; 838 desc->pg_ops = pg_ops; 839 desc->pg_completion_ops = compl_ops; 840 desc->pg_rw_ops = rw_ops; 841 desc->pg_ioflags = io_flags; 842 desc->pg_error = 0; 843 desc->pg_lseg = NULL; 844 desc->pg_io_completion = NULL; 845 desc->pg_dreq = NULL; 846 desc->pg_bsize = bsize; 847 848 desc->pg_mirror_count = 1; 849 desc->pg_mirror_idx = 0; 850 851 desc->pg_mirrors_dynamic = NULL; 852 desc->pg_mirrors = desc->pg_mirrors_static; 853 nfs_pageio_mirror_init(&desc->pg_mirrors[0], bsize); 854 desc->pg_maxretrans = 0; 855 } 856 857 /** 858 * nfs_pgio_result - Basic pageio error handling 859 * @task: The task that ran 860 * @calldata: Pageio header to check 861 */ 862 static void nfs_pgio_result(struct rpc_task *task, void *calldata) 863 { 864 struct nfs_pgio_header *hdr = calldata; 865 struct inode *inode = hdr->inode; 866 867 if (hdr->rw_ops->rw_done(task, hdr, inode) != 0) 868 return; 869 if (task->tk_status < 0) 870 nfs_set_pgio_error(hdr, task->tk_status, hdr->args.offset); 871 else 872 hdr->rw_ops->rw_result(task, hdr); 873 } 874 875 /* 876 * Create an RPC task for the given read or write request and kick it. 877 * The page must have been locked by the caller. 878 * 879 * It may happen that the page we're passed is not marked dirty. 880 * This is the case if nfs_updatepage detects a conflicting request 881 * that has been written but not committed. 882 */ 883 int nfs_generic_pgio(struct nfs_pageio_descriptor *desc, 884 struct nfs_pgio_header *hdr) 885 { 886 struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc); 887 888 struct nfs_page *req; 889 struct page **pages, 890 *last_page; 891 struct list_head *head = &mirror->pg_list; 892 struct nfs_commit_info cinfo; 893 struct nfs_page_array *pg_array = &hdr->page_array; 894 unsigned int pagecount, pageused; 895 gfp_t gfp_flags = GFP_KERNEL; 896 897 pagecount = nfs_page_array_len(mirror->pg_base, mirror->pg_count); 898 pg_array->npages = pagecount; 899 900 if (pagecount <= ARRAY_SIZE(pg_array->page_array)) 901 pg_array->pagevec = pg_array->page_array; 902 else { 903 pg_array->pagevec = kcalloc(pagecount, sizeof(struct page *), gfp_flags); 904 if (!pg_array->pagevec) { 905 pg_array->npages = 0; 906 nfs_pgio_error(hdr); 907 desc->pg_error = -ENOMEM; 908 return desc->pg_error; 909 } 910 } 911 912 nfs_init_cinfo(&cinfo, desc->pg_inode, desc->pg_dreq); 913 pages = hdr->page_array.pagevec; 914 last_page = NULL; 915 pageused = 0; 916 while (!list_empty(head)) { 917 req = nfs_list_entry(head->next); 918 nfs_list_move_request(req, &hdr->pages); 919 920 if (!last_page || last_page != req->wb_page) { 921 pageused++; 922 if (pageused > pagecount) 923 break; 924 *pages++ = last_page = req->wb_page; 925 } 926 } 927 if (WARN_ON_ONCE(pageused != pagecount)) { 928 nfs_pgio_error(hdr); 929 desc->pg_error = -EINVAL; 930 return desc->pg_error; 931 } 932 933 if ((desc->pg_ioflags & FLUSH_COND_STABLE) && 934 (desc->pg_moreio || nfs_reqs_to_commit(&cinfo))) 935 desc->pg_ioflags &= ~FLUSH_COND_STABLE; 936 937 /* Set up the argument struct */ 938 nfs_pgio_rpcsetup(hdr, mirror->pg_count, desc->pg_ioflags, &cinfo); 939 desc->pg_rpc_callops = &nfs_pgio_common_ops; 940 return 0; 941 } 942 EXPORT_SYMBOL_GPL(nfs_generic_pgio); 943 944 static int nfs_generic_pg_pgios(struct nfs_pageio_descriptor *desc) 945 { 946 struct nfs_pgio_header *hdr; 947 int ret; 948 unsigned short task_flags = 0; 949 950 hdr = nfs_pgio_header_alloc(desc->pg_rw_ops); 951 if (!hdr) { 952 desc->pg_error = -ENOMEM; 953 return desc->pg_error; 954 } 955 nfs_pgheader_init(desc, hdr, nfs_pgio_header_free); 956 ret = nfs_generic_pgio(desc, hdr); 957 if (ret == 0) { 958 if (NFS_SERVER(hdr->inode)->nfs_client->cl_minorversion) 959 task_flags = RPC_TASK_MOVEABLE; 960 ret = nfs_initiate_pgio(NFS_CLIENT(hdr->inode), 961 hdr, 962 hdr->cred, 963 NFS_PROTO(hdr->inode), 964 desc->pg_rpc_callops, 965 desc->pg_ioflags, 966 RPC_TASK_CRED_NOREF | task_flags); 967 } 968 return ret; 969 } 970 971 static struct nfs_pgio_mirror * 972 nfs_pageio_alloc_mirrors(struct nfs_pageio_descriptor *desc, 973 unsigned int mirror_count) 974 { 975 struct nfs_pgio_mirror *ret; 976 unsigned int i; 977 978 kfree(desc->pg_mirrors_dynamic); 979 desc->pg_mirrors_dynamic = NULL; 980 if (mirror_count == 1) 981 return desc->pg_mirrors_static; 982 ret = kmalloc_array(mirror_count, sizeof(*ret), GFP_KERNEL); 983 if (ret != NULL) { 984 for (i = 0; i < mirror_count; i++) 985 nfs_pageio_mirror_init(&ret[i], desc->pg_bsize); 986 desc->pg_mirrors_dynamic = ret; 987 } 988 return ret; 989 } 990 991 /* 992 * nfs_pageio_setup_mirroring - determine if mirroring is to be used 993 * by calling the pg_get_mirror_count op 994 */ 995 static void nfs_pageio_setup_mirroring(struct nfs_pageio_descriptor *pgio, 996 struct nfs_page *req) 997 { 998 unsigned int mirror_count = 1; 999 1000 if (pgio->pg_ops->pg_get_mirror_count) 1001 mirror_count = pgio->pg_ops->pg_get_mirror_count(pgio, req); 1002 if (mirror_count == pgio->pg_mirror_count || pgio->pg_error < 0) 1003 return; 1004 1005 if (!mirror_count || mirror_count > NFS_PAGEIO_DESCRIPTOR_MIRROR_MAX) { 1006 pgio->pg_error = -EINVAL; 1007 return; 1008 } 1009 1010 pgio->pg_mirrors = nfs_pageio_alloc_mirrors(pgio, mirror_count); 1011 if (pgio->pg_mirrors == NULL) { 1012 pgio->pg_error = -ENOMEM; 1013 pgio->pg_mirrors = pgio->pg_mirrors_static; 1014 mirror_count = 1; 1015 } 1016 pgio->pg_mirror_count = mirror_count; 1017 } 1018 1019 static void nfs_pageio_cleanup_mirroring(struct nfs_pageio_descriptor *pgio) 1020 { 1021 pgio->pg_mirror_count = 1; 1022 pgio->pg_mirror_idx = 0; 1023 pgio->pg_mirrors = pgio->pg_mirrors_static; 1024 kfree(pgio->pg_mirrors_dynamic); 1025 pgio->pg_mirrors_dynamic = NULL; 1026 } 1027 1028 static bool nfs_match_lock_context(const struct nfs_lock_context *l1, 1029 const struct nfs_lock_context *l2) 1030 { 1031 return l1->lockowner == l2->lockowner; 1032 } 1033 1034 /** 1035 * nfs_coalesce_size - test two requests for compatibility 1036 * @prev: pointer to nfs_page 1037 * @req: pointer to nfs_page 1038 * @pgio: pointer to nfs_pagio_descriptor 1039 * 1040 * The nfs_page structures 'prev' and 'req' are compared to ensure that the 1041 * page data area they describe is contiguous, and that their RPC 1042 * credentials, NFSv4 open state, and lockowners are the same. 1043 * 1044 * Returns size of the request that can be coalesced 1045 */ 1046 static unsigned int nfs_coalesce_size(struct nfs_page *prev, 1047 struct nfs_page *req, 1048 struct nfs_pageio_descriptor *pgio) 1049 { 1050 struct file_lock_context *flctx; 1051 1052 if (prev) { 1053 if (!nfs_match_open_context(nfs_req_openctx(req), nfs_req_openctx(prev))) 1054 return 0; 1055 flctx = d_inode(nfs_req_openctx(req)->dentry)->i_flctx; 1056 if (flctx != NULL && 1057 !(list_empty_careful(&flctx->flc_posix) && 1058 list_empty_careful(&flctx->flc_flock)) && 1059 !nfs_match_lock_context(req->wb_lock_context, 1060 prev->wb_lock_context)) 1061 return 0; 1062 if (req_offset(req) != req_offset(prev) + prev->wb_bytes) 1063 return 0; 1064 if (req->wb_page == prev->wb_page) { 1065 if (req->wb_pgbase != prev->wb_pgbase + prev->wb_bytes) 1066 return 0; 1067 } else { 1068 if (req->wb_pgbase != 0 || 1069 prev->wb_pgbase + prev->wb_bytes != PAGE_SIZE) 1070 return 0; 1071 } 1072 } 1073 return pgio->pg_ops->pg_test(pgio, prev, req); 1074 } 1075 1076 /** 1077 * nfs_pageio_do_add_request - Attempt to coalesce a request into a page list. 1078 * @desc: destination io descriptor 1079 * @req: request 1080 * 1081 * If the request 'req' was successfully coalesced into the existing list 1082 * of pages 'desc', it returns the size of req. 1083 */ 1084 static unsigned int 1085 nfs_pageio_do_add_request(struct nfs_pageio_descriptor *desc, 1086 struct nfs_page *req) 1087 { 1088 struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc); 1089 struct nfs_page *prev = NULL; 1090 unsigned int size; 1091 1092 if (list_empty(&mirror->pg_list)) { 1093 if (desc->pg_ops->pg_init) 1094 desc->pg_ops->pg_init(desc, req); 1095 if (desc->pg_error < 0) 1096 return 0; 1097 mirror->pg_base = req->wb_pgbase; 1098 mirror->pg_count = 0; 1099 mirror->pg_recoalesce = 0; 1100 } else 1101 prev = nfs_list_entry(mirror->pg_list.prev); 1102 1103 if (desc->pg_maxretrans && req->wb_nio > desc->pg_maxretrans) { 1104 if (NFS_SERVER(desc->pg_inode)->flags & NFS_MOUNT_SOFTERR) 1105 desc->pg_error = -ETIMEDOUT; 1106 else 1107 desc->pg_error = -EIO; 1108 return 0; 1109 } 1110 1111 size = nfs_coalesce_size(prev, req, desc); 1112 if (size < req->wb_bytes) 1113 return size; 1114 nfs_list_move_request(req, &mirror->pg_list); 1115 mirror->pg_count += req->wb_bytes; 1116 return req->wb_bytes; 1117 } 1118 1119 /* 1120 * Helper for nfs_pageio_add_request and nfs_pageio_complete 1121 */ 1122 static void nfs_pageio_doio(struct nfs_pageio_descriptor *desc) 1123 { 1124 struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc); 1125 1126 if (!list_empty(&mirror->pg_list)) { 1127 int error = desc->pg_ops->pg_doio(desc); 1128 if (error < 0) 1129 desc->pg_error = error; 1130 if (list_empty(&mirror->pg_list)) 1131 mirror->pg_bytes_written += mirror->pg_count; 1132 } 1133 } 1134 1135 static void 1136 nfs_pageio_cleanup_request(struct nfs_pageio_descriptor *desc, 1137 struct nfs_page *req) 1138 { 1139 LIST_HEAD(head); 1140 1141 nfs_list_move_request(req, &head); 1142 desc->pg_completion_ops->error_cleanup(&head, desc->pg_error); 1143 } 1144 1145 /** 1146 * __nfs_pageio_add_request - Attempt to coalesce a request into a page list. 1147 * @desc: destination io descriptor 1148 * @req: request 1149 * 1150 * This may split a request into subrequests which are all part of the 1151 * same page group. If so, it will submit @req as the last one, to ensure 1152 * the pointer to @req is still valid in case of failure. 1153 * 1154 * Returns true if the request 'req' was successfully coalesced into the 1155 * existing list of pages 'desc'. 1156 */ 1157 static int __nfs_pageio_add_request(struct nfs_pageio_descriptor *desc, 1158 struct nfs_page *req) 1159 { 1160 struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc); 1161 struct nfs_page *subreq; 1162 unsigned int size, subreq_size; 1163 1164 nfs_page_group_lock(req); 1165 1166 subreq = req; 1167 subreq_size = subreq->wb_bytes; 1168 for(;;) { 1169 size = nfs_pageio_do_add_request(desc, subreq); 1170 if (size == subreq_size) { 1171 /* We successfully submitted a request */ 1172 if (subreq == req) 1173 break; 1174 req->wb_pgbase += size; 1175 req->wb_bytes -= size; 1176 req->wb_offset += size; 1177 subreq_size = req->wb_bytes; 1178 subreq = req; 1179 continue; 1180 } 1181 if (WARN_ON_ONCE(subreq != req)) { 1182 nfs_page_group_unlock(req); 1183 nfs_pageio_cleanup_request(desc, subreq); 1184 subreq = req; 1185 subreq_size = req->wb_bytes; 1186 nfs_page_group_lock(req); 1187 } 1188 if (!size) { 1189 /* Can't coalesce any more, so do I/O */ 1190 nfs_page_group_unlock(req); 1191 desc->pg_moreio = 1; 1192 nfs_pageio_doio(desc); 1193 if (desc->pg_error < 0 || mirror->pg_recoalesce) 1194 return 0; 1195 /* retry add_request for this subreq */ 1196 nfs_page_group_lock(req); 1197 continue; 1198 } 1199 subreq = nfs_create_subreq(req, req->wb_pgbase, 1200 req->wb_offset, size); 1201 if (IS_ERR(subreq)) 1202 goto err_ptr; 1203 subreq_size = size; 1204 } 1205 1206 nfs_page_group_unlock(req); 1207 return 1; 1208 err_ptr: 1209 desc->pg_error = PTR_ERR(subreq); 1210 nfs_page_group_unlock(req); 1211 return 0; 1212 } 1213 1214 static int nfs_do_recoalesce(struct nfs_pageio_descriptor *desc) 1215 { 1216 struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc); 1217 LIST_HEAD(head); 1218 1219 do { 1220 list_splice_init(&mirror->pg_list, &head); 1221 1222 while (!list_empty(&head)) { 1223 struct nfs_page *req; 1224 1225 req = list_first_entry(&head, struct nfs_page, wb_list); 1226 if (__nfs_pageio_add_request(desc, req)) 1227 continue; 1228 if (desc->pg_error < 0) { 1229 list_splice_tail(&head, &mirror->pg_list); 1230 mirror->pg_recoalesce = 1; 1231 return 0; 1232 } 1233 break; 1234 } 1235 } while (mirror->pg_recoalesce); 1236 return 1; 1237 } 1238 1239 static int nfs_pageio_add_request_mirror(struct nfs_pageio_descriptor *desc, 1240 struct nfs_page *req) 1241 { 1242 int ret; 1243 1244 do { 1245 ret = __nfs_pageio_add_request(desc, req); 1246 if (ret) 1247 break; 1248 if (desc->pg_error < 0) 1249 break; 1250 ret = nfs_do_recoalesce(desc); 1251 } while (ret); 1252 1253 return ret; 1254 } 1255 1256 static void nfs_pageio_error_cleanup(struct nfs_pageio_descriptor *desc) 1257 { 1258 u32 midx; 1259 struct nfs_pgio_mirror *mirror; 1260 1261 if (!desc->pg_error) 1262 return; 1263 1264 for (midx = 0; midx < desc->pg_mirror_count; midx++) { 1265 mirror = nfs_pgio_get_mirror(desc, midx); 1266 desc->pg_completion_ops->error_cleanup(&mirror->pg_list, 1267 desc->pg_error); 1268 } 1269 } 1270 1271 int nfs_pageio_add_request(struct nfs_pageio_descriptor *desc, 1272 struct nfs_page *req) 1273 { 1274 u32 midx; 1275 unsigned int pgbase, offset, bytes; 1276 struct nfs_page *dupreq; 1277 1278 pgbase = req->wb_pgbase; 1279 offset = req->wb_offset; 1280 bytes = req->wb_bytes; 1281 1282 nfs_pageio_setup_mirroring(desc, req); 1283 if (desc->pg_error < 0) 1284 goto out_failed; 1285 1286 /* Create the mirror instances first, and fire them off */ 1287 for (midx = 1; midx < desc->pg_mirror_count; midx++) { 1288 nfs_page_group_lock(req); 1289 1290 dupreq = nfs_create_subreq(req, 1291 pgbase, offset, bytes); 1292 1293 nfs_page_group_unlock(req); 1294 if (IS_ERR(dupreq)) { 1295 desc->pg_error = PTR_ERR(dupreq); 1296 goto out_failed; 1297 } 1298 1299 nfs_pgio_set_current_mirror(desc, midx); 1300 if (!nfs_pageio_add_request_mirror(desc, dupreq)) 1301 goto out_cleanup_subreq; 1302 } 1303 1304 nfs_pgio_set_current_mirror(desc, 0); 1305 if (!nfs_pageio_add_request_mirror(desc, req)) 1306 goto out_failed; 1307 1308 return 1; 1309 1310 out_cleanup_subreq: 1311 nfs_pageio_cleanup_request(desc, dupreq); 1312 out_failed: 1313 nfs_pageio_error_cleanup(desc); 1314 return 0; 1315 } 1316 1317 /* 1318 * nfs_pageio_complete_mirror - Complete I/O on the current mirror of an 1319 * nfs_pageio_descriptor 1320 * @desc: pointer to io descriptor 1321 * @mirror_idx: pointer to mirror index 1322 */ 1323 static void nfs_pageio_complete_mirror(struct nfs_pageio_descriptor *desc, 1324 u32 mirror_idx) 1325 { 1326 struct nfs_pgio_mirror *mirror; 1327 u32 restore_idx; 1328 1329 restore_idx = nfs_pgio_set_current_mirror(desc, mirror_idx); 1330 mirror = nfs_pgio_current_mirror(desc); 1331 1332 for (;;) { 1333 nfs_pageio_doio(desc); 1334 if (desc->pg_error < 0 || !mirror->pg_recoalesce) 1335 break; 1336 if (!nfs_do_recoalesce(desc)) 1337 break; 1338 } 1339 nfs_pgio_set_current_mirror(desc, restore_idx); 1340 } 1341 1342 /* 1343 * nfs_pageio_resend - Transfer requests to new descriptor and resend 1344 * @hdr - the pgio header to move request from 1345 * @desc - the pageio descriptor to add requests to 1346 * 1347 * Try to move each request (nfs_page) from @hdr to @desc then attempt 1348 * to send them. 1349 * 1350 * Returns 0 on success and < 0 on error. 1351 */ 1352 int nfs_pageio_resend(struct nfs_pageio_descriptor *desc, 1353 struct nfs_pgio_header *hdr) 1354 { 1355 LIST_HEAD(pages); 1356 1357 desc->pg_io_completion = hdr->io_completion; 1358 desc->pg_dreq = hdr->dreq; 1359 list_splice_init(&hdr->pages, &pages); 1360 while (!list_empty(&pages)) { 1361 struct nfs_page *req = nfs_list_entry(pages.next); 1362 1363 if (!nfs_pageio_add_request(desc, req)) 1364 break; 1365 } 1366 nfs_pageio_complete(desc); 1367 if (!list_empty(&pages)) { 1368 int err = desc->pg_error < 0 ? desc->pg_error : -EIO; 1369 hdr->completion_ops->error_cleanup(&pages, err); 1370 nfs_set_pgio_error(hdr, err, hdr->io_start); 1371 return err; 1372 } 1373 return 0; 1374 } 1375 EXPORT_SYMBOL_GPL(nfs_pageio_resend); 1376 1377 /** 1378 * nfs_pageio_complete - Complete I/O then cleanup an nfs_pageio_descriptor 1379 * @desc: pointer to io descriptor 1380 */ 1381 void nfs_pageio_complete(struct nfs_pageio_descriptor *desc) 1382 { 1383 u32 midx; 1384 1385 for (midx = 0; midx < desc->pg_mirror_count; midx++) 1386 nfs_pageio_complete_mirror(desc, midx); 1387 1388 if (desc->pg_error < 0) 1389 nfs_pageio_error_cleanup(desc); 1390 if (desc->pg_ops->pg_cleanup) 1391 desc->pg_ops->pg_cleanup(desc); 1392 nfs_pageio_cleanup_mirroring(desc); 1393 } 1394 1395 /** 1396 * nfs_pageio_cond_complete - Conditional I/O completion 1397 * @desc: pointer to io descriptor 1398 * @index: page index 1399 * 1400 * It is important to ensure that processes don't try to take locks 1401 * on non-contiguous ranges of pages as that might deadlock. This 1402 * function should be called before attempting to wait on a locked 1403 * nfs_page. It will complete the I/O if the page index 'index' 1404 * is not contiguous with the existing list of pages in 'desc'. 1405 */ 1406 void nfs_pageio_cond_complete(struct nfs_pageio_descriptor *desc, pgoff_t index) 1407 { 1408 struct nfs_pgio_mirror *mirror; 1409 struct nfs_page *prev; 1410 u32 midx; 1411 1412 for (midx = 0; midx < desc->pg_mirror_count; midx++) { 1413 mirror = nfs_pgio_get_mirror(desc, midx); 1414 if (!list_empty(&mirror->pg_list)) { 1415 prev = nfs_list_entry(mirror->pg_list.prev); 1416 if (index != prev->wb_index + 1) { 1417 nfs_pageio_complete(desc); 1418 break; 1419 } 1420 } 1421 } 1422 } 1423 1424 /* 1425 * nfs_pageio_stop_mirroring - stop using mirroring (set mirror count to 1) 1426 */ 1427 void nfs_pageio_stop_mirroring(struct nfs_pageio_descriptor *pgio) 1428 { 1429 nfs_pageio_complete(pgio); 1430 } 1431 1432 int __init nfs_init_nfspagecache(void) 1433 { 1434 nfs_page_cachep = kmem_cache_create("nfs_page", 1435 sizeof(struct nfs_page), 1436 0, SLAB_HWCACHE_ALIGN, 1437 NULL); 1438 if (nfs_page_cachep == NULL) 1439 return -ENOMEM; 1440 1441 return 0; 1442 } 1443 1444 void nfs_destroy_nfspagecache(void) 1445 { 1446 kmem_cache_destroy(nfs_page_cachep); 1447 } 1448 1449 static const struct rpc_call_ops nfs_pgio_common_ops = { 1450 .rpc_call_prepare = nfs_pgio_prepare, 1451 .rpc_call_done = nfs_pgio_result, 1452 .rpc_release = nfs_pgio_release, 1453 }; 1454 1455 const struct nfs_pageio_ops nfs_pgio_rw_ops = { 1456 .pg_test = nfs_generic_pg_test, 1457 .pg_doio = nfs_generic_pg_pgios, 1458 }; 1459