@@ -2119,33 +2119,6 @@ out:
v9fs_string_free(&fullname);
}
-static void v9fs_post_symlink(V9fsState *s, V9fsSymlinkState *vs, int err)
-{
- if (err == 0) {
- stat_to_qid(&vs->stbuf, &vs->qid);
- vs->offset += pdu_marshal(vs->pdu, vs->offset, "Q", &vs->qid);
- err = vs->offset;
- } else {
- err = -errno;
- }
- complete_pdu(s, vs->pdu, err);
- v9fs_string_free(&vs->name);
- v9fs_string_free(&vs->symname);
- v9fs_string_free(&vs->fullname);
- qemu_free(vs);
-}
-
-static void v9fs_symlink_post_do_symlink(V9fsState *s, V9fsSymlinkState *vs,
- int err)
-{
- if (err) {
- goto out;
- }
- err = v9fs_do_lstat(s, &vs->fullname, &vs->stbuf);
-out:
- v9fs_post_symlink(s, vs, err);
-}
-
static void v9fs_symlink(void *opaque)
{
V9fsPDU *pdu = opaque;
@@ -2171,16 +2144,26 @@ static void v9fs_symlink(void *opaque)
}
v9fs_string_sprintf(&vs->fullname, "%s/%s", vs->dfidp->path.data,
- vs->name.data);
+ vs->name.data);
err = v9fs_do_symlink(s, vs->dfidp, vs->symname.data,
- vs->fullname.data, gid);
- v9fs_symlink_post_do_symlink(s, vs, err);
- return;
-
+ vs->fullname.data, gid);
+ if (err < 0) {
+ err = -errno;
+ goto out;
+ }
+ err = v9fs_do_lstat(s, &vs->fullname, &vs->stbuf);
+ if (err == 0) {
+ stat_to_qid(&vs->stbuf, &vs->qid);
+ vs->offset += pdu_marshal(vs->pdu, vs->offset, "Q", &vs->qid);
+ err = vs->offset;
+ } else {
+ err = -errno;
+ }
out:
complete_pdu(s, vs->pdu, err);
v9fs_string_free(&vs->name);
v9fs_string_free(&vs->symname);
+ v9fs_string_free(&vs->fullname);
qemu_free(vs);
}