root / hw / 9pfs / virtio-9p-coth.h @ 737e150e
History | View | Annotate | Download (4.9 kB)
1 |
/*
|
---|---|
2 |
* Virtio 9p backend
|
3 |
*
|
4 |
* Copyright IBM, Corp. 2010
|
5 |
*
|
6 |
* Authors:
|
7 |
* Harsh Prateek Bora <harsh@linux.vnet.ibm.com>
|
8 |
* Venkateswararao Jujjuri(JV) <jvrao@linux.vnet.ibm.com>
|
9 |
*
|
10 |
* This work is licensed under the terms of the GNU GPL, version 2. See
|
11 |
* the COPYING file in the top-level directory.
|
12 |
*
|
13 |
*/
|
14 |
|
15 |
#ifndef _QEMU_VIRTIO_9P_COTH_H
|
16 |
#define _QEMU_VIRTIO_9P_COTH_H
|
17 |
|
18 |
#include "qemu-thread.h" |
19 |
#include "block/coroutine.h" |
20 |
#include "virtio-9p.h" |
21 |
#include <glib.h> |
22 |
|
23 |
typedef struct V9fsThPool { |
24 |
int rfd;
|
25 |
int wfd;
|
26 |
GThreadPool *pool; |
27 |
GAsyncQueue *completed; |
28 |
} V9fsThPool; |
29 |
|
30 |
/*
|
31 |
* we want to use bottom half because we want to make sure the below
|
32 |
* sequence of events.
|
33 |
*
|
34 |
* 1. Yield the coroutine in the QEMU thread.
|
35 |
* 2. Submit the coroutine to a worker thread.
|
36 |
* 3. Enter the coroutine in the worker thread.
|
37 |
* we cannot swap step 1 and 2, because that would imply worker thread
|
38 |
* can enter coroutine while step1 is still running
|
39 |
*/
|
40 |
#define v9fs_co_run_in_worker(code_block) \
|
41 |
do { \
|
42 |
QEMUBH *co_bh; \ |
43 |
co_bh = qemu_bh_new(co_run_in_worker_bh, \ |
44 |
qemu_coroutine_self()); \ |
45 |
qemu_bh_schedule(co_bh); \ |
46 |
/* \
|
47 |
* yield in qemu thread and re-enter back \
|
48 |
* in glib worker thread \
|
49 |
*/ \
|
50 |
qemu_coroutine_yield(); \ |
51 |
qemu_bh_delete(co_bh); \ |
52 |
code_block; \ |
53 |
/* re-enter back to qemu thread */ \
|
54 |
qemu_coroutine_yield(); \ |
55 |
} while (0) |
56 |
|
57 |
extern void co_run_in_worker_bh(void *); |
58 |
extern int v9fs_init_worker_threads(void); |
59 |
extern int v9fs_co_readlink(V9fsPDU *, V9fsPath *, V9fsString *); |
60 |
extern int v9fs_co_readdir_r(V9fsPDU *, V9fsFidState *, |
61 |
struct dirent *, struct dirent **result); |
62 |
extern off_t v9fs_co_telldir(V9fsPDU *, V9fsFidState *);
|
63 |
extern void v9fs_co_seekdir(V9fsPDU *, V9fsFidState *, off_t); |
64 |
extern void v9fs_co_rewinddir(V9fsPDU *, V9fsFidState *); |
65 |
extern int v9fs_co_statfs(V9fsPDU *, V9fsPath *, struct statfs *); |
66 |
extern int v9fs_co_lstat(V9fsPDU *, V9fsPath *, struct stat *); |
67 |
extern int v9fs_co_chmod(V9fsPDU *, V9fsPath *, mode_t); |
68 |
extern int v9fs_co_utimensat(V9fsPDU *, V9fsPath *, struct timespec [2]); |
69 |
extern int v9fs_co_chown(V9fsPDU *, V9fsPath *, uid_t, gid_t); |
70 |
extern int v9fs_co_truncate(V9fsPDU *, V9fsPath *, off_t); |
71 |
extern int v9fs_co_llistxattr(V9fsPDU *, V9fsPath *, void *, size_t); |
72 |
extern int v9fs_co_lgetxattr(V9fsPDU *, V9fsPath *, |
73 |
V9fsString *, void *, size_t);
|
74 |
extern int v9fs_co_mknod(V9fsPDU *, V9fsFidState *, V9fsString *, uid_t, |
75 |
gid_t, dev_t, mode_t, struct stat *);
|
76 |
extern int v9fs_co_mkdir(V9fsPDU *, V9fsFidState *, V9fsString *, |
77 |
mode_t, uid_t, gid_t, struct stat *);
|
78 |
extern int v9fs_co_remove(V9fsPDU *, V9fsPath *); |
79 |
extern int v9fs_co_rename(V9fsPDU *, V9fsPath *, V9fsPath *); |
80 |
extern int v9fs_co_unlinkat(V9fsPDU *, V9fsPath *, V9fsString *, int flags); |
81 |
extern int v9fs_co_renameat(V9fsPDU *, V9fsPath *, V9fsString *, |
82 |
V9fsPath *, V9fsString *); |
83 |
extern int v9fs_co_fstat(V9fsPDU *, V9fsFidState *, struct stat *); |
84 |
extern int v9fs_co_opendir(V9fsPDU *, V9fsFidState *); |
85 |
extern int v9fs_co_open(V9fsPDU *, V9fsFidState *, int); |
86 |
extern int v9fs_co_open2(V9fsPDU *, V9fsFidState *, V9fsString *, |
87 |
gid_t, int, int, struct stat *); |
88 |
extern int v9fs_co_lsetxattr(V9fsPDU *, V9fsPath *, V9fsString *, |
89 |
void *, size_t, int); |
90 |
extern int v9fs_co_lremovexattr(V9fsPDU *, V9fsPath *, V9fsString *); |
91 |
extern int v9fs_co_closedir(V9fsPDU *, V9fsFidOpenState *); |
92 |
extern int v9fs_co_close(V9fsPDU *, V9fsFidOpenState *); |
93 |
extern int v9fs_co_fsync(V9fsPDU *, V9fsFidState *, int); |
94 |
extern int v9fs_co_symlink(V9fsPDU *, V9fsFidState *, V9fsString *, |
95 |
const char *, gid_t, struct stat *); |
96 |
extern int v9fs_co_link(V9fsPDU *, V9fsFidState *, |
97 |
V9fsFidState *, V9fsString *); |
98 |
extern int v9fs_co_pwritev(V9fsPDU *, V9fsFidState *, |
99 |
struct iovec *, int, int64_t); |
100 |
extern int v9fs_co_preadv(V9fsPDU *, V9fsFidState *, |
101 |
struct iovec *, int, int64_t); |
102 |
extern int v9fs_co_name_to_path(V9fsPDU *, V9fsPath *, |
103 |
const char *, V9fsPath *); |
104 |
extern int v9fs_co_st_gen(V9fsPDU *pdu, V9fsPath *path, mode_t, |
105 |
V9fsStatDotl *v9stat); |
106 |
|
107 |
#endif
|