Example #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);
}
Example #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);
}