Prev: [PATCH -mmotm 23/30] mm: methods for teaching filesystems about PG_swapcache pages
Next: [PATCH -mmotm 19/30] netvm: prevent a stream specific deadlock
From: Xiaotian Feng on 13 Jul 2010 06:30 From df0106f58d7ac2337f74efb1d8caaf27f635e050 Mon Sep 17 00:00:00 2001 From: Xiaotian Feng <dfeng(a)redhat.com> Date: Tue, 13 Jul 2010 13:11:32 +0800 Subject: [PATCH 27/30] nfs: fix various memory recursions possible with swap over NFS. 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(a)chello.nl> Signed-off-by: Suresh Jayaraman <sjayaraman(a)suse.de> Signed-off-by: Xiaotian Feng <dfeng(a)redhat.com> --- fs/nfs/pagelist.c | 2 +- fs/nfs/write.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c index 2be94bb..c0247e9 100644 --- a/fs/nfs/pagelist.c +++ b/fs/nfs/pagelist.c @@ -27,7 +27,7 @@ static inline struct nfs_page * nfs_page_alloc(void) { struct nfs_page *p; - p = kmem_cache_alloc(nfs_page_cachep, GFP_KERNEL); + p = kmem_cache_alloc(nfs_page_cachep, GFP_NOIO); if (p) { memset(p, 0, sizeof(*p)); INIT_LIST_HEAD(&p->wb_list); diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 5852b20..dfa08cb 100644 --- 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_data *p) 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,7 @@ struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount) 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; -- 1.7.1.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |