aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorKinglong Mee <kinglongmee@gmail.com>2016-01-31 20:39:29 -0500
committerTrond Myklebust <trond.myklebust@primarydata.com>2016-02-17 11:44:45 -0500
commitc89757061a4e4017a21ef632dc100449a7bab7dd (patch)
treeef374a739521b914a690f6ad576e31c07c79e115 /fs
parent4bdf87ebda016b864b388f96ae349e76983ebac4 (diff)
pnfs/blocklayout: fix a memeory leak when using,vmalloc_to_page
unreferenced object 0xffffc90000abf000 (size 16900): comm "fsync02", pid 15765, jiffies 4297431627 (age 423.772s) hex dump (first 32 bytes): 00 00 00 00 00 00 00 00 00 a0 c2 19 00 88 ff ff ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ backtrace: [<ffffffff8174d54e>] kmemleak_alloc+0x4e/0xb0 [<ffffffff811b9b91>] __vmalloc_node_range+0x231/0x280 [<ffffffff811b9c2a>] __vmalloc+0x4a/0x50 [<ffffffffa02c9ec1>] ext_tree_prepare_commit+0x231/0x2e0 [blocklayoutdriver] [<ffffffffa02c700e>] bl_prepare_layoutcommit+0xe/0x10 [blocklayoutdriver] [<ffffffffa0596a6c>] pnfs_layoutcommit_inode+0x29c/0x330 [nfsv4] [<ffffffffa0596b13>] pnfs_generic_sync+0x13/0x20 [nfsv4] [<ffffffffa0585188>] nfs4_file_fsync+0x58/0x150 [nfsv4] [<ffffffff81228e5b>] vfs_fsync_range+0x4b/0xb0 [<ffffffff81228f1d>] do_fsync+0x3d/0x70 [<ffffffff812291d0>] SyS_fsync+0x10/0x20 [<ffffffff81757def>] entry_SYSCALL_64_fastpath+0x12/0x76 [<ffffffffffffffff>] 0xffffffffffffffff v2, add missing include header Signed-off-by: Kinglong Mee <kinglongmee@gmail.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/nfs/blocklayout/extent_tree.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/nfs/blocklayout/extent_tree.c b/fs/nfs/blocklayout/extent_tree.c
index c59a59c37f3d..35ab51c04814 100644
--- a/fs/nfs/blocklayout/extent_tree.c
+++ b/fs/nfs/blocklayout/extent_tree.c
@@ -476,6 +476,7 @@ static void ext_tree_free_commitdata(struct nfs4_layoutcommit_args *arg,
476 476
477 for (i = 0; i < nr_pages; i++) 477 for (i = 0; i < nr_pages; i++)
478 put_page(arg->layoutupdate_pages[i]); 478 put_page(arg->layoutupdate_pages[i]);
479 vfree(arg->start_p);
479 kfree(arg->layoutupdate_pages); 480 kfree(arg->layoutupdate_pages);
480 } else { 481 } else {
481 put_page(arg->layoutupdate_page); 482 put_page(arg->layoutupdate_page);
@@ -559,10 +560,15 @@ retry:
559 560
560 if (unlikely(arg->layoutupdate_pages != &arg->layoutupdate_page)) { 561 if (unlikely(arg->layoutupdate_pages != &arg->layoutupdate_page)) {
561 void *p = start_p, *end = p + arg->layoutupdate_len; 562 void *p = start_p, *end = p + arg->layoutupdate_len;
563 struct page *page = NULL;
562 int i = 0; 564 int i = 0;
563 565
564 for ( ; p < end; p += PAGE_SIZE) 566 arg->start_p = start_p;
565 arg->layoutupdate_pages[i++] = vmalloc_to_page(p); 567 for ( ; p < end; p += PAGE_SIZE) {
568 page = vmalloc_to_page(p);
569 arg->layoutupdate_pages[i++] = page;
570 get_page(page);
571 }
566 } 572 }
567 573
568 dprintk("%s found %zu ranges\n", __func__, count); 574 dprintk("%s found %zu ranges\n", __func__, count);