diff options
Diffstat (limited to 'fs/nfs/nfs4filelayout.c')
| -rw-r--r-- | fs/nfs/nfs4filelayout.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/fs/nfs/nfs4filelayout.c b/fs/nfs/nfs4filelayout.c index 6f8192f4cfc7..be79dc9f386d 100644 --- a/fs/nfs/nfs4filelayout.c +++ b/fs/nfs/nfs4filelayout.c | |||
| @@ -117,6 +117,8 @@ static int filelayout_async_handle_error(struct rpc_task *task, | |||
| 117 | case -EKEYEXPIRED: | 117 | case -EKEYEXPIRED: |
| 118 | rpc_delay(task, FILELAYOUT_POLL_RETRY_MAX); | 118 | rpc_delay(task, FILELAYOUT_POLL_RETRY_MAX); |
| 119 | break; | 119 | break; |
| 120 | case -NFS4ERR_RETRY_UNCACHED_REP: | ||
| 121 | break; | ||
| 120 | default: | 122 | default: |
| 121 | dprintk("%s DS error. Retry through MDS %d\n", __func__, | 123 | dprintk("%s DS error. Retry through MDS %d\n", __func__, |
| 122 | task->tk_status); | 124 | task->tk_status); |
| @@ -416,7 +418,8 @@ static int | |||
| 416 | filelayout_check_layout(struct pnfs_layout_hdr *lo, | 418 | filelayout_check_layout(struct pnfs_layout_hdr *lo, |
| 417 | struct nfs4_filelayout_segment *fl, | 419 | struct nfs4_filelayout_segment *fl, |
| 418 | struct nfs4_layoutget_res *lgr, | 420 | struct nfs4_layoutget_res *lgr, |
| 419 | struct nfs4_deviceid *id) | 421 | struct nfs4_deviceid *id, |
| 422 | gfp_t gfp_flags) | ||
| 420 | { | 423 | { |
| 421 | struct nfs4_file_layout_dsaddr *dsaddr; | 424 | struct nfs4_file_layout_dsaddr *dsaddr; |
| 422 | int status = -EINVAL; | 425 | int status = -EINVAL; |
| @@ -439,7 +442,7 @@ filelayout_check_layout(struct pnfs_layout_hdr *lo, | |||
| 439 | /* find and reference the deviceid */ | 442 | /* find and reference the deviceid */ |
| 440 | dsaddr = nfs4_fl_find_get_deviceid(id); | 443 | dsaddr = nfs4_fl_find_get_deviceid(id); |
| 441 | if (dsaddr == NULL) { | 444 | if (dsaddr == NULL) { |
| 442 | dsaddr = get_device_info(lo->plh_inode, id); | 445 | dsaddr = get_device_info(lo->plh_inode, id, gfp_flags); |
| 443 | if (dsaddr == NULL) | 446 | if (dsaddr == NULL) |
| 444 | goto out; | 447 | goto out; |
| 445 | } | 448 | } |
| @@ -500,7 +503,8 @@ static int | |||
| 500 | filelayout_decode_layout(struct pnfs_layout_hdr *flo, | 503 | filelayout_decode_layout(struct pnfs_layout_hdr *flo, |
| 501 | struct nfs4_filelayout_segment *fl, | 504 | struct nfs4_filelayout_segment *fl, |
| 502 | struct nfs4_layoutget_res *lgr, | 505 | struct nfs4_layoutget_res *lgr, |
| 503 | struct nfs4_deviceid *id) | 506 | struct nfs4_deviceid *id, |
| 507 | gfp_t gfp_flags) | ||
| 504 | { | 508 | { |
| 505 | struct xdr_stream stream; | 509 | struct xdr_stream stream; |
| 506 | struct xdr_buf buf = { | 510 | struct xdr_buf buf = { |
| @@ -516,7 +520,7 @@ filelayout_decode_layout(struct pnfs_layout_hdr *flo, | |||
| 516 | 520 | ||
| 517 | dprintk("%s: set_layout_map Begin\n", __func__); | 521 | dprintk("%s: set_layout_map Begin\n", __func__); |
| 518 | 522 | ||
| 519 | scratch = alloc_page(GFP_KERNEL); | 523 | scratch = alloc_page(gfp_flags); |
| 520 | if (!scratch) | 524 | if (!scratch) |
| 521 | return -ENOMEM; | 525 | return -ENOMEM; |
| 522 | 526 | ||
| @@ -554,13 +558,13 @@ filelayout_decode_layout(struct pnfs_layout_hdr *flo, | |||
| 554 | goto out_err; | 558 | goto out_err; |
| 555 | 559 | ||
| 556 | fl->fh_array = kzalloc(fl->num_fh * sizeof(struct nfs_fh *), | 560 | fl->fh_array = kzalloc(fl->num_fh * sizeof(struct nfs_fh *), |
| 557 | GFP_KERNEL); | 561 | gfp_flags); |
| 558 | if (!fl->fh_array) | 562 | if (!fl->fh_array) |
| 559 | goto out_err; | 563 | goto out_err; |
| 560 | 564 | ||
| 561 | for (i = 0; i < fl->num_fh; i++) { | 565 | for (i = 0; i < fl->num_fh; i++) { |
| 562 | /* Do we want to use a mempool here? */ | 566 | /* Do we want to use a mempool here? */ |
| 563 | fl->fh_array[i] = kmalloc(sizeof(struct nfs_fh), GFP_KERNEL); | 567 | fl->fh_array[i] = kmalloc(sizeof(struct nfs_fh), gfp_flags); |
| 564 | if (!fl->fh_array[i]) | 568 | if (!fl->fh_array[i]) |
| 565 | goto out_err_free; | 569 | goto out_err_free; |
| 566 | 570 | ||
| @@ -605,19 +609,20 @@ filelayout_free_lseg(struct pnfs_layout_segment *lseg) | |||
| 605 | 609 | ||
| 606 | static struct pnfs_layout_segment * | 610 | static struct pnfs_layout_segment * |
| 607 | filelayout_alloc_lseg(struct pnfs_layout_hdr *layoutid, | 611 | filelayout_alloc_lseg(struct pnfs_layout_hdr *layoutid, |
| 608 | struct nfs4_layoutget_res *lgr) | 612 | struct nfs4_layoutget_res *lgr, |
| 613 | gfp_t gfp_flags) | ||
| 609 | { | 614 | { |
| 610 | struct nfs4_filelayout_segment *fl; | 615 | struct nfs4_filelayout_segment *fl; |
| 611 | int rc; | 616 | int rc; |
| 612 | struct nfs4_deviceid id; | 617 | struct nfs4_deviceid id; |
| 613 | 618 | ||
| 614 | dprintk("--> %s\n", __func__); | 619 | dprintk("--> %s\n", __func__); |
| 615 | fl = kzalloc(sizeof(*fl), GFP_KERNEL); | 620 | fl = kzalloc(sizeof(*fl), gfp_flags); |
| 616 | if (!fl) | 621 | if (!fl) |
| 617 | return NULL; | 622 | return NULL; |
| 618 | 623 | ||
| 619 | rc = filelayout_decode_layout(layoutid, fl, lgr, &id); | 624 | rc = filelayout_decode_layout(layoutid, fl, lgr, &id, gfp_flags); |
| 620 | if (rc != 0 || filelayout_check_layout(layoutid, fl, lgr, &id)) { | 625 | if (rc != 0 || filelayout_check_layout(layoutid, fl, lgr, &id, gfp_flags)) { |
| 621 | _filelayout_free_lseg(fl); | 626 | _filelayout_free_lseg(fl); |
| 622 | return NULL; | 627 | return NULL; |
| 623 | } | 628 | } |
| @@ -633,7 +638,7 @@ filelayout_alloc_lseg(struct pnfs_layout_hdr *layoutid, | |||
| 633 | int size = (fl->stripe_type == STRIPE_SPARSE) ? | 638 | int size = (fl->stripe_type == STRIPE_SPARSE) ? |
| 634 | fl->dsaddr->ds_num : fl->dsaddr->stripe_count; | 639 | fl->dsaddr->ds_num : fl->dsaddr->stripe_count; |
| 635 | 640 | ||
| 636 | fl->commit_buckets = kcalloc(size, sizeof(struct list_head), GFP_KERNEL); | 641 | fl->commit_buckets = kcalloc(size, sizeof(struct list_head), gfp_flags); |
| 637 | if (!fl->commit_buckets) { | 642 | if (!fl->commit_buckets) { |
| 638 | filelayout_free_lseg(&fl->generic_hdr); | 643 | filelayout_free_lseg(&fl->generic_hdr); |
| 639 | return NULL; | 644 | return NULL; |
