diff options
Diffstat (limited to 'fs/nfs/blocklayout/extent_tree.c')
-rw-r--r-- | fs/nfs/blocklayout/extent_tree.c | 10 |
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); |