diff options
Diffstat (limited to 'fs/hugetlbfs')
-rw-r--r-- | fs/hugetlbfs/inode.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index a93b885311d8..06b7c2623f99 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
@@ -507,6 +507,13 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, uid_t uid, | |||
507 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 507 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
508 | INIT_LIST_HEAD(&inode->i_mapping->private_list); | 508 | INIT_LIST_HEAD(&inode->i_mapping->private_list); |
509 | info = HUGETLBFS_I(inode); | 509 | info = HUGETLBFS_I(inode); |
510 | /* | ||
511 | * The policy is initialized here even if we are creating a | ||
512 | * private inode because initialization simply creates an | ||
513 | * an empty rb tree and calls spin_lock_init(), later when we | ||
514 | * call mpol_free_shared_policy() it will just return because | ||
515 | * the rb tree will still be empty. | ||
516 | */ | ||
510 | mpol_shared_policy_init(&info->policy, NULL); | 517 | mpol_shared_policy_init(&info->policy, NULL); |
511 | switch (mode & S_IFMT) { | 518 | switch (mode & S_IFMT) { |
512 | default: | 519 | default: |
@@ -931,13 +938,19 @@ static struct file_system_type hugetlbfs_fs_type = { | |||
931 | 938 | ||
932 | static struct vfsmount *hugetlbfs_vfsmount; | 939 | static struct vfsmount *hugetlbfs_vfsmount; |
933 | 940 | ||
934 | static int can_do_hugetlb_shm(void) | 941 | static int can_do_hugetlb_shm(int creat_flags) |
935 | { | 942 | { |
936 | return capable(CAP_IPC_LOCK) || in_group_p(sysctl_hugetlb_shm_group); | 943 | if (creat_flags != HUGETLB_SHMFS_INODE) |
944 | return 0; | ||
945 | if (capable(CAP_IPC_LOCK)) | ||
946 | return 1; | ||
947 | if (in_group_p(sysctl_hugetlb_shm_group)) | ||
948 | return 1; | ||
949 | return 0; | ||
937 | } | 950 | } |
938 | 951 | ||
939 | struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag, | 952 | struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag, |
940 | struct user_struct **user) | 953 | struct user_struct **user, int creat_flags) |
941 | { | 954 | { |
942 | int error = -ENOMEM; | 955 | int error = -ENOMEM; |
943 | struct file *file; | 956 | struct file *file; |
@@ -949,7 +962,7 @@ struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag, | |||
949 | if (!hugetlbfs_vfsmount) | 962 | if (!hugetlbfs_vfsmount) |
950 | return ERR_PTR(-ENOENT); | 963 | return ERR_PTR(-ENOENT); |
951 | 964 | ||
952 | if (!can_do_hugetlb_shm()) { | 965 | if (!can_do_hugetlb_shm(creat_flags)) { |
953 | *user = current_user(); | 966 | *user = current_user(); |
954 | if (user_shm_lock(size, *user)) { | 967 | if (user_shm_lock(size, *user)) { |
955 | WARN_ONCE(1, | 968 | WARN_ONCE(1, |