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 | 21 | #include "ubd.h" |
37185b33 | 22 | #include <os.h> |
8ea3c06a | 23 | |
91acb21f JD |
24 | int start_io_thread(unsigned long sp, int *fd_out) |
25 | { | |
26 | int pid, fds[2], err; | |
27 | ||
28 | err = os_pipe(fds, 1, 1); | |
29 | if(err < 0){ | |
30 | printk("start_io_thread - os_pipe failed, err = %d\n", -err); | |
31 | goto out; | |
32 | } | |
33 | ||
34 | kernel_fd = fds[0]; | |
35 | *fd_out = fds[1]; | |
36 | ||
89df6bfc EGM |
37 | err = os_set_fd_block(*fd_out, 0); |
38 | if (err) { | |
39 | printk("start_io_thread - failed to set nonblocking I/O.\n"); | |
40 | goto out_close; | |
41 | } | |
42 | ||
4dbed85a | 43 | pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM, NULL); |
91acb21f | 44 | if(pid < 0){ |
91acb21f | 45 | err = -errno; |
56bd194b | 46 | printk("start_io_thread - clone failed : errno = %d\n", errno); |
91acb21f JD |
47 | goto out_close; |
48 | } | |
49 | ||
50 | return(pid); | |
51 | ||
52 | out_close: | |
53 | os_close_file(fds[0]); | |
54 | os_close_file(fds[1]); | |
55 | kernel_fd = -1; | |
56 | *fd_out = -1; | |
57 | out: | |
56bd194b | 58 | return err; |
91acb21f | 59 | } |