[libvirt] [PATCH 01/14] Avoid polluting logs when querying LVM/SCSI ID

Peter Krempa pkrempa at redhat.com
Tue Dec 11 21:06:31 UTC 2012


On 12/11/12 21:41, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> When we invoke lvs or scsi_id to extract ID for block devices,
> we don't want virCommandWait logging errors messages. Thus we
> must explicitly check 'status != 0', rather than letting
> virCommandWait do it. Also move the check for converting from
> "" to NULL, after the cleanup label, since virCommandRun may
> set the key to "", even on failure
> ---
>   src/util/storage_file.c | 22 ++++++++++++++++++----
>   1 file changed, 18 insertions(+), 4 deletions(-)
>
> diff --git a/src/util/storage_file.c b/src/util/storage_file.c
> index 4417404..776d4f2 100644
> --- a/src/util/storage_file.c
> +++ b/src/util/storage_file.c
> @@ -1199,6 +1199,7 @@ const char *virStorageFileGetLVMKey(const char *path)
>        *    06UgP5-2rhb-w3Bo-3mdR-WeoL-pytO-SAa2ky
>        */
>       char *key = NULL;
> +    int status;
>       virCommandPtr cmd = virCommandNewArgList(
>           LVS,
>           "--noheadings", "--unbuffered", "--nosuffix",
> @@ -1208,7 +1209,13 @@ const char *virStorageFileGetLVMKey(const char *path)
>
>       /* Run the program and capture its output */
>       virCommandSetOutputBuffer(cmd, &key);
> -    if (virCommandRun(cmd, NULL) < 0)
> +    if (virCommandRun(cmd, &status) < 0)
> +        goto cleanup;
> +
> +    /* Explicitly check, rather than passing NULL to virCommandRun
> +     * because we don't want to pollute logs with an error message
> +     */
> +    if (status != 0)

You should report an error here or add a comment to explicitly note that 
this function isn't setting errors in some cases and cleanup paths of 
callers shouldn't rely on this.

>           goto cleanup;
>
>       if (key) {
> @@ -1228,10 +1235,10 @@ const char *virStorageFileGetLVMKey(const char *path)
>               *nl = '\0';
>       }
>
> +cleanup:
>       if (key && STREQ(key, ""))
>           VIR_FREE(key);
>
> -cleanup:
>       virCommandFree(cmd);
>
>       return key;
> @@ -1248,6 +1255,7 @@ const char *virStorageFileGetLVMKey(const char *path)
>   const char *virStorageFileGetSCSIKey(const char *path)
>   {
>       char *key = NULL;
> +    int status;
>       virCommandPtr cmd = virCommandNewArgList(
>           "/lib/udev/scsi_id",
>           "--replace-whitespace",
> @@ -1258,9 +1266,16 @@ const char *virStorageFileGetSCSIKey(const char *path)
>
>       /* Run the program and capture its output */
>       virCommandSetOutputBuffer(cmd, &key);
> -    if (virCommandRun(cmd, NULL) < 0)
> +    if (virCommandRun(cmd, &status) < 0)
>           goto cleanup;
>
> +    /* Explicitly check, rather than passing NULL to virCommandRun
> +     * because we don't want to pollute logs with an error message
> +     */
> +    if (status != 0)

same here

> +        goto cleanup;
> +
> +cleanup:
>       if (key && STRNEQ(key, "")) {
>           char *nl = strchr(key, '\n');
>           if (nl)
> @@ -1269,7 +1284,6 @@ const char *virStorageFileGetSCSIKey(const char *path)
>           VIR_FREE(key);
>       }
>
> -cleanup:
>       virCommandFree(cmd);
>
>       return key;
>

Otherwise looks good, so ACK if you follow one of the options in my 
comments.

Peter

P.S: Hopefully somebody will continue the review on this series as I'm 
out for today.





More information about the libvir-list mailing list