diff options
Diffstat (limited to 'fs/hugetlbfs/inode.c')
| -rw-r--r-- | fs/hugetlbfs/inode.c | 20 | 
1 files changed, 14 insertions, 6 deletions
| diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index ec32fece5e1e..9285dd4f4b1c 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -755,11 +755,17 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb,  					umode_t mode, dev_t dev)  {  	struct inode *inode; -	struct resv_map *resv_map; +	struct resv_map *resv_map = NULL; -	resv_map = resv_map_alloc(); -	if (!resv_map) -		return NULL; +	/* +	 * Reserve maps are only needed for inodes that can have associated +	 * page allocations. +	 */ +	if (S_ISREG(mode) || S_ISLNK(mode)) { +		resv_map = resv_map_alloc(); +		if (!resv_map) +			return NULL; +	}  	inode = new_inode(sb);  	if (inode) { @@ -794,8 +800,10 @@ 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); +	} else { +		if (resv_map) +			kref_put(&resv_map->refs, resv_map_release); +	}  	return inode;  } |