static ssize_t gnss_read()

in core.c [88:121]


static ssize_t gnss_read(struct file *file, char __user *buf,
				size_t count, loff_t *pos)
{
	struct gnss_device *gdev = file->private_data;
	unsigned int copied;
	int ret;

	mutex_lock(&gdev->read_mutex);
	while (kfifo_is_empty(&gdev->read_fifo)) {
		mutex_unlock(&gdev->read_mutex);

		if (gdev->disconnected)
			return 0;

		if (file->f_flags & O_NONBLOCK)
			return -EAGAIN;

		ret = wait_event_interruptible(gdev->read_queue,
				gdev->disconnected ||
				!kfifo_is_empty(&gdev->read_fifo));
		if (ret)
			return -ERESTARTSYS;

		mutex_lock(&gdev->read_mutex);
	}

	ret = kfifo_to_user(&gdev->read_fifo, buf, count, &copied);
	if (ret == 0)
		ret = copied;

	mutex_unlock(&gdev->read_mutex);

	return ret;
}