diff options
Diffstat (limited to 'fs/nfs/filelayout/filelayout.c')
-rw-r--r-- | fs/nfs/filelayout/filelayout.c | 31 |
1 files changed, 12 insertions, 19 deletions
diff --git a/fs/nfs/filelayout/filelayout.c b/fs/nfs/filelayout/filelayout.c index b34f2e228601..02ec07973bc4 100644 --- a/fs/nfs/filelayout/filelayout.c +++ b/fs/nfs/filelayout/filelayout.c | |||
@@ -629,23 +629,18 @@ out_put: | |||
629 | goto out; | 629 | goto out; |
630 | } | 630 | } |
631 | 631 | ||
632 | static void filelayout_free_fh_array(struct nfs4_filelayout_segment *fl) | 632 | static void _filelayout_free_lseg(struct nfs4_filelayout_segment *fl) |
633 | { | 633 | { |
634 | int i; | 634 | int i; |
635 | 635 | ||
636 | for (i = 0; i < fl->num_fh; i++) { | 636 | if (fl->fh_array) { |
637 | if (!fl->fh_array[i]) | 637 | for (i = 0; i < fl->num_fh; i++) { |
638 | break; | 638 | if (!fl->fh_array[i]) |
639 | kfree(fl->fh_array[i]); | 639 | break; |
640 | kfree(fl->fh_array[i]); | ||
641 | } | ||
642 | kfree(fl->fh_array); | ||
640 | } | 643 | } |
641 | kfree(fl->fh_array); | ||
642 | fl->fh_array = NULL; | ||
643 | } | ||
644 | |||
645 | static void | ||
646 | _filelayout_free_lseg(struct nfs4_filelayout_segment *fl) | ||
647 | { | ||
648 | filelayout_free_fh_array(fl); | ||
649 | kfree(fl); | 644 | kfree(fl); |
650 | } | 645 | } |
651 | 646 | ||
@@ -716,21 +711,21 @@ filelayout_decode_layout(struct pnfs_layout_hdr *flo, | |||
716 | /* Do we want to use a mempool here? */ | 711 | /* Do we want to use a mempool here? */ |
717 | fl->fh_array[i] = kmalloc(sizeof(struct nfs_fh), gfp_flags); | 712 | fl->fh_array[i] = kmalloc(sizeof(struct nfs_fh), gfp_flags); |
718 | if (!fl->fh_array[i]) | 713 | if (!fl->fh_array[i]) |
719 | goto out_err_free; | 714 | goto out_err; |
720 | 715 | ||
721 | p = xdr_inline_decode(&stream, 4); | 716 | p = xdr_inline_decode(&stream, 4); |
722 | if (unlikely(!p)) | 717 | if (unlikely(!p)) |
723 | goto out_err_free; | 718 | goto out_err; |
724 | fl->fh_array[i]->size = be32_to_cpup(p++); | 719 | fl->fh_array[i]->size = be32_to_cpup(p++); |
725 | if (sizeof(struct nfs_fh) < fl->fh_array[i]->size) { | 720 | if (sizeof(struct nfs_fh) < fl->fh_array[i]->size) { |
726 | printk(KERN_ERR "NFS: Too big fh %d received %d\n", | 721 | printk(KERN_ERR "NFS: Too big fh %d received %d\n", |
727 | i, fl->fh_array[i]->size); | 722 | i, fl->fh_array[i]->size); |
728 | goto out_err_free; | 723 | goto out_err; |
729 | } | 724 | } |
730 | 725 | ||
731 | p = xdr_inline_decode(&stream, fl->fh_array[i]->size); | 726 | p = xdr_inline_decode(&stream, fl->fh_array[i]->size); |
732 | if (unlikely(!p)) | 727 | if (unlikely(!p)) |
733 | goto out_err_free; | 728 | goto out_err; |
734 | memcpy(fl->fh_array[i]->data, p, fl->fh_array[i]->size); | 729 | memcpy(fl->fh_array[i]->data, p, fl->fh_array[i]->size); |
735 | dprintk("DEBUG: %s: fh len %d\n", __func__, | 730 | dprintk("DEBUG: %s: fh len %d\n", __func__, |
736 | fl->fh_array[i]->size); | 731 | fl->fh_array[i]->size); |
@@ -739,8 +734,6 @@ filelayout_decode_layout(struct pnfs_layout_hdr *flo, | |||
739 | __free_page(scratch); | 734 | __free_page(scratch); |
740 | return 0; | 735 | return 0; |
741 | 736 | ||
742 | out_err_free: | ||
743 | filelayout_free_fh_array(fl); | ||
744 | out_err: | 737 | out_err: |
745 | __free_page(scratch); | 738 | __free_page(scratch); |
746 | return -EIO; | 739 | return -EIO; |