Skip to content

Commit

Permalink
hugetlbfs: fix quota leak
Browse files Browse the repository at this point in the history
In the error path of both shared and private hugetlb page allocation,
the file system quota is never undone, leading to fs quota leak.  Fix
them up.

[akpm@linux-foundation.org: cleanup, micro-optimise]
Signed-off-by: Ken Chen <kenchen@google.com>
Acked-by: Adam Litke <agl@us.ibm.com>
Cc: David Gibson <david@gibson.dropbear.id.au>
Cc: William Lee Irwin III <wli@holomorphy.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Ken Chen authored and Linus Torvalds committed Jan 14, 2008
1 parent 747d016 commit 68842c9
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions mm/hugetlb.c
Original file line number Diff line number Diff line change
Expand Up @@ -418,9 +418,14 @@ static struct page *alloc_huge_page_private(struct vm_area_struct *vma,
if (free_huge_pages > resv_huge_pages)
page = dequeue_huge_page(vma, addr);
spin_unlock(&hugetlb_lock);
if (!page)
if (!page) {
page = alloc_buddy_huge_page(vma, addr);
return page ? page : ERR_PTR(-VM_FAULT_OOM);
if (!page) {
hugetlb_put_quota(vma->vm_file->f_mapping, 1);
return ERR_PTR(-VM_FAULT_OOM);
}
}
return page;
}

static struct page *alloc_huge_page(struct vm_area_struct *vma,
Expand Down Expand Up @@ -1206,8 +1211,10 @@ int hugetlb_reserve_pages(struct inode *inode, long from, long to)
if (hugetlb_get_quota(inode->i_mapping, chg))
return -ENOSPC;
ret = hugetlb_acct_memory(chg);
if (ret < 0)
if (ret < 0) {
hugetlb_put_quota(inode->i_mapping, chg);
return ret;
}
region_add(&inode->i_mapping->private_list, from, to);
return 0;
}
Expand Down

0 comments on commit 68842c9

Please sign in to comment.