Skip to content

Commit 0bae835

Browse files
author
Trond Myklebust
committed
NFS: Avoid writeback threads getting stuck in mempool_alloc()
In a low memory situation, allow the NFS writeback code to fail without getting stuck in infinite loops in mempool_alloc(). Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
1 parent 515dcdc commit 0bae835

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed

fs/nfs/pagelist.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,10 @@ void nfs_set_pgio_error(struct nfs_pgio_header *hdr, int error, loff_t pos)
9090
}
9191
}
9292

93-
static inline struct nfs_page *
94-
nfs_page_alloc(void)
93+
static inline struct nfs_page *nfs_page_alloc(void)
9594
{
96-
struct nfs_page *p = kmem_cache_zalloc(nfs_page_cachep, GFP_KERNEL);
95+
struct nfs_page *p =
96+
kmem_cache_zalloc(nfs_page_cachep, nfs_io_gfp_mask());
9797
if (p)
9898
INIT_LIST_HEAD(&p->wb_list);
9999
return p;
@@ -892,7 +892,7 @@ int nfs_generic_pgio(struct nfs_pageio_descriptor *desc,
892892
struct nfs_commit_info cinfo;
893893
struct nfs_page_array *pg_array = &hdr->page_array;
894894
unsigned int pagecount, pageused;
895-
gfp_t gfp_flags = GFP_KERNEL;
895+
gfp_t gfp_flags = nfs_io_gfp_mask();
896896

897897
pagecount = nfs_page_array_len(mirror->pg_base, mirror->pg_count);
898898
pg_array->npages = pagecount;
@@ -979,7 +979,7 @@ nfs_pageio_alloc_mirrors(struct nfs_pageio_descriptor *desc,
979979
desc->pg_mirrors_dynamic = NULL;
980980
if (mirror_count == 1)
981981
return desc->pg_mirrors_static;
982-
ret = kmalloc_array(mirror_count, sizeof(*ret), GFP_KERNEL);
982+
ret = kmalloc_array(mirror_count, sizeof(*ret), nfs_io_gfp_mask());
983983
if (ret != NULL) {
984984
for (i = 0; i < mirror_count; i++)
985985
nfs_pageio_mirror_init(&ret[i], desc->pg_bsize);

fs/nfs/write.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,15 @@ EXPORT_SYMBOL_GPL(nfs_commit_free);
9494

9595
static struct nfs_pgio_header *nfs_writehdr_alloc(void)
9696
{
97-
struct nfs_pgio_header *p = mempool_alloc(nfs_wdata_mempool, GFP_KERNEL);
97+
struct nfs_pgio_header *p;
9898

99-
memset(p, 0, sizeof(*p));
99+
p = kmem_cache_zalloc(nfs_wdata_cachep, nfs_io_gfp_mask());
100+
if (!p) {
101+
p = mempool_alloc(nfs_wdata_mempool, GFP_NOWAIT);
102+
if (!p)
103+
return NULL;
104+
memset(p, 0, sizeof(*p));
105+
}
100106
p->rw_mode = FMODE_WRITE;
101107
return p;
102108
}

0 commit comments

Comments
 (0)