diff options
Diffstat (limited to 'ipc')
-rw-r--r-- | ipc/msg.c | 2 | ||||
-rw-r--r-- | ipc/shm.c | 31 |
2 files changed, 18 insertions, 15 deletions
@@ -412,7 +412,7 @@ static int msgctl_down(struct ipc_namespace *ns, int msqid, int cmd, | |||
412 | struct msqid_ds __user *buf, int version) | 412 | struct msqid_ds __user *buf, int version) |
413 | { | 413 | { |
414 | struct kern_ipc_perm *ipcp; | 414 | struct kern_ipc_perm *ipcp; |
415 | struct msqid64_ds msqid64; | 415 | struct msqid64_ds uninitialized_var(msqid64); |
416 | struct msg_queue *msq; | 416 | struct msg_queue *msq; |
417 | int err; | 417 | int err; |
418 | 418 | ||
@@ -290,28 +290,28 @@ static unsigned long shm_get_unmapped_area(struct file *file, | |||
290 | unsigned long flags) | 290 | unsigned long flags) |
291 | { | 291 | { |
292 | struct shm_file_data *sfd = shm_file_data(file); | 292 | struct shm_file_data *sfd = shm_file_data(file); |
293 | return get_unmapped_area(sfd->file, addr, len, pgoff, flags); | 293 | return sfd->file->f_op->get_unmapped_area(sfd->file, addr, len, |
294 | } | 294 | pgoff, flags); |
295 | |||
296 | int is_file_shm_hugepages(struct file *file) | ||
297 | { | ||
298 | int ret = 0; | ||
299 | |||
300 | if (file->f_op == &shm_file_operations) { | ||
301 | struct shm_file_data *sfd; | ||
302 | sfd = shm_file_data(file); | ||
303 | ret = is_file_hugepages(sfd->file); | ||
304 | } | ||
305 | return ret; | ||
306 | } | 295 | } |
307 | 296 | ||
308 | static const struct file_operations shm_file_operations = { | 297 | static const struct file_operations shm_file_operations = { |
309 | .mmap = shm_mmap, | 298 | .mmap = shm_mmap, |
310 | .fsync = shm_fsync, | 299 | .fsync = shm_fsync, |
311 | .release = shm_release, | 300 | .release = shm_release, |
301 | }; | ||
302 | |||
303 | static const struct file_operations shm_file_operations_huge = { | ||
304 | .mmap = shm_mmap, | ||
305 | .fsync = shm_fsync, | ||
306 | .release = shm_release, | ||
312 | .get_unmapped_area = shm_get_unmapped_area, | 307 | .get_unmapped_area = shm_get_unmapped_area, |
313 | }; | 308 | }; |
314 | 309 | ||
310 | int is_file_shm_hugepages(struct file *file) | ||
311 | { | ||
312 | return file->f_op == &shm_file_operations_huge; | ||
313 | } | ||
314 | |||
315 | static const struct vm_operations_struct shm_vm_ops = { | 315 | static const struct vm_operations_struct shm_vm_ops = { |
316 | .open = shm_open, /* callback for a new vm-area open */ | 316 | .open = shm_open, /* callback for a new vm-area open */ |
317 | .close = shm_close, /* callback for when the vm-area is released */ | 317 | .close = shm_close, /* callback for when the vm-area is released */ |
@@ -889,7 +889,10 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr) | |||
889 | if (!sfd) | 889 | if (!sfd) |
890 | goto out_put_dentry; | 890 | goto out_put_dentry; |
891 | 891 | ||
892 | file = alloc_file(path.mnt, path.dentry, f_mode, &shm_file_operations); | 892 | file = alloc_file(path.mnt, path.dentry, f_mode, |
893 | is_file_hugepages(shp->shm_file) ? | ||
894 | &shm_file_operations_huge : | ||
895 | &shm_file_operations); | ||
893 | if (!file) | 896 | if (!file) |
894 | goto out_free; | 897 | goto out_free; |
895 | ima_counts_get(file); | 898 | ima_counts_get(file); |