Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=45c682a68a87251d9a01383ce076ab21ee09812e
Commit:     45c682a68a87251d9a01383ce076ab21ee09812e
Parent:     8cde045c7ee97573be6ce495b8f7c918182a2c7a
Author:     Ken Chen <[EMAIL PROTECTED]>
AuthorDate: Wed Nov 14 16:59:44 2007 -0800
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Wed Nov 14 18:45:40 2007 -0800

    hugetlb: fix i_blocks accounting
    
    For administrative purpose, we want to query actual block usage for
    hugetlbfs file via fstat.  Currently, hugetlbfs always return 0.  Fix that
    up since kernel already has all the information to track it properly.
    
    Signed-off-by: Ken Chen <[EMAIL PROTECTED]>
    Acked-by: Adam Litke <[EMAIL PROTECTED]>
    Cc: Badari Pulavarty <[EMAIL PROTECTED]>
    Cc: David Gibson <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 include/linux/hugetlb.h |    2 ++
 mm/hugetlb.c            |   10 ++++++++++
 2 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index 8104e5a..2496879 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -168,6 +168,8 @@ struct file *hugetlb_file_setup(const char *name, size_t);
 int hugetlb_get_quota(struct address_space *mapping, long delta);
 void hugetlb_put_quota(struct address_space *mapping, long delta);
 
+#define BLOCKS_PER_HUGEPAGE    (HPAGE_SIZE / 512)
+
 static inline int is_file_hugepages(struct file *file)
 {
        if (file->f_op == &hugetlbfs_file_operations)
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index abe1e9f..6121b57 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -801,6 +801,7 @@ retry:
 
                if (vma->vm_flags & VM_SHARED) {
                        int err;
+                       struct inode *inode = mapping->host;
 
                        err = add_to_page_cache(page, mapping, idx, GFP_KERNEL);
                        if (err) {
@@ -809,6 +810,10 @@ retry:
                                        goto retry;
                                goto out;
                        }
+
+                       spin_lock(&inode->i_lock);
+                       inode->i_blocks += BLOCKS_PER_HUGEPAGE;
+                       spin_unlock(&inode->i_lock);
                } else
                        lock_page(page);
        }
@@ -1160,6 +1165,11 @@ int hugetlb_reserve_pages(struct inode *inode, long 
from, long to)
 void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed)
 {
        long chg = region_truncate(&inode->i_mapping->private_list, offset);
+
+       spin_lock(&inode->i_lock);
+       inode->i_blocks -= BLOCKS_PER_HUGEPAGE * freed;
+       spin_unlock(&inode->i_lock);
+
        hugetlb_put_quota(inode->i_mapping, (chg - freed));
        hugetlb_acct_memory(-(chg - freed));
 }
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to