ssize_t __vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) { if (file->f_op->read) return file->f_op->read(file, buf, count, pos); else if (file->f_op->read_iter) return new_sync_read(file, buf, count, pos); else return -EINVAL; }
ssize_t __vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) { ssize_t ret; if (file->f_op->read) ret = file->f_op->read(file, buf, count, pos); else if (file->f_op->aio_read) ret = do_sync_read(file, buf, count, pos); else if (file->f_op->read_iter) ret = new_sync_read(file, buf, count, pos); else ret = -EINVAL; return ret; }
/** * ima_kernel_read - read file content * * This is a function for reading file content instead of kernel_read(). * It does not perform locking checks to ensure it cannot be blocked. * It does not perform security checks because it is irrelevant for IMA. * */ static int ima_kernel_read(struct file *file, loff_t offset, char *addr, unsigned long count) { mm_segment_t old_fs; char __user *buf = addr; ssize_t ret = -EINVAL; if (!(file->f_mode & FMODE_READ)) return -EBADF; old_fs = get_fs(); set_fs(get_ds()); if (file->f_op->read) ret = file->f_op->read(file, buf, count, &offset); else if (file->f_op->aio_read) ret = do_sync_read(file, buf, count, &offset); else if (file->f_op->read_iter) ret = new_sync_read(file, buf, count, &offset); set_fs(old_fs); return ret; }