Commit 8440e22e authored by Greg Kurz's avatar Greg Kurz
Browse files

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: default avatarGreg Kurz <groug@kaod.org>
parent 5bdade66
Loading
Loading
Loading
Loading
+61 −56
Original line number Diff line number Diff line
@@ -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,7 +811,7 @@ static uint32_t stat_to_v9mode(const struct stat *stbuf)
    return mode;
}

static int stat_to_v9stat(V9fsPDU *pdu, V9fsPath *name,
static int coroutine_fn stat_to_v9stat(V9fsPDU *pdu, V9fsPath *name,
                                       const struct stat *stbuf,
                                       V9fsStat *v9stat)
{
@@ -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,8 +2644,9 @@ out_nofid:
    v9fs_string_free(&name);
}

static void v9fs_fix_fid_paths(V9fsPDU *pdu, V9fsPath *olddir,
                               V9fsString *old_name, V9fsPath *newdir,
static void coroutine_fn v9fs_fix_fid_paths(V9fsPDU *pdu, V9fsPath *olddir,
                                            V9fsString *old_name,
                                            V9fsPath *newdir,
                                            V9fsString *new_name)
{
    V9fsFidState *tfidp;
@@ -2669,8 +2673,9 @@ 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,
static int coroutine_fn v9fs_complete_renameat(V9fsPDU *pdu, int32_t olddirfid,
                                               V9fsString *old_name,
                                               int32_t newdirfid,
                                               V9fsString *new_name)
{
    int err = 0;
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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, ...);