diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/hugetlb.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index abe1e9f2a942..6121b57bbe96 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -801,6 +801,7 @@ retry: | |||
801 | 801 | ||
802 | if (vma->vm_flags & VM_SHARED) { | 802 | if (vma->vm_flags & VM_SHARED) { |
803 | int err; | 803 | int err; |
804 | struct inode *inode = mapping->host; | ||
804 | 805 | ||
805 | err = add_to_page_cache(page, mapping, idx, GFP_KERNEL); | 806 | err = add_to_page_cache(page, mapping, idx, GFP_KERNEL); |
806 | if (err) { | 807 | if (err) { |
@@ -809,6 +810,10 @@ retry: | |||
809 | goto retry; | 810 | goto retry; |
810 | goto out; | 811 | goto out; |
811 | } | 812 | } |
813 | |||
814 | spin_lock(&inode->i_lock); | ||
815 | inode->i_blocks += BLOCKS_PER_HUGEPAGE; | ||
816 | spin_unlock(&inode->i_lock); | ||
812 | } else | 817 | } else |
813 | lock_page(page); | 818 | lock_page(page); |
814 | } | 819 | } |
@@ -1160,6 +1165,11 @@ int hugetlb_reserve_pages(struct inode *inode, long from, long to) | |||
1160 | void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed) | 1165 | void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed) |
1161 | { | 1166 | { |
1162 | long chg = region_truncate(&inode->i_mapping->private_list, offset); | 1167 | long chg = region_truncate(&inode->i_mapping->private_list, offset); |
1168 | |||
1169 | spin_lock(&inode->i_lock); | ||
1170 | inode->i_blocks -= BLOCKS_PER_HUGEPAGE * freed; | ||
1171 | spin_unlock(&inode->i_lock); | ||
1172 | |||
1163 | hugetlb_put_quota(inode->i_mapping, (chg - freed)); | 1173 | hugetlb_put_quota(inode->i_mapping, (chg - freed)); |
1164 | hugetlb_acct_memory(-(chg - freed)); | 1174 | hugetlb_acct_memory(-(chg - freed)); |
1165 | } | 1175 | } |