Loading fs/nfs/nfs4proc.c +1 −46 Original line number Diff line number Diff line Loading @@ -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__); } Loading fs/nfs/pnfs.c +50 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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) { Loading fs/nfs/pnfs.h +1 −1 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 *); Loading Loading
fs/nfs/nfs4proc.c +1 −46 Original line number Diff line number Diff line Loading @@ -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__); } Loading
fs/nfs/pnfs.c +50 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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) { Loading
fs/nfs/pnfs.h +1 −1 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 *); Loading