diff options
| -rw-r--r-- | fs/hugetlbfs/inode.c | 10 | ||||
| -rw-r--r-- | include/linux/hugetlb.h | 4 | ||||
| -rw-r--r-- | mm/hugetlb.c | 4 |
3 files changed, 9 insertions, 9 deletions
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 6513f5655861..09ee07f02663 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
| @@ -858,15 +858,15 @@ out_free: | |||
| 858 | return -ENOMEM; | 858 | return -ENOMEM; |
| 859 | } | 859 | } |
| 860 | 860 | ||
| 861 | int hugetlb_get_quota(struct address_space *mapping) | 861 | int hugetlb_get_quota(struct address_space *mapping, long delta) |
| 862 | { | 862 | { |
| 863 | int ret = 0; | 863 | int ret = 0; |
| 864 | struct hugetlbfs_sb_info *sbinfo = HUGETLBFS_SB(mapping->host->i_sb); | 864 | struct hugetlbfs_sb_info *sbinfo = HUGETLBFS_SB(mapping->host->i_sb); |
| 865 | 865 | ||
| 866 | if (sbinfo->free_blocks > -1) { | 866 | if (sbinfo->free_blocks > -1) { |
| 867 | spin_lock(&sbinfo->stat_lock); | 867 | spin_lock(&sbinfo->stat_lock); |
| 868 | if (sbinfo->free_blocks > 0) | 868 | if (sbinfo->free_blocks - delta >= 0) |
| 869 | sbinfo->free_blocks--; | 869 | sbinfo->free_blocks -= delta; |
| 870 | else | 870 | else |
| 871 | ret = -ENOMEM; | 871 | ret = -ENOMEM; |
| 872 | spin_unlock(&sbinfo->stat_lock); | 872 | spin_unlock(&sbinfo->stat_lock); |
| @@ -875,13 +875,13 @@ int hugetlb_get_quota(struct address_space *mapping) | |||
| 875 | return ret; | 875 | return ret; |
| 876 | } | 876 | } |
| 877 | 877 | ||
| 878 | void hugetlb_put_quota(struct address_space *mapping) | 878 | void hugetlb_put_quota(struct address_space *mapping, long delta) |
| 879 | { | 879 | { |
| 880 | struct hugetlbfs_sb_info *sbinfo = HUGETLBFS_SB(mapping->host->i_sb); | 880 | struct hugetlbfs_sb_info *sbinfo = HUGETLBFS_SB(mapping->host->i_sb); |
| 881 | 881 | ||
| 882 | if (sbinfo->free_blocks > -1) { | 882 | if (sbinfo->free_blocks > -1) { |
| 883 | spin_lock(&sbinfo->stat_lock); | 883 | spin_lock(&sbinfo->stat_lock); |
| 884 | sbinfo->free_blocks++; | 884 | sbinfo->free_blocks += delta; |
| 885 | spin_unlock(&sbinfo->stat_lock); | 885 | spin_unlock(&sbinfo->stat_lock); |
| 886 | } | 886 | } |
| 887 | } | 887 | } |
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index e22368656b38..8104e5af75ab 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h | |||
| @@ -165,8 +165,8 @@ static inline struct hugetlbfs_sb_info *HUGETLBFS_SB(struct super_block *sb) | |||
| 165 | extern const struct file_operations hugetlbfs_file_operations; | 165 | extern const struct file_operations hugetlbfs_file_operations; |
| 166 | extern struct vm_operations_struct hugetlb_vm_ops; | 166 | extern struct vm_operations_struct hugetlb_vm_ops; |
| 167 | struct file *hugetlb_file_setup(const char *name, size_t); | 167 | struct file *hugetlb_file_setup(const char *name, size_t); |
| 168 | int hugetlb_get_quota(struct address_space *mapping); | 168 | int hugetlb_get_quota(struct address_space *mapping, long delta); |
| 169 | void hugetlb_put_quota(struct address_space *mapping); | 169 | void hugetlb_put_quota(struct address_space *mapping, long delta); |
| 170 | 170 | ||
| 171 | static inline int is_file_hugepages(struct file *file) | 171 | static inline int is_file_hugepages(struct file *file) |
| 172 | { | 172 | { |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index bc12b0adfa87..1e317465ecd1 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
| @@ -132,7 +132,7 @@ static void free_huge_page(struct page *page) | |||
| 132 | } | 132 | } |
| 133 | spin_unlock(&hugetlb_lock); | 133 | spin_unlock(&hugetlb_lock); |
| 134 | if (mapping) | 134 | if (mapping) |
| 135 | hugetlb_put_quota(mapping); | 135 | hugetlb_put_quota(mapping, 1); |
| 136 | set_page_private(page, 0); | 136 | set_page_private(page, 0); |
| 137 | } | 137 | } |
| 138 | 138 | ||
| @@ -390,7 +390,7 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma, | |||
| 390 | struct page *page; | 390 | struct page *page; |
| 391 | struct address_space *mapping = vma->vm_file->f_mapping; | 391 | struct address_space *mapping = vma->vm_file->f_mapping; |
| 392 | 392 | ||
| 393 | if (hugetlb_get_quota(mapping)) | 393 | if (hugetlb_get_quota(mapping, 1)) |
| 394 | return ERR_PTR(-VM_FAULT_SIGBUS); | 394 | return ERR_PTR(-VM_FAULT_SIGBUS); |
| 395 | 395 | ||
| 396 | if (vma->vm_flags & VM_MAYSHARE) | 396 | if (vma->vm_flags & VM_MAYSHARE) |
