1*dbddf429SAlex Dewar // SPDX-License-Identifier: GPL-2.0
291acb21fSJeff Dike /*
3f88f0bdfSAnton Ivanov * Copyright (C) 2016 Anton Ivanov (aivanov@brocade.com)
491acb21fSJeff Dike * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
591acb21fSJeff Dike * Copyright (C) 2001 Ridgerun,Inc (glonnon@ridgerun.com)
691acb21fSJeff Dike */
791acb21fSJeff Dike
891acb21fSJeff Dike #include <stddef.h>
991acb21fSJeff Dike #include <unistd.h>
1091acb21fSJeff Dike #include <errno.h>
1191acb21fSJeff Dike #include <sched.h>
1291acb21fSJeff Dike #include <signal.h>
1391acb21fSJeff Dike #include <string.h>
1491acb21fSJeff Dike #include <netinet/in.h>
1591acb21fSJeff Dike #include <sys/time.h>
1691acb21fSJeff Dike #include <sys/socket.h>
1791acb21fSJeff Dike #include <sys/mman.h>
1891acb21fSJeff Dike #include <sys/param.h>
1991acb21fSJeff Dike #include <endian.h>
2091acb21fSJeff Dike #include <byteswap.h>
2191acb21fSJeff Dike
228ea3c06aSAl Viro #include "ubd.h"
2337185b33SAl Viro #include <os.h>
24f88f0bdfSAnton Ivanov #include <poll.h>
25f88f0bdfSAnton Ivanov
26f88f0bdfSAnton Ivanov struct pollfd kernel_pollfd;
278ea3c06aSAl Viro
start_io_thread(unsigned long sp,int * fd_out)2891acb21fSJeff Dike int start_io_thread(unsigned long sp, int *fd_out)
2991acb21fSJeff Dike {
3091acb21fSJeff Dike int pid, fds[2], err;
3191acb21fSJeff Dike
3291acb21fSJeff Dike err = os_pipe(fds, 1, 1);
3391acb21fSJeff Dike if(err < 0){
3491acb21fSJeff Dike printk("start_io_thread - os_pipe failed, err = %d\n", -err);
3591acb21fSJeff Dike goto out;
3691acb21fSJeff Dike }
3791acb21fSJeff Dike
3891acb21fSJeff Dike kernel_fd = fds[0];
39f88f0bdfSAnton Ivanov kernel_pollfd.fd = kernel_fd;
40f88f0bdfSAnton Ivanov kernel_pollfd.events = POLLIN;
4191acb21fSJeff Dike *fd_out = fds[1];
4291acb21fSJeff Dike
4389df6bfcSEduard-Gabriel Munteanu err = os_set_fd_block(*fd_out, 0);
44f88f0bdfSAnton Ivanov err = os_set_fd_block(kernel_fd, 0);
4589df6bfcSEduard-Gabriel Munteanu if (err) {
4689df6bfcSEduard-Gabriel Munteanu printk("start_io_thread - failed to set nonblocking I/O.\n");
4789df6bfcSEduard-Gabriel Munteanu goto out_close;
4889df6bfcSEduard-Gabriel Munteanu }
4989df6bfcSEduard-Gabriel Munteanu
504dbed85aSStanislaw Gruszka pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM, NULL);
5191acb21fSJeff Dike if(pid < 0){
5291acb21fSJeff Dike err = -errno;
5356bd194bSJeff Dike printk("start_io_thread - clone failed : errno = %d\n", errno);
5491acb21fSJeff Dike goto out_close;
5591acb21fSJeff Dike }
5691acb21fSJeff Dike
5791acb21fSJeff Dike return(pid);
5891acb21fSJeff Dike
5991acb21fSJeff Dike out_close:
6091acb21fSJeff Dike os_close_file(fds[0]);
6191acb21fSJeff Dike os_close_file(fds[1]);
6291acb21fSJeff Dike kernel_fd = -1;
6391acb21fSJeff Dike *fd_out = -1;
6491acb21fSJeff Dike out:
6556bd194bSJeff Dike return err;
6691acb21fSJeff Dike }
67f88f0bdfSAnton Ivanov
ubd_read_poll(int timeout)68f88f0bdfSAnton Ivanov int ubd_read_poll(int timeout)
69f88f0bdfSAnton Ivanov {
70f88f0bdfSAnton Ivanov kernel_pollfd.events = POLLIN;
71f88f0bdfSAnton Ivanov return poll(&kernel_pollfd, 1, timeout);
72f88f0bdfSAnton Ivanov }
ubd_write_poll(int timeout)73f88f0bdfSAnton Ivanov int ubd_write_poll(int timeout)
74f88f0bdfSAnton Ivanov {
75f88f0bdfSAnton Ivanov kernel_pollfd.events = POLLOUT;
76f88f0bdfSAnton Ivanov return poll(&kernel_pollfd, 1, timeout);
77f88f0bdfSAnton Ivanov }
78f88f0bdfSAnton Ivanov
79