|
|
1.1 ! root 1: /* ! 2: * Virtio 9p backend ! 3: * ! 4: * Copyright IBM, Corp. 2010 ! 5: * ! 6: * Authors: ! 7: * Harsh Prateek Bora <[email protected]> ! 8: * Venkateswararao Jujjuri(JV) <[email protected]> ! 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(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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.