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