|
@@ -629,23 +629,18 @@ out_put:
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
-static void filelayout_free_fh_array(struct nfs4_filelayout_segment *fl)
|
|
|
+static void _filelayout_free_lseg(struct nfs4_filelayout_segment *fl)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
|
- for (i = 0; i < fl->num_fh; i++) {
|
|
|
- if (!fl->fh_array[i])
|
|
|
- break;
|
|
|
- kfree(fl->fh_array[i]);
|
|
|
+ if (fl->fh_array) {
|
|
|
+ for (i = 0; i < fl->num_fh; i++) {
|
|
|
+ if (!fl->fh_array[i])
|
|
|
+ break;
|
|
|
+ kfree(fl->fh_array[i]);
|
|
|
+ }
|
|
|
+ kfree(fl->fh_array);
|
|
|
}
|
|
|
- kfree(fl->fh_array);
|
|
|
- fl->fh_array = NULL;
|
|
|
-}
|
|
|
-
|
|
|
-static void
|
|
|
-_filelayout_free_lseg(struct nfs4_filelayout_segment *fl)
|
|
|
-{
|
|
|
- filelayout_free_fh_array(fl);
|
|
|
kfree(fl);
|
|
|
}
|
|
|
|
|
@@ -716,21 +711,21 @@ filelayout_decode_layout(struct pnfs_layout_hdr *flo,
|
|
|
/* Do we want to use a mempool here? */
|
|
|
fl->fh_array[i] = kmalloc(sizeof(struct nfs_fh), gfp_flags);
|
|
|
if (!fl->fh_array[i])
|
|
|
- goto out_err_free;
|
|
|
+ goto out_err;
|
|
|
|
|
|
p = xdr_inline_decode(&stream, 4);
|
|
|
if (unlikely(!p))
|
|
|
- goto out_err_free;
|
|
|
+ goto out_err;
|
|
|
fl->fh_array[i]->size = be32_to_cpup(p++);
|
|
|
if (sizeof(struct nfs_fh) < fl->fh_array[i]->size) {
|
|
|
printk(KERN_ERR "NFS: Too big fh %d received %d\n",
|
|
|
i, fl->fh_array[i]->size);
|
|
|
- goto out_err_free;
|
|
|
+ goto out_err;
|
|
|
}
|
|
|
|
|
|
p = xdr_inline_decode(&stream, fl->fh_array[i]->size);
|
|
|
if (unlikely(!p))
|
|
|
- goto out_err_free;
|
|
|
+ goto out_err;
|
|
|
memcpy(fl->fh_array[i]->data, p, fl->fh_array[i]->size);
|
|
|
dprintk("DEBUG: %s: fh len %d\n", __func__,
|
|
|
fl->fh_array[i]->size);
|
|
@@ -739,8 +734,6 @@ filelayout_decode_layout(struct pnfs_layout_hdr *flo,
|
|
|
__free_page(scratch);
|
|
|
return 0;
|
|
|
|
|
|
-out_err_free:
|
|
|
- filelayout_free_fh_array(fl);
|
|
|
out_err:
|
|
|
__free_page(scratch);
|
|
|
return -EIO;
|