diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2009-11-30 08:38:43 -0500 | 
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2009-12-11 06:34:09 -0500 | 
| commit | c4caa778157dbbf04116f0ac2111e389b5cd7a29 (patch) | |
| tree | d8e26c07bacaaa6b1e6b1e57816fd42da94e15f4 /ipc | |
| parent | 0ec62d290912bb4b989be7563851bc364ec73b56 (diff) | |
| download | linux-c4caa778157dbbf04116f0ac2111e389b5cd7a29.tar.bz2 | |
file ->get_unmapped_area() shouldn't duplicate work of get_unmapped_area()
... we should call mm ->get_unmapped_area() instead and let our caller
do the final checks.
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'ipc')
| -rw-r--r-- | ipc/shm.c | 31 | 
1 files changed, 17 insertions, 14 deletions
| diff --git a/ipc/shm.c b/ipc/shm.c index 464694e0aa4a..11bec626c228 100644 --- a/ipc/shm.c +++ b/ipc/shm.c @@ -290,28 +290,28 @@ static unsigned long shm_get_unmapped_area(struct file *file,  	unsigned long flags)  {  	struct shm_file_data *sfd = shm_file_data(file); -	return get_unmapped_area(sfd->file, addr, len, pgoff, flags); -} - -int is_file_shm_hugepages(struct file *file) -{ -	int ret = 0; - -	if (file->f_op == &shm_file_operations) { -		struct shm_file_data *sfd; -		sfd = shm_file_data(file); -		ret = is_file_hugepages(sfd->file); -	} -	return ret; +	return sfd->file->f_op->get_unmapped_area(sfd->file, addr, len, +						pgoff, flags);  }  static const struct file_operations shm_file_operations = {  	.mmap		= shm_mmap,  	.fsync		= shm_fsync,  	.release	= shm_release, +}; + +static const struct file_operations shm_file_operations_huge = { +	.mmap		= shm_mmap, +	.fsync		= shm_fsync, +	.release	= shm_release,  	.get_unmapped_area	= shm_get_unmapped_area,  }; +int is_file_shm_hugepages(struct file *file) +{ +	return file->f_op == &shm_file_operations_huge; +} +  static const struct vm_operations_struct shm_vm_ops = {  	.open	= shm_open,	/* callback for a new vm-area open */  	.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)  	if (!sfd)  		goto out_put_dentry; -	file = alloc_file(path.mnt, path.dentry, f_mode, &shm_file_operations); +	file = alloc_file(path.mnt, path.dentry, f_mode, +			is_file_hugepages(shp->shm_file) ? +				&shm_file_operations_huge : +				&shm_file_operations);  	if (!file)  		goto out_free;  	ima_counts_get(file); |