9p: Simplify error path of v9fs_device_realize_common()

Make v9fs_device_unrealize_common() idempotent and use it for rollback,
in order to reduce code duplication.

Signed-off-by: Greg Kurz <groug@kaod.org>
This commit is contained in:
Greg Kurz 2019-10-10 11:36:04 +02:00
parent 8703283352
commit c0da0cb761
3 changed files with 14 additions and 10 deletions

View File

@ -1465,6 +1465,10 @@ static void local_cleanup(FsContext *ctx)
{
LocalData *data = ctx->private;
if (!data) {
return;
}
close(data->mountfd);
g_free(data);
}

View File

@ -1185,6 +1185,10 @@ static void proxy_cleanup(FsContext *ctx)
{
V9fsProxy *proxy = ctx->private;
if (!proxy) {
return;
}
g_free(proxy->out_iovec.iov_base);
g_free(proxy->in_iovec.iov_base);
if (ctx->export_flags & V9FS_PROXY_SOCK_NAME) {

View File

@ -3637,27 +3637,23 @@ int v9fs_device_realize_common(V9fsState *s, const V9fsTransport *t,
s->ctx.fst = &fse->fst;
fsdev_throttle_init(s->ctx.fst);
v9fs_path_free(&path);
rc = 0;
out:
if (rc) {
if (s->ops && s->ops->cleanup && s->ctx.private) {
s->ops->cleanup(&s->ctx);
}
g_free(s->tag);
g_free(s->ctx.fs_root);
v9fs_path_free(&path);
v9fs_device_unrealize_common(s, NULL);
}
v9fs_path_free(&path);
return rc;
}
void v9fs_device_unrealize_common(V9fsState *s, Error **errp)
{
if (s->ops->cleanup) {
if (s->ops && s->ops->cleanup) {
s->ops->cleanup(&s->ctx);
}
fsdev_throttle_cleanup(s->ctx.fst);
if (s->ctx.fst) {
fsdev_throttle_cleanup(s->ctx.fst);
}
g_free(s->tag);
g_free(s->ctx.fs_root);
}