Revision 1b733fed hw/9pfs/virtio-9p.c

b/hw/9pfs/virtio-9p.c
3019 3019
    return;
3020 3020
}
3021 3021

  
3022
static void v9fs_mknod_post_lstat(V9fsState *s, V9fsMkState *vs, int err)
3023
{
3024
    if (err == -1) {
3025
        err = -errno;
3026
        goto out;
3027
    }
3028

  
3029
    stat_to_qid(&vs->stbuf, &vs->qid);
3030
    vs->offset += pdu_marshal(vs->pdu, vs->offset, "Q", &vs->qid);
3031
    err = vs->offset;
3032
out:
3033
    complete_pdu(s, vs->pdu, err);
3034
    v9fs_string_free(&vs->fullname);
3035
    v9fs_string_free(&vs->name);
3036
    qemu_free(vs);
3037
}
3038

  
3039
static void v9fs_mknod_post_mknod(V9fsState *s, V9fsMkState *vs, int err)
3040
{
3041
    if (err == -1) {
3042
        err = -errno;
3043
        goto out;
3044
    }
3045

  
3046
    err = v9fs_do_lstat(s, &vs->fullname, &vs->stbuf);
3047
    v9fs_mknod_post_lstat(s, vs, err);
3048
    return;
3049
out:
3050
    complete_pdu(s, vs->pdu, err);
3051
    v9fs_string_free(&vs->fullname);
3052
    v9fs_string_free(&vs->name);
3053
    qemu_free(vs);
3054
}
3055

  
3056 3022
static void v9fs_mknod(void *opaque)
3057 3023
{
3058
    V9fsPDU *pdu = opaque;
3059
    V9fsState *s = pdu->s;
3024

  
3025
    int mode;
3026
    gid_t gid;
3060 3027
    int32_t fid;
3061
    V9fsMkState *vs;
3028
    V9fsQID qid;
3062 3029
    int err = 0;
3063
    V9fsFidState *fidp;
3064
    gid_t gid;
3065
    int mode;
3066 3030
    int major, minor;
3031
    size_t offset = 7;
3032
    V9fsString name;
3033
    struct stat stbuf;
3034
    V9fsString fullname;
3035
    V9fsFidState *fidp;
3036
    V9fsPDU *pdu = opaque;
3037
    V9fsState *s = pdu->s;
3067 3038

  
3068
    vs = qemu_malloc(sizeof(*vs));
3069
    vs->pdu = pdu;
3070
    vs->offset = 7;
3071

  
3072
    v9fs_string_init(&vs->fullname);
3073
    pdu_unmarshal(vs->pdu, vs->offset, "dsdddd", &fid, &vs->name, &mode,
3074
        &major, &minor, &gid);
3039
    v9fs_string_init(&fullname);
3040
    pdu_unmarshal(pdu, offset, "dsdddd", &fid, &name, &mode,
3041
                  &major, &minor, &gid);
3075 3042

  
3076 3043
    fidp = lookup_fid(s, fid);
3077 3044
    if (fidp == NULL) {
3078 3045
        err = -ENOENT;
3079 3046
        goto out;
3080 3047
    }
3081

  
3082
    v9fs_string_sprintf(&vs->fullname, "%s/%s", fidp->path.data, vs->name.data);
3083
    err = v9fs_do_mknod(s, vs->fullname.data, mode, makedev(major, minor),
3084
        fidp->uid, gid);
3085
    v9fs_mknod_post_mknod(s, vs, err);
3086
    return;
3087

  
3048
    v9fs_string_sprintf(&fullname, "%s/%s", fidp->path.data, name.data);
3049
    err = v9fs_co_mknod(s, &fullname, fidp->uid, gid,
3050
                        makedev(major, minor), mode);
3051
    if (err < 0) {
3052
        goto out;
3053
    }
3054
    err = v9fs_co_lstat(s, &fullname, &stbuf);
3055
    if (err < 0) {
3056
        goto out;
3057
    }
3058
    stat_to_qid(&stbuf, &qid);
3059
    err = offset;
3060
    err += pdu_marshal(pdu, offset, "Q", &qid);
3088 3061
out:
3089
    complete_pdu(s, vs->pdu, err);
3090
    v9fs_string_free(&vs->fullname);
3091
    v9fs_string_free(&vs->name);
3092
    qemu_free(vs);
3062
    complete_pdu(s, pdu, err);
3063
    v9fs_string_free(&fullname);
3064
    v9fs_string_free(&name);
3093 3065
}
3094 3066

  
3095 3067
/*

Also available in: Unified diff