[libvirt] [PATCH 12/19] storage: Introduce virStoragePoolObj{Get|Set}Autostart

Pavel Hrdina phrdina at redhat.com
Tue Jul 11 16:13:07 UTC 2017


On Tue, May 09, 2017 at 11:30:19AM -0400, John Ferlan wrote:
> Rather than have the logic in the storage driver, move it to virstorageobj.
> 
> NB: virStoragePoolObjGetAutostart can take liberties with not needing the
> same if...else construct.  Also pass a NULL for testStoragePoolSetAutostart
> to avoid the autostartLink setup using the autostartDir for the test driver.
> 
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
>  src/conf/virstorageobj.c     | 57 ++++++++++++++++++++++++++++++++++++++++++++
>  src/conf/virstorageobj.h     |  8 +++++++
>  src/libvirt_private.syms     |  2 ++
>  src/storage/storage_driver.c | 41 +++----------------------------
>  src/test/test_driver.c       | 13 ++--------
>  5 files changed, 72 insertions(+), 49 deletions(-)
> 
> diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c
> index 0079472..9ce3840 100644
> --- a/src/conf/virstorageobj.c
> +++ b/src/conf/virstorageobj.c
> @@ -111,6 +111,63 @@ virStoragePoolObjSetActive(virStoragePoolObjPtr obj,
>  }
>  
>  
> +int
> +virStoragePoolObjGetAutostart(virStoragePoolObjPtr obj)
> +{
> +    if (!obj->configFile)
> +        return 0;
> +
> +    return obj->autostart;
> +}

The getter is correct.

