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