9pfs: use coroutine_fn annotation in hw/9pfs/9p.[ch]

All these functions either call the v9fs_co_* functions which have the
coroutine_fn annotation, or pdu_complete() which calls qemu_co_queue_next().

Let's mark them to make it obvious they execute in coroutine context.

Signed-off-by: Greg Kurz <groug@kaod.org>
master
Greg Kurz 2016-10-17 14:13:58 +02:00
parent 5bdade6621
commit 8440e22ec1
2 changed files with 62 additions and 57 deletions

View File

@ -236,7 +236,7 @@ static size_t v9fs_string_size(V9fsString *str)
/*
* returns 0 if fid got re-opened, 1 if not, < 0 on error */
static int v9fs_reopen_fid(V9fsPDU *pdu, V9fsFidState *f)
static int coroutine_fn v9fs_reopen_fid(V9fsPDU *pdu, V9fsFidState *f)
{
int err = 1;
if (f->fid_type == P9_FID_FILE) {
@ -255,7 +255,7 @@ static int v9fs_reopen_fid(V9fsPDU *pdu, V9fsFidState *f)
return err;
}
static V9fsFidState *get_fid(V9fsPDU *pdu, int32_t fid)
static V9fsFidState *coroutine_fn get_fid(V9fsPDU *pdu, int32_t fid)
{
int err;
V9fsFidState *f;
@ -321,7 +321,7 @@ static V9fsFidState *alloc_fid(V9fsState *s, int32_t fid)
return f;
}
static int v9fs_xattr_fid_clunk(V9fsPDU *pdu, V9fsFidState *fidp)
static int coroutine_fn v9fs_xattr_fid_clunk(V9fsPDU *pdu, V9fsFidState *fidp)
{
int retval = 0;
@ -353,7 +353,7 @@ free_value:
return retval;
}
static int free_fid(V9fsPDU *pdu, V9fsFidState *fidp)
static int coroutine_fn free_fid(V9fsPDU *pdu, V9fsFidState *fidp)
{
int retval = 0;
@ -374,7 +374,7 @@ static int free_fid(V9fsPDU *pdu, V9fsFidState *fidp)
return retval;
}
static int put_fid(V9fsPDU *pdu, V9fsFidState *fidp)
static int coroutine_fn put_fid(V9fsPDU *pdu, V9fsFidState *fidp)
{
BUG_ON(!fidp->ref);
fidp->ref--;
@ -418,7 +418,7 @@ static V9fsFidState *clunk_fid(V9fsState *s, int32_t fid)
return fidp;
}
void v9fs_reclaim_fd(V9fsPDU *pdu)
void coroutine_fn v9fs_reclaim_fd(V9fsPDU *pdu)
{
int reclaim_count = 0;
V9fsState *s = pdu->s;
@ -499,7 +499,7 @@ void v9fs_reclaim_fd(V9fsPDU *pdu)
}
}
static int v9fs_mark_fids_unreclaim(V9fsPDU *pdu, V9fsPath *path)
static int coroutine_fn v9fs_mark_fids_unreclaim(V9fsPDU *pdu, V9fsPath *path)
{
int err;
V9fsState *s = pdu->s;
@ -532,7 +532,7 @@ static int v9fs_mark_fids_unreclaim(V9fsPDU *pdu, V9fsPath *path)
return 0;
}
static void virtfs_reset(V9fsPDU *pdu)
static void coroutine_fn virtfs_reset(V9fsPDU *pdu)
{
V9fsState *s = pdu->s;
V9fsFidState *fidp = NULL;
@ -598,7 +598,8 @@ static void stat_to_qid(const struct stat *stbuf, V9fsQID *qidp)
}
}
static int fid_to_qid(V9fsPDU *pdu, V9fsFidState *fidp, V9fsQID *qidp)
static int coroutine_fn fid_to_qid(V9fsPDU *pdu, V9fsFidState *fidp,
V9fsQID *qidp)
{
struct stat stbuf;
int err;
@ -643,7 +644,7 @@ void pdu_free(V9fsPDU *pdu)
* because we always expect to have enough space to encode
* error details
*/
static void pdu_complete(V9fsPDU *pdu, ssize_t len)
static void coroutine_fn pdu_complete(V9fsPDU *pdu, ssize_t len)
{
int8_t id = pdu->id + 1; /* Response */
V9fsState *s = pdu->s;
@ -810,9 +811,9 @@ static uint32_t stat_to_v9mode(const struct stat *stbuf)
return mode;
}
static int stat_to_v9stat(V9fsPDU *pdu, V9fsPath *name,
const struct stat *stbuf,
V9fsStat *v9stat)
static int coroutine_fn stat_to_v9stat(V9fsPDU *pdu, V9fsPath *name,
const struct stat *stbuf,
V9fsStat *v9stat)
{
int err;
const char *str;
@ -941,7 +942,7 @@ static inline bool is_ro_export(FsContext *ctx)
return ctx->export_flags & V9FS_RDONLY;
}
static void v9fs_version(void *opaque)
static void coroutine_fn v9fs_version(void *opaque)
{
ssize_t err;
V9fsPDU *pdu = opaque;
@ -979,7 +980,7 @@ out:
v9fs_string_free(&version);
}
static void v9fs_attach(void *opaque)
static void coroutine_fn v9fs_attach(void *opaque)
{
V9fsPDU *pdu = opaque;
V9fsState *s = pdu->s;
@ -1045,7 +1046,7 @@ out_nofid:
v9fs_string_free(&aname);
}
static void v9fs_stat(void *opaque)
static void coroutine_fn v9fs_stat(void *opaque)
{
int32_t fid;
V9fsStat v9stat;
@ -1089,7 +1090,7 @@ out_nofid:
pdu_complete(pdu, err);
}
static void v9fs_getattr(void *opaque)
static void coroutine_fn v9fs_getattr(void *opaque)
{
int32_t fid;
size_t offset = 7;
@ -1165,7 +1166,7 @@ out_nofid:
#define P9_ATTR_MASK 127
static void v9fs_setattr(void *opaque)
static void coroutine_fn v9fs_setattr(void *opaque)
{
int err = 0;
int32_t fid;
@ -1283,7 +1284,7 @@ static bool not_same_qid(const V9fsQID *qid1, const V9fsQID *qid2)
qid1->path != qid2->path;
}
static void v9fs_walk(void *opaque)
static void coroutine_fn v9fs_walk(void *opaque)
{
int name_idx;
V9fsQID *qids = NULL;
@ -1397,7 +1398,7 @@ out_nofid:
}
}
static int32_t get_iounit(V9fsPDU *pdu, V9fsPath *path)
static int32_t coroutine_fn get_iounit(V9fsPDU *pdu, V9fsPath *path)
{
struct statfs stbuf;
int32_t iounit = 0;
@ -1417,7 +1418,7 @@ static int32_t get_iounit(V9fsPDU *pdu, V9fsPath *path)
return iounit;
}
static void v9fs_open(void *opaque)
static void coroutine_fn v9fs_open(void *opaque)
{
int flags;
int32_t fid;
@ -1507,7 +1508,7 @@ out_nofid:
pdu_complete(pdu, err);
}
static void v9fs_lcreate(void *opaque)
static void coroutine_fn v9fs_lcreate(void *opaque)
{
int32_t dfid, flags, mode;
gid_t gid;
@ -1604,7 +1605,7 @@ out_nofid:
pdu_complete(pdu, err);
}
static void v9fs_clunk(void *opaque)
static void coroutine_fn v9fs_clunk(void *opaque)
{
int err;
int32_t fid;
@ -1673,8 +1674,9 @@ static int v9fs_xattr_read(V9fsState *s, V9fsPDU *pdu, V9fsFidState *fidp,
return offset;
}
static int v9fs_do_readdir_with_stat(V9fsPDU *pdu,
V9fsFidState *fidp, uint32_t max_count)
static int coroutine_fn v9fs_do_readdir_with_stat(V9fsPDU *pdu,
V9fsFidState *fidp,
uint32_t max_count)
{
V9fsPath path;
V9fsStat v9stat;
@ -1764,7 +1766,7 @@ static void v9fs_init_qiov_from_pdu(QEMUIOVector *qiov, V9fsPDU *pdu,
qemu_iovec_concat(qiov, &elem, skip, size);
}
static void v9fs_read(void *opaque)
static void coroutine_fn v9fs_read(void *opaque)
{
int32_t fid;
uint64_t off;
@ -1858,8 +1860,8 @@ static size_t v9fs_readdir_data_size(V9fsString *name)
return 24 + v9fs_string_size(name);
}
static int v9fs_do_readdir(V9fsPDU *pdu,
V9fsFidState *fidp, int32_t max_count)
static int coroutine_fn v9fs_do_readdir(V9fsPDU *pdu, V9fsFidState *fidp,
int32_t max_count)
{
size_t size;
V9fsQID qid;
@ -1928,7 +1930,7 @@ static int v9fs_do_readdir(V9fsPDU *pdu,
return count;
}
static void v9fs_readdir(void *opaque)
static void coroutine_fn v9fs_readdir(void *opaque)
{
int32_t fid;
V9fsFidState *fidp;
@ -2024,7 +2026,7 @@ out:
return err;
}
static void v9fs_write(void *opaque)
static void coroutine_fn v9fs_write(void *opaque)
{
ssize_t err;
int32_t fid;
@ -2107,7 +2109,7 @@ out_nofid:
pdu_complete(pdu, err);
}
static void v9fs_create(void *opaque)
static void coroutine_fn v9fs_create(void *opaque)
{
int32_t fid;
int err = 0;
@ -2287,7 +2289,7 @@ out_nofid:
v9fs_path_free(&path);
}
static void v9fs_symlink(void *opaque)
static void coroutine_fn v9fs_symlink(void *opaque)
{
V9fsPDU *pdu = opaque;
V9fsString name;
@ -2376,7 +2378,7 @@ static void v9fs_flush(void *opaque)
pdu_complete(pdu, 7);
}
static void v9fs_link(void *opaque)
static void coroutine_fn v9fs_link(void *opaque)
{
V9fsPDU *pdu = opaque;
int32_t dfid, oldfid;
@ -2425,7 +2427,7 @@ out_nofid:
}
/* Only works with path name based fid */
static void v9fs_remove(void *opaque)
static void coroutine_fn v9fs_remove(void *opaque)
{
int32_t fid;
int err = 0;
@ -2469,7 +2471,7 @@ out_nofid:
pdu_complete(pdu, err);
}
static void v9fs_unlinkat(void *opaque)
static void coroutine_fn v9fs_unlinkat(void *opaque)
{
int err = 0;
V9fsString name;
@ -2532,8 +2534,9 @@ out_nofid:
/* Only works with path name based fid */
static int v9fs_complete_rename(V9fsPDU *pdu, V9fsFidState *fidp,
int32_t newdirfid, V9fsString *name)
static int coroutine_fn v9fs_complete_rename(V9fsPDU *pdu, V9fsFidState *fidp,
int32_t newdirfid,
V9fsString *name)
{
char *end;
int err = 0;
@ -2590,7 +2593,7 @@ out_nofid:
}
/* Only works with path name based fid */
static void v9fs_rename(void *opaque)
static void coroutine_fn v9fs_rename(void *opaque)
{
int32_t fid;
ssize_t err = 0;
@ -2641,9 +2644,10 @@ out_nofid:
v9fs_string_free(&name);
}
static void v9fs_fix_fid_paths(V9fsPDU *pdu, V9fsPath *olddir,
V9fsString *old_name, V9fsPath *newdir,
V9fsString *new_name)
static void coroutine_fn v9fs_fix_fid_paths(V9fsPDU *pdu, V9fsPath *olddir,
V9fsString *old_name,
V9fsPath *newdir,
V9fsString *new_name)
{
V9fsFidState *tfidp;
V9fsPath oldpath, newpath;
@ -2669,9 +2673,10 @@ static void v9fs_fix_fid_paths(V9fsPDU *pdu, V9fsPath *olddir,
v9fs_path_free(&newpath);
}
static int v9fs_complete_renameat(V9fsPDU *pdu, int32_t olddirfid,
V9fsString *old_name, int32_t newdirfid,
V9fsString *new_name)
static int coroutine_fn v9fs_complete_renameat(V9fsPDU *pdu, int32_t olddirfid,
V9fsString *old_name,
int32_t newdirfid,
V9fsString *new_name)
{
int err = 0;
V9fsState *s = pdu->s;
@ -2712,7 +2717,7 @@ out:
return err;
}
static void v9fs_renameat(void *opaque)
static void coroutine_fn v9fs_renameat(void *opaque)
{
ssize_t err = 0;
size_t offset = 7;
@ -2754,7 +2759,7 @@ out_err:
v9fs_string_free(&new_name);
}
static void v9fs_wstat(void *opaque)
static void coroutine_fn v9fs_wstat(void *opaque)
{
int32_t fid;
int err = 0;
@ -2893,7 +2898,7 @@ static int v9fs_fill_statfs(V9fsState *s, V9fsPDU *pdu, struct statfs *stbuf)
fsid_val, f_namelen);
}
static void v9fs_statfs(void *opaque)
static void coroutine_fn v9fs_statfs(void *opaque)
{
int32_t fid;
ssize_t retval = 0;
@ -2927,7 +2932,7 @@ out_nofid:
pdu_complete(pdu, retval);
}
static void v9fs_mknod(void *opaque)
static void coroutine_fn v9fs_mknod(void *opaque)
{
int mode;
@ -2993,7 +2998,7 @@ out_nofid:
* do any thing in * qemu 9p server side lock code path.
* So when a TLOCK request comes, always return success
*/
static void v9fs_lock(void *opaque)
static void coroutine_fn v9fs_lock(void *opaque)
{
int8_t status;
V9fsFlock flock;
@ -3046,7 +3051,7 @@ out_nofid:
* When a TGETLOCK request comes, always return success because all lock
* handling is done by client's VFS layer.
*/
static void v9fs_getlock(void *opaque)
static void coroutine_fn v9fs_getlock(void *opaque)
{
size_t offset = 7;
struct stat stbuf;
@ -3091,7 +3096,7 @@ out_nofid:
v9fs_string_free(&glock.client_id);
}
static void v9fs_mkdir(void *opaque)
static void coroutine_fn v9fs_mkdir(void *opaque)
{
V9fsPDU *pdu = opaque;
size_t offset = 7;
@ -3145,7 +3150,7 @@ out_nofid:
v9fs_string_free(&name);
}
static void v9fs_xattrwalk(void *opaque)
static void coroutine_fn v9fs_xattrwalk(void *opaque)
{
int64_t size;
V9fsString name;
@ -3251,7 +3256,7 @@ out_nofid:
v9fs_string_free(&name);
}
static void v9fs_xattrcreate(void *opaque)
static void coroutine_fn v9fs_xattrcreate(void *opaque)
{
int flags;
int32_t fid;
@ -3291,7 +3296,7 @@ out_nofid:
v9fs_string_free(&name);
}
static void v9fs_readlink(void *opaque)
static void coroutine_fn v9fs_readlink(void *opaque)
{
V9fsPDU *pdu = opaque;
size_t offset = 7;
@ -3367,13 +3372,13 @@ static CoroutineEntry *pdu_co_handlers[] = {
[P9_TREMOVE] = v9fs_remove,
};
static void v9fs_op_not_supp(void *opaque)
static void coroutine_fn v9fs_op_not_supp(void *opaque)
{
V9fsPDU *pdu = opaque;
pdu_complete(pdu, -EOPNOTSUPP);
}
static void v9fs_fs_ro(void *opaque)
static void coroutine_fn v9fs_fs_ro(void *opaque)
{
V9fsPDU *pdu = opaque;
pdu_complete(pdu, -EROFS);

View File

@ -324,7 +324,7 @@ static inline uint8_t v9fs_request_cancelled(V9fsPDU *pdu)
return pdu->cancelled;
}
void v9fs_reclaim_fd(V9fsPDU *pdu);
void coroutine_fn v9fs_reclaim_fd(V9fsPDU *pdu);
void v9fs_path_init(V9fsPath *path);
void v9fs_path_free(V9fsPath *path);
void v9fs_path_sprintf(V9fsPath *path, const char *fmt, ...);