pNFS: Refactor nfs4_layoutget_release()
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 30 May 2018 21:16:20 +0000 (17:16 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 31 May 2018 19:03:11 +0000 (15:03 -0400)
Move the actual freeing of the struct nfs4_layoutget into fs/nfs/pnfs.c
where it can be reused by the layoutget on open code.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/nfs4proc.c
fs/nfs/pnfs.c
fs/nfs/pnfs.h

index 062a9c753b7e4a6cd751dd3cd8cb5b0dda097e71..0e6db190a8745a14ca1ddbbb6870f8af36dbdc58 100644 (file)
@@ -8692,58 +8692,13 @@ size_t max_response_pages(struct nfs_server *server)
        return nfs_page_array_len(0, max_resp_sz);
 }
 
-static void nfs4_free_pages(struct page **pages, size_t size)
-{
-       int i;
-
-       if (!pages)
-               return;
-
-       for (i = 0; i < size; i++) {
-               if (!pages[i])
-                       break;
-               __free_page(pages[i]);
-       }
-       kfree(pages);
-}
-
-struct page **nfs4_alloc_pages(size_t size, gfp_t gfp_flags)
-{
-       struct page **pages;
-       int i;
-
-       pages = kcalloc(size, sizeof(struct page *), gfp_flags);
-       if (!pages) {
-               dprintk("%s: can't alloc array of %zu pages\n", __func__, size);
-               return NULL;
-       }
-
-       for (i = 0; i < size; i++) {
-               pages[i] = alloc_page(gfp_flags);
-               if (!pages[i]) {
-                       dprintk("%s: failed to allocate page\n", __func__);
-                       nfs4_free_pages(pages, size);
-                       return NULL;
-               }
-       }
-
-       return pages;
-}
-
 static void nfs4_layoutget_release(void *calldata)
 {
        struct nfs4_layoutget *lgp = calldata;
-       struct inode *inode = lgp->args.inode;
-       size_t max_pages = lgp->args.layout.pglen / PAGE_SIZE;
 
        dprintk("--> %s\n", __func__);
        nfs4_sequence_free_slot(&lgp->res.seq_res);
-       nfs4_free_pages(lgp->args.layout.pages, max_pages);
-       if (inode)
-               pnfs_put_layout_hdr(NFS_I(inode)->layout);
-       put_rpccred(lgp->cred);
-       put_nfs_open_context(lgp->args.ctx);
-       kfree(calldata);
+       pnfs_layoutget_free(lgp);
        dprintk("<-- %s\n", __func__);
 }
 
index a0a2484c3aed606ac1308f96a1ca6008dc57cf71..f568a1de5ec58ebdc55bb0b6b2411afdb1701108 100644 (file)
@@ -931,6 +931,44 @@ pnfs_find_server(struct inode *inode, struct nfs_open_context *ctx)
        return server;
 }
 
+static void nfs4_free_pages(struct page **pages, size_t size)
+{
+       int i;
+
+       if (!pages)
+               return;
+
+       for (i = 0; i < size; i++) {
+               if (!pages[i])
+                       break;
+               __free_page(pages[i]);
+       }
+       kfree(pages);
+}
+
+static struct page **nfs4_alloc_pages(size_t size, gfp_t gfp_flags)
+{
+       struct page **pages;
+       int i;
+
+       pages = kcalloc(size, sizeof(struct page *), gfp_flags);
+       if (!pages) {
+               dprintk("%s: can't alloc array of %zu pages\n", __func__, size);
+               return NULL;
+       }
+
+       for (i = 0; i < size; i++) {
+               pages[i] = alloc_page(gfp_flags);
+               if (!pages[i]) {
+                       dprintk("%s: failed to allocate page\n", __func__);
+                       nfs4_free_pages(pages, size);
+                       return NULL;
+               }
+       }
+
+       return pages;
+}
+
 static struct nfs4_layoutget *
 pnfs_alloc_init_layoutget_args(struct inode *ino,
           struct nfs_open_context *ctx,
@@ -982,6 +1020,18 @@ pnfs_alloc_init_layoutget_args(struct inode *ino,
        return lgp;
 }
 
+void pnfs_layoutget_free(struct nfs4_layoutget *lgp)
+{
+       size_t max_pages = lgp->args.layout.pglen / PAGE_SIZE;
+
+       nfs4_free_pages(lgp->args.layout.pages, max_pages);
+       if (lgp->args.inode)
+               pnfs_put_layout_hdr(NFS_I(lgp->args.inode)->layout);
+       put_rpccred(lgp->cred);
+       put_nfs_open_context(lgp->args.ctx);
+       kfree(lgp);
+}
+
 static void pnfs_clear_layoutcommit(struct inode *inode,
                struct list_head *head)
 {
index b110c09ea89c7a726378dd95666b52e39767c407..9941df824ca905492108c4aae11297e2a87fcc20 100644 (file)
@@ -227,7 +227,6 @@ extern void pnfs_unregister_layoutdriver(struct pnfs_layoutdriver_type *);
 
 /* nfs4proc.c */
 extern size_t max_response_pages(struct nfs_server *server);
-extern struct page **nfs4_alloc_pages(size_t size, gfp_t gfp_flags);
 extern int nfs4_proc_getdeviceinfo(struct nfs_server *server,
                                   struct pnfs_device *dev,
                                   struct rpc_cred *cred);
@@ -251,6 +250,7 @@ size_t pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio,
                            struct nfs_page *prev, struct nfs_page *req);
 void pnfs_set_lo_fail(struct pnfs_layout_segment *lseg);
 struct pnfs_layout_segment *pnfs_layout_process(struct nfs4_layoutget *lgp);
+void pnfs_layoutget_free(struct nfs4_layoutget *lgp);
 void pnfs_free_lseg_list(struct list_head *tmp_list);
 void pnfs_destroy_layout(struct nfs_inode *);
 void pnfs_destroy_all_layouts(struct nfs_client *);