Commit | Line | Data |
---|---|---|
91acb21f JD |
1 | /* |
2 | * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) | |
3 | * Copyright (C) 2001 Ridgerun,Inc (glonnon@ridgerun.com) | |
4 | * Licensed under the GPL | |
5 | */ | |
6 | ||
7 | #include <stddef.h> | |
8 | #include <unistd.h> | |
9 | #include <errno.h> | |
10 | #include <sched.h> | |
11 | #include <signal.h> | |
12 | #include <string.h> | |
13 | #include <netinet/in.h> | |
14 | #include <sys/time.h> | |
15 | #include <sys/socket.h> | |
16 | #include <sys/mman.h> | |
17 | #include <sys/param.h> | |
91acb21f JD |
18 | #include <endian.h> |
19 | #include <byteswap.h> | |
20 | ||
8ea3c06a AV |
21 | #include "ubd.h" |
22 | #include "os.h" | |
23 | ||
91acb21f JD |
24 | void ignore_sigwinch_sig(void) |
25 | { | |
26 | signal(SIGWINCH, SIG_IGN); | |
27 | } | |
28 | ||
29 | int start_io_thread(unsigned long sp, int *fd_out) | |
30 | { | |
31 | int pid, fds[2], err; | |
32 | ||
33 | err = os_pipe(fds, 1, 1); | |
34 | if(err < 0){ | |
35 | printk("start_io_thread - os_pipe failed, err = %d\n", -err); | |
36 | goto out; | |
37 | } | |
38 | ||
39 | kernel_fd = fds[0]; | |
40 | *fd_out = fds[1]; | |
41 | ||
89df6bfc EGM |
42 | err = os_set_fd_block(*fd_out, 0); |
43 | if (err) { | |
44 | printk("start_io_thread - failed to set nonblocking I/O.\n"); | |
45 | goto out_close; | |
46 | } | |
47 | ||
4dbed85a | 48 | pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM, NULL); |
91acb21f | 49 | if(pid < 0){ |
91acb21f | 50 | err = -errno; |
56bd194b | 51 | printk("start_io_thread - clone failed : errno = %d\n", errno); |
91acb21f JD |
52 | goto out_close; |
53 | } | |
54 | ||
55 | return(pid); | |
56 | ||
57 | out_close: | |
58 | os_close_file(fds[0]); | |
59 | os_close_file(fds[1]); | |
60 | kernel_fd = -1; | |
61 | *fd_out = -1; | |
62 | out: | |
56bd194b | 63 | return err; |
91acb21f | 64 | } |