Created
December 17, 2013 04:54
-
-
Save hfm/8000243 to your computer and use it in GitHub Desktop.
linux-2.6.32.61/fs/sysfs/bin.c
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| static int mmap(struct file *file, struct vm_area_struct *vma) | |
| { | |
| struct bin_buffer *bb = file->private_data; | |
| struct sysfs_dirent *attr_sd = file->f_path.dentry->d_fsdata; | |
| struct bin_attribute *attr = attr_sd->s_bin_attr.bin_attr; | |
| struct kobject *kobj = attr_sd->s_parent->s_dir.kobj; | |
| int rc; | |
| mutex_lock(&bb->mutex); | |
| /* need attr_sd for attr, its parent for kobj */ | |
| rc = -ENODEV; | |
| if (!sysfs_get_active_two(attr_sd)) | |
| goto out_unlock; | |
| rc = -EINVAL; | |
| if (!attr->mmap) | |
| goto out_put; | |
| rc = attr->mmap(kobj, attr, vma); | |
| if (rc) | |
| goto out_put; | |
| /* | |
| * PowerPC's pci_mmap of legacy_mem uses shmem_zero_setup() | |
| * to satisfy versions of X which crash if the mmap fails: that | |
| * substitutes a new vm_file, and we don't then want bin_vm_ops. | |
| */ | |
| if (vma->vm_file != file) | |
| goto out_put; | |
| rc = -EINVAL; | |
| if (bb->mmapped && bb->vm_ops != vma->vm_ops) | |
| goto out_put; | |
| rc = 0; | |
| bb->mmapped = 1; | |
| bb->vm_ops = vma->vm_ops; | |
| vma->vm_ops = &bin_vm_ops; | |
| out_put: | |
| sysfs_put_active_two(attr_sd); | |
| out_unlock: | |
| mutex_unlock(&bb->mutex); | |
| return rc; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment