[libvirt] [PATCH v2 11/32] storage: Use VIR_AUTOPTR(virCommand)

John Ferlan jferlan at redhat.com
Tue Feb 12 02:33:53 UTC 2019



On 2/11/19 9:52 AM, Ján Tomko wrote:
> On Mon, Feb 11, 2019 at 07:41:41AM -0500, John Ferlan wrote:
>>
>>
>> On 2/11/19 7:33 AM, Ján Tomko wrote:
>>> On Fri, Feb 08, 2019 at 01:37:05PM -0500, John Ferlan wrote:
>>>> Let's make use of the auto __cleanup capabilities cleaning up any
>>>> now unnecessary goto paths.
>>>>
>>>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>>>> Reviewed-by: Erik Skultety <eskultet at redhat.com>
>>>> ---
>>>> src/storage/storage_backend_disk.c     |  85 +++++++++------------
>>>> src/storage/storage_backend_fs.c       |  39 +++-------
>>>> src/storage/storage_backend_logical.c  | 101 +++++++------------------
>>>> src/storage/storage_backend_sheepdog.c |  59 ++++++---------
>>>> src/storage/storage_backend_vstorage.c |  14 +---
>>>> src/storage/storage_backend_zfs.c      |  47 +++---------
>>>> src/storage/storage_driver.c           |   3 +-
>>>> src/storage/storage_util.c             |  34 +++------
>>>> src/util/virstoragefile.c              |  67 +++++++---------
>>>> tests/storagepoolxml2argvtest.c        |   7 +-
>>>> tests/storagevolxml2argvtest.c         |   6 +-
>>>> tests/virstoragetest.c                 |   6 +-
>>>> 12 files changed, 156 insertions(+), 312 deletions(-)
>>>>
>>>> @@ -502,51 +500,40 @@
>>>> virStorageBackendDiskBuildPool(virStoragePoolObjPtr pool,
>>>>     virStoragePoolDefPtr def = virStoragePoolObjGetDef(pool);
>>>>     int format = def->source.format;
>>>>     const char *fmt;
>>>> -    bool ok_to_mklabel = false;
>>>> -    int ret = -1;
>>>> -    virCommandPtr cmd = NULL;
>>>> +    VIR_AUTOPTR(virCommand) cmd = NULL;
>>>>
>>>>     virCheckFlags(VIR_STORAGE_POOL_BUILD_OVERWRITE |
>>>> -                  VIR_STORAGE_POOL_BUILD_NO_OVERWRITE, ret);
>>>> +                  VIR_STORAGE_POOL_BUILD_NO_OVERWRITE, -1);
>>>>
>>>> -    VIR_EXCLUSIVE_FLAGS_GOTO(VIR_STORAGE_POOL_BUILD_OVERWRITE,
>>>> -                             VIR_STORAGE_POOL_BUILD_NO_OVERWRITE,
>>>> -                             error);
>>>> +    VIR_EXCLUSIVE_FLAGS_RET(VIR_STORAGE_POOL_BUILD_OVERWRITE,
>>>> +                            VIR_STORAGE_POOL_BUILD_NO_OVERWRITE,
>>>> +                            -1);
>>>>
>>>>     fmt = virStoragePoolFormatDiskTypeToString(format);
>>>> -    if (flags & VIR_STORAGE_POOL_BUILD_OVERWRITE) {
>>>> -        ok_to_mklabel = true;
>>>> -    } else {
>>>> -        if
>>>> (virStorageBackendDeviceIsEmpty(def->source.devices[0].path,
>>>> -                                           fmt, true))
>>>> -            ok_to_mklabel = true;
>>>> -    }
>>>> +    if (!(flags & VIR_STORAGE_POOL_BUILD_OVERWRITE) &&
>>>> +        !(virStorageBackendDeviceIsEmpty(def->source.devices[0].path,
>>>> +                                         fmt, true)))
>>>> +        return -1;
>>>>
>>>> -    if (ok_to_mklabel) {
>>>> -        if
>>>> (virStorageBackendZeroPartitionTable(def->source.devices[0].path,
>>>> -                                                1024 * 1024) < 0)
>>>> -            goto error;
>>>> +    if
>>>> (virStorageBackendZeroPartitionTable(def->source.devices[0].path,
>>>> +                                            1024 * 1024) < 0)
>>>> +        return -1;
>>>>
>>>> -        /* eg parted /dev/sda mklabel --script msdos */
>>>> -        if (format == VIR_STORAGE_POOL_DISK_UNKNOWN)
>>>> -            format = def->source.format = VIR_STORAGE_POOL_DISK_DOS;
>>>> -        if (format == VIR_STORAGE_POOL_DISK_DOS)
>>>> -            fmt = "msdos";
>>>> -        else
>>>> -            fmt = virStoragePoolFormatDiskTypeToString(format);
>>>> -
>>>> -        cmd = virCommandNewArgList(PARTED,
>>>> -                                   def->source.devices[0].path,
>>>> -                                   "mklabel",
>>>> -                                   "--script",
>>>> -                                   fmt,
>>>> -                                   NULL);
>>>> -        ret = virCommandRun(cmd, NULL);
>>>> -    }
>>>> +    /* eg parted /dev/sda mklabel --script msdos */
>>>> +    if (format == VIR_STORAGE_POOL_DISK_UNKNOWN)
>>>> +        format = def->source.format = VIR_STORAGE_POOL_DISK_DOS;
>>>> +    if (format == VIR_STORAGE_POOL_DISK_DOS)
>>>> +        fmt = "msdos";
>>>> +    else
>>>> +        fmt = virStoragePoolFormatDiskTypeToString(format);
>>>>
>>>> - error:
>>>> -    virCommandFree(cmd);
>>>> -    return ret;
>>>> +    cmd = virCommandNewArgList(PARTED,
>>>> +                               def->source.devices[0].path,
>>>> +                               "mklabel",
>>>> +                               "--script",
>>>> +                               fmt,
>>>> +                               NULL);
>>>> +    return virCommandRun(cmd, NULL);
>>>> }
>>>
>>> Apart from the usual mixing of the ret->goto changes with adding
>>> AUTOFREE, this also removes the 'ok_to_mklabel' bool.
>>> Those changes really should be separated.
>>>
>>
>> Just so it's clear what's being requested, does this mean taking the
>> current code and adding the:
>>
>> +    if (!(flags & VIR_STORAGE_POOL_BUILD_OVERWRITE) &&
>> +        !(virStorageBackendDeviceIsEmpty(def->source.devices[0].path,
>> +                                         fmt, true)))
>> +        goto error;
>>
>> and then reformatting the rest inline as is done here (more or less)?
>>
> 
> Yes. Also, in that case we seem to exit without logging an error (as
> opposed to calling virCommandRun which should log one).
> 
> Jano

Not sure what was meant about we seem to exit without logging an error.
If virStorageBackendDeviceIsEmpty an error message is generated if false
is returned.  Here's what I have for the difference (attached with any
luck):

John

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-storage-Rework-logic-in-virStorageBackendDiskBuildPo.patch
Type: text/x-patch
Size: 3304 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20190211/e3317a49/attachment-0001.bin>


More information about the libvir-list mailing list