[libvirt] [PATCH] storage: Cleanup logical volume creation code

John Ferlan jferlan at redhat.com
Wed Mar 6 13:46:15 UTC 2013


On 03/06/2013 08:04 AM, Jiri Denemark wrote:
> This patch plugs two memory leaks, removes some useless and confusing
> constructs and renames renames "cleanup" label as "error" since it is
> only used for error path rather then being common for both success and
> error paths.
> ---
>  src/storage/storage_backend_logical.c | 23 ++++++++++++-----------
>  1 file changed, 12 insertions(+), 11 deletions(-)
> 
> diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c
> index bb709df..4757fe7 100644
> --- a/src/storage/storage_backend_logical.c
> +++ b/src/storage/storage_backend_logical.c
> @@ -700,7 +700,7 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn,
>                                    virStoragePoolObjPtr pool,
>                                    virStorageVolDefPtr vol)
>  {
> -    int fdret, fd = -1;
> +    int fd = -1;
>      virCommandPtr cmd = NULL;
>      virErrorPtr err;
>  
> @@ -741,11 +741,12 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn,
>          virCommandAddArg(cmd, pool->def->source.name);
>  
>      if (virCommandRun(cmd, NULL) < 0)
> -        goto cleanup;
> +        goto error;
>  
> -    if ((fdret = virStorageBackendVolOpen(vol->target.path)) < 0)
> -        goto cleanup;
> -    fd = fdret;
> +    virCommandFree(cmd);

You'll need a 'cmd = NULL' here so that we don't end up in error: making
the same call (virCommandFree() does call VIR_FREE(cmd), but that only
sets cmd = NULL in that context, when we return here it's not NULL anymore).

> +
> +    if ((fd = virStorageBackendVolOpen(vol->target.path)) < 0)
> +        goto error;
>  
>      /* We can only chown/grp if root */
>      if (getuid() == 0) {
> @@ -753,40 +754,40 @@ virStorageBackendLogicalCreateVol(virConnectPtr conn,
>              virReportSystemError(errno,
>                                   _("cannot set file owner '%s'"),
>                                   vol->target.path);
> -            goto cleanup;
> +            goto error;
>          }
>      }
>      if (fchmod(fd, vol->target.perms.mode) < 0) {
>          virReportSystemError(errno,
>                               _("cannot set file mode '%s'"),
>                               vol->target.path);
> -        goto cleanup;
> +        goto error;
>      }
>  
>      if (VIR_CLOSE(fd) < 0) {
>          virReportSystemError(errno,
>                               _("cannot close file '%s'"),
>                               vol->target.path);
> -        goto cleanup;
> +        goto error;
>      }
> -    fd = -1;
>  
>      /* Fill in data about this new vol */
>      if (virStorageBackendLogicalFindLVs(pool, vol) < 0) {
>          virReportSystemError(errno,
>                               _("cannot find newly created volume '%s'"),
>                               vol->target.path);
> -        goto cleanup;
> +        goto error;
>      }
>  
>      return 0;
>  
> - cleanup:
> + error:
>      err = virSaveLastError();
>      VIR_FORCE_CLOSE(fd);
>      virStorageBackendLogicalDeleteVol(conn, pool, vol, 0);
>      virCommandFree(cmd);
>      virSetError(err);
> +    virFreeError(err);
>      return -1;
>  }
>  
> 




More information about the libvir-list mailing list