Port-xen archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[PATCH v2 3/3] libxl: switch NetBSD file backend to Qemu if filesystem is not local



This forces libxl to use Qemu when a raw image file hosted on a
remote filesystem is used as a disk backend. NetBSD currently only
supports qemu-traditional, so
device_model_version="qemu-xen-traditional" has to be added to the
config file when using image files.

To detect if the filesystem is local the statvfs(2) function is used,
as recommended by Greg Troxel.

Signed-off-by: Roger Pau Monné <roger.pau%citrix.com@localhost>
---
 tools/libxl/libxl_device.c   |    8 +++++++-
 tools/libxl/libxl_internal.h |    4 +++-
 tools/libxl/libxl_linux.c    |    2 +-
 tools/libxl/libxl_netbsd.c   |   12 ++++++++++--
 4 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
index 51dd06e..eca2ec2 100644
--- a/tools/libxl/libxl_device.c
+++ b/tools/libxl/libxl_device.c
@@ -144,6 +144,7 @@ typedef struct {
     libxl__gc *gc;
     libxl_device_disk *disk;
     struct stat stab;
+    struct statvfs stvfs;
 } disk_try_backend_args;
 
 static int disk_try_backend(disk_try_backend_args *a,
@@ -167,7 +168,7 @@ static int disk_try_backend(disk_try_backend_args *a,
             return backend;
         }
 
-        if (libxl__try_phy_backend(a->stab.st_mode))
+        if (libxl__try_phy_backend(a->stab.st_mode, a->stvfs.f_flag))
             return backend;
 
         LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Disk vdev=%s, backend phy"
@@ -250,6 +251,11 @@ int libxl__device_disk_set_backend(libxl__gc *gc, 
libxl_device_disk *disk) {
                              disk->vdev, disk->pdev_path);
             return ERROR_INVAL;
         }
+        if (statvfs(disk->pdev_path, &a.stvfs)) {
+            LOGE(ERROR, "Disk vdev=%s failed to stat: %s",
+                 disk->vdev, disk->pdev_path);
+            return ERROR_INVAL;
+        }
     }
 
     if (disk->backend != LIBXL_DISK_BACKEND_UNKNOWN) {
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 0b38e3e..98666bd 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -43,6 +43,7 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <sys/socket.h>
+#include <sys/statvfs.h>
 
 #include <xenstore.h>
 #include <xenctrl.h>
@@ -1040,10 +1041,11 @@ static inline void 
libxl__domaindeathcheck_stop(libxl__gc *gc,
  * libxl__try_phy_backend - Check if there's support for the passed
  * type of file using the PHY backend
  * st_mode: mode_t of the file, as returned by stat function
+ * f_flag: flag as returned by statvfs(2) function
  *
  * Returns 1 on success, and 0 if not suitable for phy backend.
  */
-_hidden int libxl__try_phy_backend(mode_t st_mode);
+_hidden int libxl__try_phy_backend(mode_t st_mode, unsigned long f_flag);
 
 
 _hidden char *libxl__devid_to_localdev(libxl__gc *gc, int devid);
diff --git a/tools/libxl/libxl_linux.c b/tools/libxl/libxl_linux.c
index 1fed3cd..4e11eeb 100644
--- a/tools/libxl/libxl_linux.c
+++ b/tools/libxl/libxl_linux.c
@@ -17,7 +17,7 @@
 
 #include "libxl_internal.h"
  
-int libxl__try_phy_backend(mode_t st_mode)
+int libxl__try_phy_backend(mode_t st_mode, unsigned long f_flag)
 {
     if (!S_ISBLK(st_mode)) {
         return 0;
diff --git a/tools/libxl/libxl_netbsd.c b/tools/libxl/libxl_netbsd.c
index 9587833..aa7e0a9 100644
--- a/tools/libxl/libxl_netbsd.c
+++ b/tools/libxl/libxl_netbsd.c
@@ -17,9 +17,17 @@
 
 #include "libxl_internal.h"
 
-int libxl__try_phy_backend(mode_t st_mode)
+int libxl__try_phy_backend(mode_t st_mode, unsigned long f_flag)
 {
-    if (S_ISREG(st_mode) || S_ISBLK(st_mode))
+    if (S_ISBLK(st_mode))
+        /* File is a block device, always handled by xbdback */
+        return 1;
+
+    if (S_ISREG(st_mode) && (ST_LOCAL & f_flag))
+        /*
+         * File is a regular file, and the filesystem is local,
+         * attach using vnd(4).
+         */
         return 1;
 
     return 0;
-- 
1.7.7.5 (Apple Git-26)



Home | Main Index | Thread Index | Old Index