> +
> +
> +int
> +virStoragePoolObjSetAutostart(virStoragePoolObjPtr obj,
> +                              const char *autostartDir,
> +                              int autostart)
> +{
> +    obj->autostart = autostart;
> +

However, the setter does a lot more than it should be doing.

> +    if (!obj->configFile) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       "%s", _("pool has no config file"));
> +        return -1;
> +    }
> +
> +    autostart = (autostart != 0);
> +
> +    if (obj->autostart != autostart) {
> +        if (autostart && autostartDir) {
> +            if (virFileMakePath(autostartDir) < 0) {
> +                virReportSystemError(errno,
> +                                     _("cannot create autostart directory %s"),
> +                                     autostartDir);
> +                return -1;
> +            }

The autostartDir is owned by the storage driver so it is up to the
storage driver to create the directory and create/remove the symlink.

> +
> +            if (symlink(obj->configFile, obj->autostartLink) < 0) {
> +                virReportSystemError(errno,
> +                                     _("Failed to create symlink '%s' to '%s'"),
> +                                     obj->autostartLink, obj->configFile);
> +                return -1;
> +            }
> +        } else {
> +            if (unlink(obj->autostartLink) < 0 &&
> +                errno != ENOENT && errno != ENOTDIR) {
> +                virReportSystemError(errno,
> +                                     _("Failed to delete symlink '%s'"),
> +                                     obj->autostartLink);
> +                return -1;
> +            }
> +        }
> +
> +        obj->autostart = autostart;

This is duplicated the beginning of the function.  The one at the
beginning of the function is wrong, the @autostart should be changed
only if we actually creates the symlink.  I see that you've probably
added it at the beginning of the function to reuse it in the test driver
but that's wrong, it may cause issues for real storage driver.

> +    }
> +
> +    return 0;
> +}
> +
> +
>  unsigned int
>  virStoragePoolObjGetAsyncjobs(virStoragePoolObjPtr obj)
>  {
> diff --git a/src/conf/virstorageobj.h b/src/conf/virstorageobj.h
> index d47b233..3b6e395 100644
> --- a/src/conf/virstorageobj.h
> +++ b/src/conf/virstorageobj.h
> @@ -93,6 +93,14 @@ void
>  virStoragePoolObjSetActive(virStoragePoolObjPtr obj,
>                             bool active);
>  
> +int
> +virStoragePoolObjGetAutostart(virStoragePoolObjPtr obj);
> +
> +int
> +virStoragePoolObjSetAutostart(virStoragePoolObjPtr obj,
> +                              const char *autostartDir,
> +                              int autostart);
> +
>  unsigned int
>  virStoragePoolObjGetAsyncjobs(virStoragePoolObjPtr obj);
>  
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index edd3174..e8b4eda 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1014,6 +1014,7 @@ virStoragePoolObjDeleteDef;
>  virStoragePoolObjFindByName;
>  virStoragePoolObjFindByUUID;
>  virStoragePoolObjGetAsyncjobs;
> +virStoragePoolObjGetAutostart;
>  virStoragePoolObjGetConfigFile;
>  virStoragePoolObjGetDef;
>  virStoragePoolObjGetNames;
> @@ -1031,6 +1032,7 @@ virStoragePoolObjNumOfVolumes;
>  virStoragePoolObjRemove;
>  virStoragePoolObjSaveDef;
>  virStoragePoolObjSetActive;
> +virStoragePoolObjSetAutostart;
>  virStoragePoolObjSetConfigFile;
>  virStoragePoolObjSourceFindDuplicate;
>  virStoragePoolObjStealNewDef;
> diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
> index 6289314..c4e4e7b 100644
> --- a/src/storage/storage_driver.c
> +++ b/src/storage/storage_driver.c
> @@ -1250,11 +1250,7 @@ storagePoolGetAutostart(virStoragePoolPtr pool,
>      if (virStoragePoolGetAutostartEnsureACL(pool->conn, obj->def) < 0)
>          goto cleanup;
>  
> -    if (!obj->configFile) {
> -        *autostart = 0;
> -    } else {
> -        *autostart = obj->autostart;
> -    }
> +    *autostart = virStoragePoolObjGetAutostart(obj);
>  
>      ret = 0;
>  
> @@ -1277,39 +1273,8 @@ storagePoolSetAutostart(virStoragePoolPtr pool,
>      if (virStoragePoolSetAutostartEnsureACL(pool->conn, obj->def) < 0)
>          goto cleanup;
>  
> -    if (!obj->configFile) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR,
> -                       "%s", _("pool has no config file"));
> -    }
> -
> -    autostart = (autostart != 0);
> -
> -    if (obj->autostart != autostart) {
> -        if (autostart) {
> -            if (virFileMakePath(driver->autostartDir) < 0) {
> -                virReportSystemError(errno,
> -                                     _("cannot create autostart directory %s"),
> -                                     driver->autostartDir);
> -                goto cleanup;
> -            }
> -
> -            if (symlink(obj->configFile, obj->autostartLink) < 0) {
> -                virReportSystemError(errno,
> -                                     _("Failed to create symlink '%s' to '%s'"),
> -                                     obj->autostartLink, obj->configFile);
> -                goto cleanup;
> -            }
> -        } else {
> -            if (unlink(obj->autostartLink) < 0 &&
> -                errno != ENOENT && errno != ENOTDIR) {
> -                virReportSystemError(errno,
> -                                     _("Failed to delete symlink '%s'"),
> -                                     obj->autostartLink);
> -                goto cleanup;
> -            }
> -        }
> -        obj->autostart = autostart;

I would leave the symlink creation logic here, to do that we need to
have additional accessor API virStoragePoolObjGetAutostartLink().

Pavel

> -    }
> +    if (virStoragePoolObjSetAutostart(obj, driver->autostartDir, autostart) < 0)
> +        goto cleanup;
>  
>      ret = 0;
>  
> diff --git a/src/test/test_driver.c b/src/test/test_driver.c
> index 68f1412..d68a18d 100644
> --- a/src/test/test_driver.c
> +++ b/src/test/test_driver.c
> @@ -4690,11 +4690,7 @@ testStoragePoolGetAutostart(virStoragePoolPtr pool,
>      if (!(obj = testStoragePoolObjFindByName(privconn, pool->name)))
>          return -1;
>  
> -    if (!obj->configFile) {
> -        *autostart = 0;
> -    } else {
> -        *autostart = obj->autostart;
> -    }
> +    *autostart = virStoragePoolObjGetAutostart(obj);
>  
>      virStoragePoolObjUnlock(obj);
>      return 0;
> @@ -4712,14 +4708,9 @@ testStoragePoolSetAutostart(virStoragePoolPtr pool,
>      if (!(obj = testStoragePoolObjFindByName(privconn, pool->name)))
>          return -1;
>  
> -    if (!obj->configFile) {
> -        virReportError(VIR_ERR_INVALID_ARG,
> -                       "%s", _("pool has no config file"));
> +    if (virStoragePoolObjSetAutostart(obj, NULL, autostart) < 0)
>          goto cleanup;
> -    }
>  
> -    autostart = (autostart != 0);
> -    obj->autostart = autostart;
>      ret = 0;
>  
>   cleanup:
> -- 
> 2.9.3
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20170711/d61edde4/attachment-0001.sig>


More information about the libvir-list mailing list