diff options
Diffstat (limited to 'fs/hugetlbfs')
-rw-r--r-- | fs/hugetlbfs/inode.c | 54 |
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; |
898 | out_free: | 912 | out_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 | ||
903 | int 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 | |||
920 | void 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 | |||
931 | static struct dentry *hugetlbfs_mount(struct file_system_type *fs_type, | 919 | static 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 | { |