|
|
@@ -935,26 +935,28 @@ static int can_do_hugetlb_shm(void)
|
|
|
return capable(CAP_IPC_LOCK) || in_group_p(sysctl_hugetlb_shm_group);
|
|
|
}
|
|
|
|
|
|
-struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag)
|
|
|
+struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag,
|
|
|
+ struct user_struct **user)
|
|
|
{
|
|
|
int error = -ENOMEM;
|
|
|
- int unlock_shm = 0;
|
|
|
struct file *file;
|
|
|
struct inode *inode;
|
|
|
struct dentry *dentry, *root;
|
|
|
struct qstr quick_string;
|
|
|
- struct user_struct *user = current_user();
|
|
|
|
|
|
+ *user = NULL;
|
|
|
if (!hugetlbfs_vfsmount)
|
|
|
return ERR_PTR(-ENOENT);
|
|
|
|
|
|
if (!can_do_hugetlb_shm()) {
|
|
|
- if (user_shm_lock(size, user)) {
|
|
|
- unlock_shm = 1;
|
|
|
+ *user = current_user();
|
|
|
+ if (user_shm_lock(size, *user)) {
|
|
|
WARN_ONCE(1,
|
|
|
"Using mlock ulimits for SHM_HUGETLB deprecated\n");
|
|
|
- } else
|
|
|
+ } else {
|
|
|
+ *user = NULL;
|
|
|
return ERR_PTR(-EPERM);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
root = hugetlbfs_vfsmount->mnt_root;
|
|
|
@@ -996,8 +998,10 @@ struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag)
|
|
|
out_dentry:
|
|
|
dput(dentry);
|
|
|
out_shm_unlock:
|
|
|
- if (unlock_shm)
|
|
|
- user_shm_unlock(size, user);
|
|
|
+ if (*user) {
|
|
|
+ user_shm_unlock(size, *user);
|
|
|
+ *user = NULL;
|
|
|
+ }
|
|
|
return ERR_PTR(error);
|
|
|
}
|
|
|
|