aboutsummaryrefslogtreecommitdiffstats
path: root/fs/hugetlbfs/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/hugetlbfs/inode.c')
-rw-r--r--fs/hugetlbfs/inode.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index 941c8425c10b..a93b885311d8 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -44,6 +44,7 @@ static const struct inode_operations hugetlbfs_dir_inode_operations;
44static const struct inode_operations hugetlbfs_inode_operations; 44static const struct inode_operations hugetlbfs_inode_operations;
45 45
46static struct backing_dev_info hugetlbfs_backing_dev_info = { 46static struct backing_dev_info hugetlbfs_backing_dev_info = {
47 .name = "hugetlbfs",
47 .ra_pages = 0, /* No readahead */ 48 .ra_pages = 0, /* No readahead */
48 .capabilities = BDI_CAP_NO_ACCT_AND_WRITEBACK, 49 .capabilities = BDI_CAP_NO_ACCT_AND_WRITEBACK,
49}; 50};
@@ -935,26 +936,28 @@ static int can_do_hugetlb_shm(void)
935 return capable(CAP_IPC_LOCK) || in_group_p(sysctl_hugetlb_shm_group); 936 return capable(CAP_IPC_LOCK) || in_group_p(sysctl_hugetlb_shm_group);
936} 937}
937 938
938struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag) 939struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag,
940 struct user_struct **user)
939{ 941{
940 int error = -ENOMEM; 942 int error = -ENOMEM;
941 int unlock_shm = 0;
942 struct file *file; 943 struct file *file;
943 struct inode *inode; 944 struct inode *inode;
944 struct dentry *dentry, *root; 945 struct dentry *dentry, *root;
945 struct qstr quick_string; 946 struct qstr quick_string;
946 struct user_struct *user = current_user();
947 947
948 *user = NULL;
948 if (!hugetlbfs_vfsmount) 949 if (!hugetlbfs_vfsmount)
949 return ERR_PTR(-ENOENT); 950 return ERR_PTR(-ENOENT);
950 951
951 if (!can_do_hugetlb_shm()) { 952 if (!can_do_hugetlb_shm()) {
952 if (user_shm_lock(size, user)) { 953 *user = current_user();
953 unlock_shm = 1; 954 if (user_shm_lock(size, *user)) {
954 WARN_ONCE(1, 955 WARN_ONCE(1,
955 "Using mlock ulimits for SHM_HUGETLB deprecated\n"); 956 "Using mlock ulimits for SHM_HUGETLB deprecated\n");
956 } else 957 } else {
958 *user = NULL;
957 return ERR_PTR(-EPERM); 959 return ERR_PTR(-EPERM);
960 }
958 } 961 }
959 962
960 root = hugetlbfs_vfsmount->mnt_root; 963 root = hugetlbfs_vfsmount->mnt_root;
@@ -996,8 +999,10 @@ out_inode:
996out_dentry: 999out_dentry:
997 dput(dentry); 1000 dput(dentry);
998out_shm_unlock: 1001out_shm_unlock:
999 if (unlock_shm) 1002 if (*user) {
1000 user_shm_unlock(size, user); 1003 user_shm_unlock(size, *user);
1004 *user = NULL;
1005 }
1001 return ERR_PTR(error); 1006 return ERR_PTR(error);
1002} 1007}
1003 1008