diff options
Diffstat (limited to 'fs/hugetlbfs/inode.c')
| -rw-r--r-- | fs/hugetlbfs/inode.c | 45 | 
1 files changed, 30 insertions, 15 deletions
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index d19b30ababf..1e2872b2534 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -6,6 +6,8 @@   * Copyright (C) 2002 Linus Torvalds.   */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/module.h>  #include <linux/thread_info.h>  #include <asm/current.h> @@ -366,7 +368,13 @@ static void truncate_hugepages(struct inode *inode, loff_t lstart)  static void hugetlbfs_evict_inode(struct inode *inode)  { +	struct resv_map *resv_map; +  	truncate_hugepages(inode, 0); +	resv_map = (struct resv_map *)inode->i_mapping->private_data; +	/* root inode doesn't have the resv_map, so we should check it */ +	if (resv_map) +		resv_map_release(&resv_map->refs);  	clear_inode(inode);  } @@ -469,13 +477,18 @@ static struct inode *hugetlbfs_get_root(struct super_block *sb,   * annotation because huge_pmd_share() does an allocation under   * i_mmap_mutex.   */ -struct lock_class_key hugetlbfs_i_mmap_mutex_key; +static struct lock_class_key hugetlbfs_i_mmap_mutex_key;  static struct inode *hugetlbfs_get_inode(struct super_block *sb,  					struct inode *dir,  					umode_t mode, dev_t dev)  {  	struct inode *inode; +	struct resv_map *resv_map; + +	resv_map = resv_map_alloc(); +	if (!resv_map) +		return NULL;  	inode = new_inode(sb);  	if (inode) { @@ -487,7 +500,7 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb,  		inode->i_mapping->a_ops = &hugetlbfs_aops;  		inode->i_mapping->backing_dev_info =&hugetlbfs_backing_dev_info;  		inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; -		INIT_LIST_HEAD(&inode->i_mapping->private_list); +		inode->i_mapping->private_data = resv_map;  		info = HUGETLBFS_I(inode);  		/*  		 * The policy is initialized here even if we are creating a @@ -517,7 +530,9 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb,  			break;  		}  		lockdep_annotate_inode_mutex_key(inode); -	} +	} else +		kref_put(&resv_map->refs, resv_map_release); +  	return inode;  } @@ -810,8 +825,7 @@ hugetlbfs_parse_options(char *options, struct hugetlbfs_config *pconfig)  			ps = memparse(args[0].from, &rest);  			pconfig->hstate = size_to_hstate(ps);  			if (!pconfig->hstate) { -				printk(KERN_ERR -				"hugetlbfs: Unsupported page size %lu MB\n", +				pr_err("Unsupported page size %lu MB\n",  					ps >> 20);  				return -EINVAL;  			} @@ -819,8 +833,7 @@ hugetlbfs_parse_options(char *options, struct hugetlbfs_config *pconfig)  		}  		default: -			printk(KERN_ERR "hugetlbfs: Bad mount option: \"%s\"\n", -				 p); +			pr_err("Bad mount option: \"%s\"\n", p);  			return -EINVAL;  			break;  		} @@ -840,8 +853,7 @@ hugetlbfs_parse_options(char *options, struct hugetlbfs_config *pconfig)  	return 0;  bad_val: - 	printk(KERN_ERR "hugetlbfs: Bad value '%s' for mount option '%s'\n", -	       args[0].from, p); +	pr_err("Bad value '%s' for mount option '%s'\n", args[0].from, p);   	return -EINVAL;  } @@ -889,8 +901,7 @@ hugetlbfs_fill_super(struct super_block *sb, void *data, int silent)  		goto out_free;  	return 0;  out_free: -	if (sbinfo->spool) -		kfree(sbinfo->spool); +	kfree(sbinfo->spool);  	kfree(sbinfo);  	return -ENOMEM;  } @@ -926,7 +937,7 @@ static int get_hstate_idx(int page_size_log)  	return h - hstates;  } -static struct dentry_operations anon_ops = { +static const struct dentry_operations anon_ops = {  	.d_dname = simple_dname  }; @@ -957,8 +968,7 @@ struct file *hugetlb_file_setup(const char *name, size_t size,  		*user = current_user();  		if (user_shm_lock(size, *user)) {  			task_lock(current); -			printk_once(KERN_WARNING -				"%s (%d): Using mlock ulimits for SHM_HUGETLB is deprecated\n", +			pr_warn_once("%s (%d): Using mlock ulimits for SHM_HUGETLB is deprecated\n",  				current->comm, current->pid);  			task_unlock(current);  		} else { @@ -1017,6 +1027,11 @@ static int __init init_hugetlbfs_fs(void)  	int error;  	int i; +	if (!hugepages_supported()) { +		pr_info("disabling because there are no supported hugepage sizes\n"); +		return -ENOTSUPP; +	} +  	error = bdi_init(&hugetlbfs_backing_dev_info);  	if (error)  		return error; @@ -1042,7 +1057,7 @@ static int __init init_hugetlbfs_fs(void)  							buf);  		if (IS_ERR(hugetlbfs_vfsmount[i])) { -			pr_err("hugetlb: Cannot mount internal hugetlbfs for " +			pr_err("Cannot mount internal hugetlbfs for "  				"page size %uK", ps_kb);  			error = PTR_ERR(hugetlbfs_vfsmount[i]);  			hugetlbfs_vfsmount[i] = NULL;  | 
