[libvirt] [PATCH] sanlock: Provide better error if lockspace directory is missing

Daniel P. Berrange berrange at redhat.com
Tue Aug 21 13:57:30 UTC 2012


On Tue, Aug 21, 2012 at 03:42:37PM +0200, Jiri Denemark wrote:
> Generating "Unable to add lockspace /lock/space/dir/__LIBVIRT__DISKS__:
> No such file or directory" is correct but not exactly clear. This patch
> changes the error message to "Unable to create lockspace
> /lock/space/dir/__LIBVIRT__DISKS__: parent directory does not exist or
> is not a directory".
> ---
>  src/locking/lock_driver_sanlock.c | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
> 
> diff --git a/src/locking/lock_driver_sanlock.c b/src/locking/lock_driver_sanlock.c
> index f046102..7700b31 100644
> --- a/src/locking/lock_driver_sanlock.c
> +++ b/src/locking/lock_driver_sanlock.c
> @@ -35,6 +35,7 @@
>  #include <sanlock_resource.h>
>  #include <sanlock_admin.h>
>  
> +#include "dirname.h"
>  #include "lock_driver.h"
>  #include "logging.h"
>  #include "virterror_internal.h"
> @@ -150,6 +151,7 @@ static int virLockManagerSanlockSetupLockspace(void)
>      int rv;
>      struct sanlk_lockspace ls;
>      char *path = NULL;
> +    char *dir = NULL;
>  
>      if (virAsprintf(&path, "%s/%s",
>                      driver->autoDiskLeasePath,
> @@ -174,6 +176,19 @@ static int virLockManagerSanlockSetupLockspace(void)
>       */
>      if (stat(path, &st) < 0) {
>          VIR_DEBUG("Lockspace %s does not yet exist", path);
> +
> +        if (!(dir = mdir_name(path))) {
> +            virReportOOMError();
> +            goto error;
> +        }
> +        if (stat(dir, &st) < 0 || !S_ISDIR(st.st_mode)) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("Unable to create lockspace %s: parent directory"
> +                             " does not exist or is not a directory"),
> +                           path);
> +            goto error;
> +        }
> +
>          if ((fd = open(path, O_WRONLY|O_CREAT|O_EXCL, 0600)) < 0) {
>              if (errno != EEXIST) {
>                  virReportSystemError(errno,
> @@ -257,6 +272,7 @@ error_unlink:
>  error:
>      VIR_FORCE_CLOSE(fd);
>      VIR_FREE(path);
> +    VIR_FREE(dir);
>      return -1;
>  }

ACK


Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list