]>
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> | |
18 | #include "asm/types.h" | |
91acb21f JD |
19 | #include "kern_util.h" |
20 | #include "user.h" | |
21 | #include "ubd_user.h" | |
22 | #include "os.h" | |
23 | #include "cow.h" | |
24 | ||
25 | #include <endian.h> | |
26 | #include <byteswap.h> | |
27 | ||
28 | void ignore_sigwinch_sig(void) | |
29 | { | |
30 | signal(SIGWINCH, SIG_IGN); | |
31 | } | |
32 | ||
33 | int start_io_thread(unsigned long sp, int *fd_out) | |
34 | { | |
35 | int pid, fds[2], err; | |
36 | ||
37 | err = os_pipe(fds, 1, 1); | |
38 | if(err < 0){ | |
39 | printk("start_io_thread - os_pipe failed, err = %d\n", -err); | |
40 | goto out; | |
41 | } | |
42 | ||
43 | kernel_fd = fds[0]; | |
44 | *fd_out = fds[1]; | |
45 | ||
89df6bfc EGM |
46 | err = os_set_fd_block(*fd_out, 0); |
47 | if (err) { | |
48 | printk("start_io_thread - failed to set nonblocking I/O.\n"); | |
49 | goto out_close; | |
50 | } | |
51 | ||
4dbed85a | 52 | pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM, NULL); |
91acb21f | 53 | if(pid < 0){ |
91acb21f | 54 | err = -errno; |
56bd194b | 55 | printk("start_io_thread - clone failed : errno = %d\n", errno); |
91acb21f JD |
56 | goto out_close; |
57 | } | |
58 | ||
59 | return(pid); | |
60 | ||
61 | out_close: | |
62 | os_close_file(fds[0]); | |
63 | os_close_file(fds[1]); | |
64 | kernel_fd = -1; | |
65 | *fd_out = -1; | |
66 | out: | |
56bd194b | 67 | return err; |
91acb21f | 68 | } |