Loading drivers/staging/android/ashmem.c +21 −8 Original line number Original line Diff line number Diff line Loading @@ -294,9 +294,19 @@ static int ashmem_release(struct inode *ignored, struct file *file) return 0; return 0; } } static ssize_t ashmem_read_iter(struct kiocb *iocb, struct iov_iter *iter) /** * ashmem_read() - Reads a set of bytes from an Ashmem-enabled file * @file: The associated backing file. * @buf: The buffer of data being written to * @len: The number of bytes being read * @pos: The position of the first byte to read. * * Return: 0 if successful, or another return code if not. */ static ssize_t ashmem_read(struct file *file, char __user *buf, size_t len, loff_t *pos) { { struct ashmem_area *asma = iocb->ki_filp->private_data; struct ashmem_area *asma = file->private_data; int ret = 0; int ret = 0; mutex_lock(&ashmem_mutex); mutex_lock(&ashmem_mutex); Loading @@ -310,17 +320,20 @@ static ssize_t ashmem_read_iter(struct kiocb *iocb, struct iov_iter *iter) goto out_unlock; goto out_unlock; } } mutex_unlock(&ashmem_mutex); /* /* * asma and asma->file are used outside the lock here. We assume * asma and asma->file are used outside the lock here. We assume * once asma->file is set it will never be changed, and will not * once asma->file is set it will never be changed, and will not * be destroyed until all references to the file are dropped and * be destroyed until all references to the file are dropped and * ashmem_release is called. * ashmem_release is called. */ */ mutex_unlock(&ashmem_mutex); ret = __vfs_read(asma->file, buf, len, pos); ret = vfs_iter_read(asma->file, iter, &iocb->ki_pos, 0); if (ret >= 0) mutex_lock(&ashmem_mutex); /** Update backing file pos, since f_ops->read() doesn't */ if (ret > 0) asma->file->f_pos = *pos; asma->file->f_pos = iocb->ki_pos; return ret; out_unlock: out_unlock: mutex_unlock(&ashmem_mutex); mutex_unlock(&ashmem_mutex); return ret; return ret; Loading Loading @@ -815,7 +828,7 @@ static const struct file_operations ashmem_fops = { .owner = THIS_MODULE, .owner = THIS_MODULE, .open = ashmem_open, .open = ashmem_open, .release = ashmem_release, .release = ashmem_release, .read_iter = ashmem_read_iter, .read = ashmem_read, .llseek = ashmem_llseek, .llseek = ashmem_llseek, .mmap = ashmem_mmap, .mmap = ashmem_mmap, .unlocked_ioctl = ashmem_ioctl, .unlocked_ioctl = ashmem_ioctl, Loading Loading
drivers/staging/android/ashmem.c +21 −8 Original line number Original line Diff line number Diff line Loading @@ -294,9 +294,19 @@ static int ashmem_release(struct inode *ignored, struct file *file) return 0; return 0; } } static ssize_t ashmem_read_iter(struct kiocb *iocb, struct iov_iter *iter) /** * ashmem_read() - Reads a set of bytes from an Ashmem-enabled file * @file: The associated backing file. * @buf: The buffer of data being written to * @len: The number of bytes being read * @pos: The position of the first byte to read. * * Return: 0 if successful, or another return code if not. */ static ssize_t ashmem_read(struct file *file, char __user *buf, size_t len, loff_t *pos) { { struct ashmem_area *asma = iocb->ki_filp->private_data; struct ashmem_area *asma = file->private_data; int ret = 0; int ret = 0; mutex_lock(&ashmem_mutex); mutex_lock(&ashmem_mutex); Loading @@ -310,17 +320,20 @@ static ssize_t ashmem_read_iter(struct kiocb *iocb, struct iov_iter *iter) goto out_unlock; goto out_unlock; } } mutex_unlock(&ashmem_mutex); /* /* * asma and asma->file are used outside the lock here. We assume * asma and asma->file are used outside the lock here. We assume * once asma->file is set it will never be changed, and will not * once asma->file is set it will never be changed, and will not * be destroyed until all references to the file are dropped and * be destroyed until all references to the file are dropped and * ashmem_release is called. * ashmem_release is called. */ */ mutex_unlock(&ashmem_mutex); ret = __vfs_read(asma->file, buf, len, pos); ret = vfs_iter_read(asma->file, iter, &iocb->ki_pos, 0); if (ret >= 0) mutex_lock(&ashmem_mutex); /** Update backing file pos, since f_ops->read() doesn't */ if (ret > 0) asma->file->f_pos = *pos; asma->file->f_pos = iocb->ki_pos; return ret; out_unlock: out_unlock: mutex_unlock(&ashmem_mutex); mutex_unlock(&ashmem_mutex); return ret; return ret; Loading Loading @@ -815,7 +828,7 @@ static const struct file_operations ashmem_fops = { .owner = THIS_MODULE, .owner = THIS_MODULE, .open = ashmem_open, .open = ashmem_open, .release = ashmem_release, .release = ashmem_release, .read_iter = ashmem_read_iter, .read = ashmem_read, .llseek = ashmem_llseek, .llseek = ashmem_llseek, .mmap = ashmem_mmap, .mmap = ashmem_mmap, .unlocked_ioctl = ashmem_ioctl, .unlocked_ioctl = ashmem_ioctl, Loading