162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2016 Anton Ivanov (aivanov@brocade.com) 462306a36Sopenharmony_ci * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) 562306a36Sopenharmony_ci * Copyright (C) 2001 Ridgerun,Inc (glonnon@ridgerun.com) 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <stddef.h> 962306a36Sopenharmony_ci#include <unistd.h> 1062306a36Sopenharmony_ci#include <errno.h> 1162306a36Sopenharmony_ci#include <sched.h> 1262306a36Sopenharmony_ci#include <signal.h> 1362306a36Sopenharmony_ci#include <string.h> 1462306a36Sopenharmony_ci#include <netinet/in.h> 1562306a36Sopenharmony_ci#include <sys/time.h> 1662306a36Sopenharmony_ci#include <sys/socket.h> 1762306a36Sopenharmony_ci#include <sys/mman.h> 1862306a36Sopenharmony_ci#include <sys/param.h> 1962306a36Sopenharmony_ci#include <endian.h> 2062306a36Sopenharmony_ci#include <byteswap.h> 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include "ubd.h" 2362306a36Sopenharmony_ci#include <os.h> 2462306a36Sopenharmony_ci#include <poll.h> 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistruct pollfd kernel_pollfd; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ciint start_io_thread(unsigned long sp, int *fd_out) 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci int pid, fds[2], err; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci err = os_pipe(fds, 1, 1); 3362306a36Sopenharmony_ci if(err < 0){ 3462306a36Sopenharmony_ci printk("start_io_thread - os_pipe failed, err = %d\n", -err); 3562306a36Sopenharmony_ci goto out; 3662306a36Sopenharmony_ci } 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci kernel_fd = fds[0]; 3962306a36Sopenharmony_ci kernel_pollfd.fd = kernel_fd; 4062306a36Sopenharmony_ci kernel_pollfd.events = POLLIN; 4162306a36Sopenharmony_ci *fd_out = fds[1]; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci err = os_set_fd_block(*fd_out, 0); 4462306a36Sopenharmony_ci err = os_set_fd_block(kernel_fd, 0); 4562306a36Sopenharmony_ci if (err) { 4662306a36Sopenharmony_ci printk("start_io_thread - failed to set nonblocking I/O.\n"); 4762306a36Sopenharmony_ci goto out_close; 4862306a36Sopenharmony_ci } 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM, NULL); 5162306a36Sopenharmony_ci if(pid < 0){ 5262306a36Sopenharmony_ci err = -errno; 5362306a36Sopenharmony_ci printk("start_io_thread - clone failed : errno = %d\n", errno); 5462306a36Sopenharmony_ci goto out_close; 5562306a36Sopenharmony_ci } 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci return(pid); 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci out_close: 6062306a36Sopenharmony_ci os_close_file(fds[0]); 6162306a36Sopenharmony_ci os_close_file(fds[1]); 6262306a36Sopenharmony_ci kernel_fd = -1; 6362306a36Sopenharmony_ci *fd_out = -1; 6462306a36Sopenharmony_ci out: 6562306a36Sopenharmony_ci return err; 6662306a36Sopenharmony_ci} 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ciint ubd_read_poll(int timeout) 6962306a36Sopenharmony_ci{ 7062306a36Sopenharmony_ci kernel_pollfd.events = POLLIN; 7162306a36Sopenharmony_ci return poll(&kernel_pollfd, 1, timeout); 7262306a36Sopenharmony_ci} 7362306a36Sopenharmony_ciint ubd_write_poll(int timeout) 7462306a36Sopenharmony_ci{ 7562306a36Sopenharmony_ci kernel_pollfd.events = POLLOUT; 7662306a36Sopenharmony_ci return poll(&kernel_pollfd, 1, timeout); 7762306a36Sopenharmony_ci} 7862306a36Sopenharmony_ci 79