static int open_one_chan(struct chan *chan) { int fd, err; if (chan->opened) return 0; if (chan->ops->open == NULL) fd = 0; else fd = (*chan->ops->open)(chan->input, chan->output, chan->primary, chan->data, &chan->dev); if (fd < 0) return fd; err = os_set_fd_block(fd, 0); if (err) { (*chan->ops->close)(fd, chan->data); return err; } chan->fd = fd; chan->opened = 1; return 0; }
int start_io_thread(unsigned long sp, int *fd_out) { int pid, fds[2], err; err = os_pipe(fds, 1, 1); if(err < 0){ printk("start_io_thread - os_pipe failed, err = %d\n", -err); goto out; } kernel_fd = fds[0]; *fd_out = fds[1]; err = os_set_fd_block(*fd_out, 0); if (err) { printk("start_io_thread - failed to set nonblocking I/O.\n"); goto out_close; } pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM, NULL); if(pid < 0){ err = -errno; printk("start_io_thread - clone failed : errno = %d\n", errno); goto out_close; } return(pid); out_close: os_close_file(fds[0]); os_close_file(fds[1]); kernel_fd = -1; *fd_out = -1; out: return err; }