2010-07-07 11:12:45 +00:00
|
|
|
From: Peter Zijlstra <a.p.zijlstra@chello.nl>
|
|
|
|
Subject: [PATCH 28/31] nfs: fix various memory recursions possible with swap over NFS.
|
|
|
|
Patch-mainline: not yet
|
|
|
|
|
|
|
|
GFP_NOFS is _more_ permissive than GFP_NOIO in that it will initiate IO,
|
|
|
|
just not of any filesystem data.
|
|
|
|
|
|
|
|
The problem is that previuosly NOFS was correct because that avoids
|
|
|
|
recursion into the NFS code, it now is not, because also IO (swap) can
|
|
|
|
lead to this recursion.
|
|
|
|
|
|
|
|
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
|
|
|
|
Signed-off-by: Suresh Jayaraman <sjayaraman@suse.de>
|
|
|
|
---
|
|
|
|
fs/nfs/pagelist.c | 2 +-
|
|
|
|
fs/nfs/write.c | 7 ++++---
|
|
|
|
2 files changed, 5 insertions(+), 4 deletions(-)
|
|
|
|
|
|
|
|
--- a/fs/nfs/pagelist.c
|
|
|
|
+++ b/fs/nfs/pagelist.c
|
|
|
|
@@ -27,7 +27,7 @@ static inline struct nfs_page *
|
2011-04-19 20:09:59 +00:00
|
|
|
static inline struct nfs_page *
|
2010-07-07 11:12:45 +00:00
|
|
|
nfs_page_alloc(void)
|
|
|
|
{
|
2011-04-19 20:09:59 +00:00
|
|
|
- struct nfs_page *p = kmem_cache_zalloc(nfs_page_cachep, GFP_KERNEL);
|
|
|
|
+ struct nfs_page *p = kmem_cache_zalloc(nfs_page_cachep, GFP_NOIO);
|
|
|
|
if (p)
|
2010-07-07 11:12:45 +00:00
|
|
|
INIT_LIST_HEAD(&p->wb_list);
|
2011-04-19 20:09:59 +00:00
|
|
|
return p;
|
2010-07-07 11:12:45 +00:00
|
|
|
--- a/fs/nfs/write.c
|
|
|
|
+++ b/fs/nfs/write.c
|
|
|
|
@@ -50,7 +50,7 @@ static mempool_t *nfs_commit_mempool;
|
|
|
|
|
|
|
|
struct nfs_write_data *nfs_commitdata_alloc(void)
|
|
|
|
{
|
|
|
|
- struct nfs_write_data *p = mempool_alloc(nfs_commit_mempool, GFP_NOFS);
|
|
|
|
+ struct nfs_write_data *p = mempool_alloc(nfs_commit_mempool, GFP_NOIO);
|
|
|
|
|
|
|
|
if (p) {
|
|
|
|
memset(p, 0, sizeof(*p));
|
|
|
|
@@ -69,7 +69,7 @@ void nfs_commit_free(struct nfs_write_da
|
|
|
|
|
|
|
|
struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount)
|
|
|
|
{
|
|
|
|
- struct nfs_write_data *p = mempool_alloc(nfs_wdata_mempool, GFP_NOFS);
|
|
|
|
+ struct nfs_write_data *p = mempool_alloc(nfs_wdata_mempool, GFP_NOIO);
|
|
|
|
|
|
|
|
if (p) {
|
|
|
|
memset(p, 0, sizeof(*p));
|
|
|
|
@@ -79,7 +79,8 @@ struct nfs_write_data *nfs_writedata_all
|
|
|
|
if (pagecount <= ARRAY_SIZE(p->page_array))
|
|
|
|
p->pagevec = p->page_array;
|
|
|
|
else {
|
|
|
|
- p->pagevec = kcalloc(pagecount, sizeof(struct page *), GFP_NOFS);
|
|
|
|
+ p->pagevec = kcalloc(pagecount, sizeof(struct page *),
|
|
|
|
+ GFP_NOIO);
|
|
|
|
if (!p->pagevec) {
|
|
|
|
mempool_free(p, nfs_wdata_mempool);
|
|
|
|
p = NULL;
|