aboutsummaryrefslogtreecommitdiffstats
path: root/fs/hugetlbfs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/hugetlbfs')
-rw-r--r--fs/hugetlbfs/inode.c54
1 files changed, 21 insertions, 33 deletions
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index 4fbd9fccd550..7913e3252167 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -626,9 +626,15 @@ static int hugetlbfs_statfs(struct dentry *dentry, struct kstatfs *buf)
626 spin_lock(&sbinfo->stat_lock); 626 spin_lock(&sbinfo->stat_lock);
627 /* If no limits set, just report 0 for max/free/used 627 /* If no limits set, just report 0 for max/free/used
628 * blocks, like simple_statfs() */ 628 * blocks, like simple_statfs() */
629 if (sbinfo->max_blocks >= 0) { 629 if (sbinfo->spool) {
630 buf->f_blocks = sbinfo->max_blocks; 630 long free_pages;
631 buf->f_bavail = buf->f_bfree = sbinfo->free_blocks; 631
632 spin_lock(&sbinfo->spool->lock);
633 buf->f_blocks = sbinfo->spool->max_hpages;
634 free_pages = sbinfo->spool->max_hpages
635 - sbinfo->spool->used_hpages;
636 buf->f_bavail = buf->f_bfree = free_pages;
637 spin_unlock(&sbinfo->spool->lock);
632 buf->f_files = sbinfo->max_inodes; 638 buf->f_files = sbinfo->max_inodes;
633 buf->f_ffree = sbinfo->free_inodes; 639 buf->f_ffree = sbinfo->free_inodes;
634 } 640 }
@@ -644,6 +650,10 @@ static void hugetlbfs_put_super(struct super_block *sb)
644 650
645 if (sbi) { 651 if (sbi) {
646 sb->s_fs_info = NULL; 652 sb->s_fs_info = NULL;
653
654 if (sbi->spool)
655 hugepage_put_subpool(sbi->spool);
656
647 kfree(sbi); 657 kfree(sbi);
648 } 658 }
649} 659}
@@ -874,10 +884,14 @@ hugetlbfs_fill_super(struct super_block *sb, void *data, int silent)
874 sb->s_fs_info = sbinfo; 884 sb->s_fs_info = sbinfo;
875 sbinfo->hstate = config.hstate; 885 sbinfo->hstate = config.hstate;
876 spin_lock_init(&sbinfo->stat_lock); 886 spin_lock_init(&sbinfo->stat_lock);
877 sbinfo->max_blocks = config.nr_blocks;
878 sbinfo->free_blocks = config.nr_blocks;
879 sbinfo->max_inodes = config.nr_inodes; 887 sbinfo->max_inodes = config.nr_inodes;
880 sbinfo->free_inodes = config.nr_inodes; 888 sbinfo->free_inodes = config.nr_inodes;
889 sbinfo->spool = NULL;
890 if (config.nr_blocks != -1) {
891 sbinfo->spool = hugepage_new_subpool(config.nr_blocks);
892 if (!sbinfo->spool)
893 goto out_free;
894 }
881 sb->s_maxbytes = MAX_LFS_FILESIZE; 895 sb->s_maxbytes = MAX_LFS_FILESIZE;
882 sb->s_blocksize = huge_page_size(config.hstate); 896 sb->s_blocksize = huge_page_size(config.hstate);
883 sb->s_blocksize_bits = huge_page_shift(config.hstate); 897 sb->s_blocksize_bits = huge_page_shift(config.hstate);
@@ -896,38 +910,12 @@ hugetlbfs_fill_super(struct super_block *sb, void *data, int silent)
896 sb->s_root = root; 910 sb->s_root = root;
897 return 0; 911 return 0;
898out_free: 912out_free:
913 if (sbinfo->spool)
914 kfree(sbinfo->spool);
899 kfree(sbinfo); 915 kfree(sbinfo);
900 return -ENOMEM; 916 return -ENOMEM;
901} 917}
902 918
903int hugetlb_get_quota(struct address_space *mapping, long delta)
904{
905 int ret = 0;
906 struct hugetlbfs_sb_info *sbinfo = HUGETLBFS_SB(mapping->host->i_sb);
907
908 if (sbinfo->free_blocks > -1) {
909 spin_lock(&sbinfo->stat_lock);
910 if (sbinfo->free_blocks - delta >= 0)
911 sbinfo->free_blocks -= delta;
912 else
913 ret = -ENOMEM;
914 spin_unlock(&sbinfo->stat_lock);
915 }
916
917 return ret;
918}
919
920void hugetlb_put_quota(struct address_space *mapping, long delta)
921{
922 struct hugetlbfs_sb_info *sbinfo = HUGETLBFS_SB(mapping->host->i_sb);
923
924 if (sbinfo->free_blocks > -1) {
925 spin_lock(&sbinfo->stat_lock);
926 sbinfo->free_blocks += delta;
927 spin_unlock(&sbinfo->stat_lock);
928 }
929}
930
931static struct dentry *hugetlbfs_mount(struct file_system_type *fs_type, 919static struct dentry *hugetlbfs_mount(struct file_system_type *fs_type,
932 int flags, const char *dev_name, void *data) 920 int flags, const char *dev_name, void *data)
933{ 921{