On Tue, Jun 16, 2020 at 10:39:46PM +0800, Bihong Yu wrote:
> >From d9f7ed2af581222804392f9b93dc6aaf7d8c8995 Mon Sep 17 00:00:00 2001
> From: Bihong Yu <yubih...@huawei.com>
> Date: Tue, 16 Jun 2020 22:08:55 +0800
> Subject: [PATCH] utils: add mutex to avoid races in virfile
> 
> There are races condiction to make '/run/libvirt/qemu/dbus' directory in
> virDirCreateNoFork() while concurrent start VMs, and get "failed to create
> directory '/run/libvirt/qemu/dbus': File exists" error message. Add an
> mutex to avoid races.
> 
> Signed-off-by:Bihong Yu <yubih...@huawei.com>
> Reviewed-by:Chuan Zheng <zhengch...@huawei.com>
> Reviewed-by:alexchen <alex.c...@huawei.com>
> ---
>  src/util/virfile.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/src/util/virfile.c b/src/util/virfile.c
> index 20260a2..ae02a6e 100644
> --- a/src/util/virfile.c
> +++ b/src/util/virfile.c
> @@ -88,6 +88,7 @@
>  #include "virstring.h"
>  #include "virutil.h"
>  #include "virsocket.h"
> +#include "virthread.h"
> 
>  #define VIR_FROM_THIS VIR_FROM_NONE
> 
> @@ -108,6 +109,9 @@ VIR_LOG_INIT("util.file");
>  # define O_DIRECT 0
>  #endif
> 
> +/* Global mutex to avoid races */
> +virMutex fileLock = VIR_MUTEX_INITIALIZER;
> +
>  int virFileClose(int *fdptr, virFileCloseFlags flags)
>  {
>      int saved_errno = 0;
> @@ -2612,15 +2616,18 @@ virDirCreateNoFork(const char *path,
>      struct stat st;
>      bool created = false;
> 
> +    virMutexLock(&fileLock);
>      if (!((flags & VIR_DIR_CREATE_ALLOW_EXIST) && virFileExists(path))) {
>          if (mkdir(path, mode) < 0) {

Instead of adding a mutex we should get rid of the virFileExists check
entirely. Instead check "errno == EEXIST && (flags & 
VIR_DIR_CREATE_ALLOW_EXIST)"
before reporting an error.

>              ret = -errno;
>              virReportSystemError(errno, _("failed to create directory '%s'"),
>                                   path);
> +            virMutexUnlock(&fileLock);
>              goto error;
>          }
>          created = true;
>      }
> +    virMutexUnlock(&fileLock);
> 
>      if (stat(path, &st) == -1) {
>          ret = -errno;

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

Reply via email to