Exemple #1
0
static ssize_t file_write(struct file *file, const char __user * buffer,
                          size_t count, loff_t * ppos)
{
    int minor;
    struct rtlx_channel *rt;

    minor = iminor(file->f_path.dentry->d_inode);
    rt = &rtlx->channel[minor];

    /* any space left... */
    if (!rtlx_write_poll(minor)) {
        int ret = 0;

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

        __wait_event_interruptible(channel_wqs[minor].rt_queue,
                                   rtlx_write_poll(minor),
                                   ret);
        if (ret)
            return ret;
    }

    return rtlx_write(minor, buffer, count);
}
Exemple #2
0
static ssize_t file_write(struct file *file, const char __user * buffer,
			  size_t count, loff_t * ppos)
{
	int minor;
	struct rtlx_channel *rt;
	DECLARE_WAITQUEUE(wait, current);

	minor = iminor(file->f_dentry->d_inode);
	rt = &rtlx->channel[minor];

	/* any space left... */
	if (!rtlx_write_poll(minor)) {

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

		add_wait_queue(&channel_wqs[minor].rt_queue, &wait);
		set_current_state(TASK_INTERRUPTIBLE);

		while (!rtlx_write_poll(minor))
			schedule();

		set_current_state(TASK_RUNNING);
		remove_wait_queue(&channel_wqs[minor].rt_queue, &wait);
	}

	return rtlx_write(minor, (void *)buffer, count, 1);
}
Exemple #3
0
static unsigned int file_poll(struct file *file, poll_table * wait)
{
	int minor = iminor(file_inode(file));
	unsigned int mask = 0;

	poll_wait(file, &channel_wqs[minor].rt_queue, wait);
	poll_wait(file, &channel_wqs[minor].lx_queue, wait);

	if (rtlx == NULL)
		return 0;

	/* data available to read? */
	if (rtlx_read_poll(minor, 0))
		mask |= POLLIN | POLLRDNORM;

	/* space to write */
	if (rtlx_write_poll(minor))
		mask |= POLLOUT | POLLWRNORM;

	return mask;
}
Exemple #4
0
static unsigned int file_poll(struct file *file, poll_table * wait)
{
	int minor;
	unsigned int mask = 0;

	minor = iminor(file->f_path.dentry->d_inode);

	poll_wait(file, &channel_wqs[minor].rt_queue, wait);
	poll_wait(file, &channel_wqs[minor].lx_queue, wait);

	if (rtlx == NULL)
		return 0;

	
	if (rtlx_read_poll(minor, 0))
		mask |= POLLIN | POLLRDNORM;

	
	if (rtlx_write_poll(minor))
		mask |= POLLOUT | POLLWRNORM;

	return mask;
}