]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
sanlock: Provide better error if lockspace directory is missing
authorJiri Denemark <jdenemar@redhat.com>
Tue, 21 Aug 2012 13:27:10 +0000 (15:27 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Tue, 21 Aug 2012 16:09:09 +0000 (18:09 +0200)
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

index f046102f6a5d1f7e9d4abd9c26d7637c47a08605..7700b3188cce2c6917899597a19268839682c156 100644 (file)
@@ -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;
 }