Revision 8f354003 hw/virtio-9p.c
b/hw/virtio-9p.c | ||
---|---|---|
3203 | 3203 |
qemu_free(vs); |
3204 | 3204 |
} |
3205 | 3205 |
|
3206 |
/* |
|
3207 |
* When a TGETLOCK request comes, always return success because all lock |
|
3208 |
* handling is done by client's VFS layer. |
|
3209 |
*/ |
|
3210 |
|
|
3211 |
static void v9fs_getlock(V9fsState *s, V9fsPDU *pdu) |
|
3212 |
{ |
|
3213 |
int32_t fid, err = 0; |
|
3214 |
V9fsGetlockState *vs; |
|
3215 |
|
|
3216 |
vs = qemu_mallocz(sizeof(*vs)); |
|
3217 |
vs->pdu = pdu; |
|
3218 |
vs->offset = 7; |
|
3219 |
|
|
3220 |
vs->glock = qemu_malloc(sizeof(*vs->glock)); |
|
3221 |
pdu_unmarshal(vs->pdu, vs->offset, "dbqqds", &fid, &vs->glock->type, |
|
3222 |
&vs->glock->start, &vs->glock->length, &vs->glock->proc_id, |
|
3223 |
&vs->glock->client_id); |
|
3224 |
|
|
3225 |
vs->fidp = lookup_fid(s, fid); |
|
3226 |
if (vs->fidp == NULL) { |
|
3227 |
err = -ENOENT; |
|
3228 |
goto out; |
|
3229 |
} |
|
3230 |
|
|
3231 |
err = v9fs_do_fstat(s, vs->fidp->fs.fd, &vs->stbuf); |
|
3232 |
if (err < 0) { |
|
3233 |
err = -errno; |
|
3234 |
goto out; |
|
3235 |
} |
|
3236 |
vs->glock->type = F_UNLCK; |
|
3237 |
vs->offset += pdu_marshal(vs->pdu, vs->offset, "bqqds", vs->glock->type, |
|
3238 |
vs->glock->start, vs->glock->length, vs->glock->proc_id, |
|
3239 |
&vs->glock->client_id); |
|
3240 |
out: |
|
3241 |
complete_pdu(s, vs->pdu, err); |
|
3242 |
qemu_free(vs->glock); |
|
3243 |
qemu_free(vs); |
|
3244 |
} |
|
3245 |
|
|
3206 | 3246 |
static void v9fs_mkdir_post_lstat(V9fsState *s, V9fsMkState *vs, int err) |
3207 | 3247 |
{ |
3208 | 3248 |
if (err == -1) { |
... | ... | |
3466 | 3506 |
[P9_TMKNOD] = v9fs_mknod, |
3467 | 3507 |
[P9_TRENAME] = v9fs_rename, |
3468 | 3508 |
[P9_TLOCK] = v9fs_lock, |
3509 |
[P9_TGETLOCK] = v9fs_getlock, |
|
3469 | 3510 |
[P9_TMKDIR] = v9fs_mkdir, |
3470 | 3511 |
[P9_TVERSION] = v9fs_version, |
3471 | 3512 |
[P9_TLOPEN] = v9fs_open, |
Also available in: Unified diff