Patch "NFS: Use GFP_NOIO for two allocations in writeback" has been added to the 4.11-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
NFS: Use GFP_NOIO for two allocations in writeback
to the 4.11-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
nfs-use-gfp_noio-for-two-allocations-in-writeback.patch
and it can be found in the queue-4.11 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
ae97aa524ef495b6276fd26f5d5449fb22975d7cMon Sep 17 00:00:00 2001
From: Benjamin Coddington <[email protected]>
Date: Wed, 19 Apr 2017 10:11:33 -0400
Subject: NFS: Use GFP_NOIO for two allocations in writeback
From: Benjamin Coddington <[email protected]>
commit ae97aa524ef495b6276fd26f5d5449fb22975d7c upstream.
Prevent a deadlock that can occur if we wait on allocations that try to write back our pages.
--- fs/nfs/pagelist.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
fs/nfs/pagelist.c +11 -4
@@ -29,13 +29,14 @@static struct kmem_cache *nfs_page_cachep;static const struct rpc_call_ops nfs_pgio_common_ops; -static bool nfs_pgarray_set (struct nfs_page_array *p,unsigned int pagecount) +static bool nfs_pgarray_set (struct nfs_page_array *p,unsigned int pagecount, +gfp_t gfp_flags) { p->npages = pagecount;if (pagecount <=ARRAY_SIZE (p->page_array)) p->pagevec = p->page_array;else { - p->pagevec =kcalloc (pagecount,sizeof (struct page *),GFP_KERNEL ); + p->pagevec =kcalloc (pagecount,sizeof (struct page *), gfp_flags);if (!p->pagevec) p->npages =0 ; }
@@ -681,6 +682,7 @@ void nfs_pageio_init(struct nfs_pageio_d {struct nfs_pgio_mirror *new;int i; +gfp_t gfp_flags =GFP_KERNEL ; desc->pg_moreio =0 ; desc->pg_inode = inode;
@@ -700,8 +702,10 @@ void nfs_pageio_init(struct nfs_pageio_dif (pg_ops->pg_get_mirror_count) {/* until we have a request, we don't have an lseg and no * idea how many mirrors there will be */ +if (desc->pg_rw_ops->rw_mode ==FMODE_WRITE ) + gfp_flags =GFP_NOIO ; new =kcalloc (NFS_PAGEIO_DESCRIPTOR_MIRROR_MAX , -sizeof (struct nfs_pgio_mirror ),GFP_KERNEL ); +sizeof (struct nfs_pgio_mirror ), gfp_flags); desc->pg_mirrors_dynamic = new; desc->pg_mirrors = new;
@@ -755,9 +759,12 @@ int nfs_generic_pgio(struct nfs_pageio_dstruct list_head *head = &mirror->pg_list;struct nfs_commit_info cinfo;unsigned int pagecount, pageused; +gfp_t gfp_flags =GFP_KERNEL ; pagecount =nfs_page_array_len (mirror->pg_base, mirror->pg_count); -if (!nfs_pgarray_set (&hdr->page_array, pagecount)) { +if (desc->pg_rw_ops->rw_mode ==FMODE_WRITE ) + gfp_flags =GFP_NOIO ; +if (!nfs_pgarray_set (&hdr->page_array, pagecount, gfp_flags)) {nfs_pgio_error (hdr); desc->pg_error = -ENOMEM ;return desc->pg_error;
Patches currently in stable-queue which might be from [email protected] are
queue-4.11/nfs-use-gfp_noio-for-two-allocations-in-writeback.patch