[libvirt] [PATCH v2 5/5] storage: fs: Only force directory permissions if required

John Ferlan jferlan at redhat.com
Fri May 8 15:01:03 UTC 2015



On 05/05/2015 12:44 PM, Cole Robinson wrote:
> Only set directory permissions at pool build time, if:
> 
> - User explicitly requested a mode via the XML
> - The directory needs to be created
> - We need to do the crazy NFS root-squash workaround
> 
> This allows qemu:///session to call build on an existing directory
> like /tmp.
> ---
> v2:
>     Fix style issue pointed out by pkrempa
>     Skip chmod if mode == -1 for the fork/nfs case as well
> 
>  src/storage/storage_backend_fs.c | 16 +++++++++++-----
>  src/util/virfile.c               |  4 ++--
>  2 files changed, 13 insertions(+), 7 deletions(-)
> 

A bit of bikeshedding, but adding a local create_flags =
VIR_DIR_CREATE_ALLOW_EXIST and OR'ing in VIR_DIR_CREATE_AS_UID would
enhance readability...


ACK (either way)

John

> diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
> index ed56935..3f42a5b 100644
> --- a/src/storage/storage_backend_fs.c
> +++ b/src/storage/storage_backend_fs.c
> @@ -769,6 +769,8 @@ virStorageBackendFileSystemBuild(virConnectPtr conn ATTRIBUTE_UNUSED,
>      int err, ret = -1;
>      char *parent = NULL;
>      char *p = NULL;
> +    mode_t mode;
> +    bool needs_create_as_uid;
>  
>      virCheckFlags(VIR_STORAGE_POOL_BUILD_OVERWRITE |
>                    VIR_STORAGE_POOL_BUILD_NO_OVERWRITE, ret);
> @@ -797,18 +799,22 @@ virStorageBackendFileSystemBuild(virConnectPtr conn ATTRIBUTE_UNUSED,
>          }
>      }
>  
> +    needs_create_as_uid = (pool->def->type == VIR_STORAGE_POOL_NETFS);
> +    mode = pool->def->target.perms.mode;
> +    if (mode == (mode_t) -1 &&
> +        (needs_create_as_uid || !virFileExists(pool->def->target.path)))
> +        mode = VIR_STORAGE_DEFAULT_POOL_PERM_MODE;
> +
>      /* Now create the final dir in the path with the uid/gid/mode
>       * requested in the config. If the dir already exists, just set
>       * the perms. */
>      if ((err = virDirCreate(pool->def->target.path,
> -                            (pool->def->target.perms.mode == (mode_t) -1 ?
> -                             VIR_STORAGE_DEFAULT_POOL_PERM_MODE :
> -                             pool->def->target.perms.mode),
> +                            mode,
>                              pool->def->target.perms.uid,
>                              pool->def->target.perms.gid,
>                              VIR_DIR_CREATE_ALLOW_EXIST |
> -                            (pool->def->type == VIR_STORAGE_POOL_NETFS
> -                            ? VIR_DIR_CREATE_AS_UID : 0))) < 0) {
> +                            (needs_create_as_uid ?
> +                             VIR_DIR_CREATE_AS_UID : 0))) < 0) {
>          goto error;
>      }
>  
> diff --git a/src/util/virfile.c b/src/util/virfile.c
> index 63eafdf..5ff4668 100644
> --- a/src/util/virfile.c
> +++ b/src/util/virfile.c
> @@ -2311,7 +2311,7 @@ virDirCreateNoFork(const char *path,
>                               path, (unsigned int) uid, (unsigned int) gid);
>          goto error;
>      }
> -    if (chmod(path, mode) < 0) {
> +    if (mode != (mode_t) -1 && chmod(path, mode) < 0) {
>          ret = -errno;
>          virReportSystemError(errno,
>                               _("cannot set mode of '%s' to %04o"),
> @@ -2424,7 +2424,7 @@ virDirCreate(const char *path,
>                               path, (unsigned int) gid);
>          goto childerror;
>      }
> -    if (chmod(path, mode) < 0) {
> +    if (mode != (mode_t) -1 && chmod(path, mode) < 0) {
>          virReportSystemError(errno,
>                               _("cannot set mode of '%s' to %04o"),
>                               path, mode);
> 




More information about the libvir-list mailing list