diff options
Diffstat (limited to 'fs/hugetlbfs/inode.c')
-rw-r--r-- | fs/hugetlbfs/inode.c | 21 |
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; | |||
44 | static const struct inode_operations hugetlbfs_inode_operations; | 44 | static const struct inode_operations hugetlbfs_inode_operations; |
45 | 45 | ||
46 | static struct backing_dev_info hugetlbfs_backing_dev_info = { | 46 | static 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 | ||
938 | struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag) | 939 | struct 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: | |||
996 | out_dentry: | 999 | out_dentry: |
997 | dput(dentry); | 1000 | dput(dentry); |
998 | out_shm_unlock: | 1001 | out_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 | ||