root / hw / 9pfs / virtio-9p-coth.h @ bed4352c
History | View | Annotate | Download (3.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 "qemu-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 |
* yeild 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(V9fsState *, V9fsString *, V9fsString *); |
60 |
extern int v9fs_co_readdir(V9fsState *, V9fsFidState *, |
61 |
struct dirent **);
|
62 |
extern off_t v9fs_co_telldir(V9fsState *, V9fsFidState *);
|
63 |
extern void v9fs_co_seekdir(V9fsState *, V9fsFidState *, off_t); |
64 |
extern void v9fs_co_rewinddir(V9fsState *, V9fsFidState *); |
65 |
extern int v9fs_co_statfs(V9fsState *, V9fsString *, struct statfs *); |
66 |
extern int v9fs_co_lstat(V9fsState *, V9fsString *, struct stat *); |
67 |
extern int v9fs_co_chmod(V9fsState *, V9fsString *, mode_t); |
68 |
extern int v9fs_co_utimensat(V9fsState *, V9fsString *, struct timespec [2]); |
69 |
extern int v9fs_co_chown(V9fsState *, V9fsString *, uid_t, gid_t); |
70 |
extern int v9fs_co_truncate(V9fsState *, V9fsString *, off_t); |
71 |
extern int v9fs_co_llistxattr(V9fsState *, V9fsString *, void *, size_t); |
72 |
extern int v9fs_co_lgetxattr(V9fsState *, V9fsString *, |
73 |
V9fsString *, void *, size_t);
|
74 |
extern int v9fs_co_mknod(V9fsState *, V9fsString *, uid_t, |
75 |
gid_t, dev_t, mode_t); |
76 |
extern int v9fs_co_mkdir(V9fsState *, char *, mode_t, uid_t, gid_t); |
77 |
extern int v9fs_co_remove(V9fsState *, V9fsString *); |
78 |
extern int v9fs_co_rename(V9fsState *, V9fsString *, V9fsString *); |
79 |
extern int v9fs_co_fstat(V9fsState *, int, struct stat *); |
80 |
extern int v9fs_co_opendir(V9fsState *, V9fsFidState *); |
81 |
extern int v9fs_co_open(V9fsState *, V9fsFidState *, int); |
82 |
extern int v9fs_co_open2(V9fsState *, V9fsFidState *, char *, gid_t, int, int); |
83 |
extern int v9fs_co_lsetxattr(V9fsState *, V9fsString *, V9fsString *, |
84 |
void *, size_t, int); |
85 |
extern int v9fs_co_lremovexattr(V9fsState *, V9fsString *, V9fsString *); |
86 |
extern int v9fs_co_closedir(V9fsState *, V9fsFidState *); |
87 |
extern int v9fs_co_close(V9fsState *, V9fsFidState *); |
88 |
#endif
|