diff options
Diffstat (limited to 'ipc/shm.c')
-rw-r--r-- | ipc/shm.c | 31 |
1 files changed, 17 insertions, 14 deletions
@@ -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); |