2014-05-13 15:41:42 +02:00
|
|
|
From ec0d8e661b5cb97ea3e2ed5ffb86bdfb538fca00 Mon Sep 17 00:00:00 2001
|
2012-09-03 20:00:34 +02:00
|
|
|
From: Olaf Hering <olaf@aepfle.de>
|
|
|
|
Date: Mon, 3 Sep 2012 19:50:44 +0200
|
2013-11-26 11:30:37 +01:00
|
|
|
Subject: force virtio_blk in old guest kernel
|
2012-09-03 20:00:34 +02:00
|
|
|
|
|
|
|
Signed-off-by: Olaf Hering <olaf@aepfle.de>
|
|
|
|
---
|
2013-11-26 11:30:37 +01:00
|
|
|
fish/options.c | 7 +++++--
|
|
|
|
src/guestfs-internal.h | 1 +
|
|
|
|
src/handle.c | 16 ++++++++++++++++
|
|
|
|
src/inspect-fs-unix.c | 4 ++--
|
|
|
|
src/launch-direct.c | 2 ++
|
2014-03-28 15:19:16 +01:00
|
|
|
test-tool/test-tool.c | 1 +
|
|
|
|
6 files changed, 27 insertions(+), 4 deletions(-)
|
2012-09-03 20:00:34 +02:00
|
|
|
|
2013-11-26 11:30:37 +01:00
|
|
|
diff --git a/fish/options.c b/fish/options.c
|
2014-03-28 15:19:16 +01:00
|
|
|
index 80b71ec..2cef1bc 100644
|
2013-11-26 11:30:37 +01:00
|
|
|
--- a/fish/options.c
|
|
|
|
+++ b/fish/options.c
|
2014-03-28 15:19:16 +01:00
|
|
|
@@ -100,7 +100,10 @@ add_drives_handle (guestfs_h *g, struct drv *drv, char next_drive)
|
2013-09-19 20:30:37 +02:00
|
|
|
{
|
2013-08-20 20:43:14 +02:00
|
|
|
int r;
|
|
|
|
struct guestfs_add_drive_opts_argv ad_optargs;
|
|
|
|
-
|
|
|
|
+ int use_virtio_blk = 0;
|
2012-10-10 17:23:26 +02:00
|
|
|
+#ifdef GUESTFS_QEMU_NO_VIRTIO_BLK
|
2012-10-10 16:55:01 +02:00
|
|
|
+ use_virtio_blk = 1;
|
|
|
|
+#endif
|
2013-08-20 20:43:14 +02:00
|
|
|
if (next_drive > 'z') {
|
|
|
|
fprintf (stderr,
|
|
|
|
_("%s: too many drives added on the command line\n"),
|
2014-03-28 15:19:16 +01:00
|
|
|
@@ -114,7 +117,7 @@ add_drives_handle (guestfs_h *g, struct drv *drv, char next_drive)
|
2012-10-10 16:55:01 +02:00
|
|
|
free (drv->device);
|
|
|
|
drv->device = NULL;
|
|
|
|
|
|
|
|
- if (asprintf (&drv->device, "/dev/sd%c", next_drive) == -1) {
|
|
|
|
+ if (asprintf (&drv->device, "/dev/%s%c", use_virtio_blk ? "vd" : "sd", next_drive) == -1) {
|
|
|
|
perror ("asprintf");
|
|
|
|
exit (EXIT_FAILURE);
|
|
|
|
}
|
2013-11-26 11:30:37 +01:00
|
|
|
diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h
|
2014-05-13 15:41:42 +02:00
|
|
|
index 648f005..fd99253 100644
|
2013-11-26 11:30:37 +01:00
|
|
|
--- a/src/guestfs-internal.h
|
|
|
|
+++ b/src/guestfs-internal.h
|
2014-03-28 15:19:16 +01:00
|
|
|
@@ -501,6 +501,7 @@ struct guestfs_h
|
2013-11-26 11:30:37 +01:00
|
|
|
unsigned int nr_requested_credentials;
|
|
|
|
virConnectCredentialPtr requested_credentials;
|
|
|
|
#endif
|
2012-10-10 16:55:01 +02:00
|
|
|
+ int use_virtio_blk;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Per-filesystem data stored for inspect_os. */
|
2013-11-26 11:30:37 +01:00
|
|
|
diff --git a/src/handle.c b/src/handle.c
|
2014-05-13 15:41:42 +02:00
|
|
|
index 393ac1e..1806570 100644
|
2013-11-26 11:30:37 +01:00
|
|
|
--- a/src/handle.c
|
|
|
|
+++ b/src/handle.c
|
2014-05-13 15:41:42 +02:00
|
|
|
@@ -259,6 +259,22 @@ parse_environment (guestfs_h *g,
|
2014-03-28 15:19:16 +01:00
|
|
|
return -1;
|
2012-10-19 14:33:23 +02:00
|
|
|
}
|
2012-10-10 16:55:01 +02:00
|
|
|
|
2012-09-03 20:00:34 +02:00
|
|
|
+/*
|
|
|
|
+ * Currently virtio_scsi is forced if qemu in the host supports this
|
|
|
|
+ * feature. This test does however not take the capabilities of the started
|
|
|
|
+ * guest into account. As a result no disks will be found if the guest
|
|
|
|
+ * kernel is older than 3.4.
|
|
|
|
+ */
|
|
|
|
+#ifdef GUESTFS_QEMU_NO_VIRTIO_BLK
|
2012-10-10 16:55:01 +02:00
|
|
|
+ static const char env_string[] = "GUESTFS_QEMU_NO_VIRTIO_BLK";
|
|
|
|
+ str = getenv(env_string);
|
|
|
|
+ g->use_virtio_blk = str == NULL;
|
|
|
|
+ if (str)
|
|
|
|
+ debug (g, "SuSE: %s in environment, preserving virtio-scsi setting.", env_string);
|
|
|
|
+ else
|
|
|
|
+ debug (g, "SuSE: %s not in environment, preventing virtio-scsi usage in old guest kernel.", env_string);
|
2012-09-03 20:00:34 +02:00
|
|
|
+#endif
|
|
|
|
+
|
2012-10-19 14:33:23 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-11-26 11:30:37 +01:00
|
|
|
diff --git a/src/inspect-fs-unix.c b/src/inspect-fs-unix.c
|
2014-03-28 15:19:16 +01:00
|
|
|
index 17b0b5f..20af3f7 100644
|
2013-11-26 11:30:37 +01:00
|
|
|
--- a/src/inspect-fs-unix.c
|
|
|
|
+++ b/src/inspect-fs-unix.c
|
2014-03-28 15:19:16 +01:00
|
|
|
@@ -1438,7 +1438,7 @@ resolve_fstab_device_diskbyid (guestfs_h *g, const char *part,
|
2012-10-10 16:55:01 +02:00
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* Make the partition name and check it exists. */
|
|
|
|
- device = safe_asprintf (g, "/dev/sda%s", part);
|
|
|
|
+ device = safe_asprintf (g, "/dev/%sa%s", g->use_virtio_blk ? "vd" : "sd", part);
|
|
|
|
if (!is_partition (g, device)) {
|
|
|
|
free (device);
|
|
|
|
return 0;
|
2014-03-28 15:19:16 +01:00
|
|
|
@@ -1531,7 +1531,7 @@ resolve_fstab_device (guestfs_h *g, const char *spec, Hash_table *md_map)
|
2012-10-10 16:55:01 +02:00
|
|
|
if (disk_i != -1 && disk_i <= 26 &&
|
|
|
|
slice_i > 0 && slice_i <= 1 /* > 4 .. see comment above */ &&
|
|
|
|
part_i >= 0 && part_i < 26) {
|
|
|
|
- device = safe_asprintf (g, "/dev/sd%c%d", disk_i + 'a', part_i + 5);
|
|
|
|
+ device = safe_asprintf (g, "/dev/%s%c%d", g->use_virtio_blk ? "vd" : "sd", disk_i + 'a', part_i + 5);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ((part = match1 (g, spec, re_diskbyid)) != NULL) {
|
2013-11-26 11:30:37 +01:00
|
|
|
diff --git a/src/launch-direct.c b/src/launch-direct.c
|
2014-05-13 15:41:42 +02:00
|
|
|
index 2332368..67b9fd4 100644
|
2013-11-26 11:30:37 +01:00
|
|
|
--- a/src/launch-direct.c
|
|
|
|
+++ b/src/launch-direct.c
|
2014-05-13 15:41:42 +02:00
|
|
|
@@ -1183,6 +1183,8 @@ qemu_supports_virtio_scsi (guestfs_h *g, struct backend_direct_data *data)
|
2013-11-26 11:30:37 +01:00
|
|
|
data->virtio_scsi = 3;
|
2012-12-13 17:10:28 +01:00
|
|
|
}
|
2012-09-03 20:00:34 +02:00
|
|
|
}
|
2013-08-20 20:43:14 +02:00
|
|
|
+ if (g->use_virtio_blk)
|
2013-11-26 11:30:37 +01:00
|
|
|
+ data->virtio_scsi = 2;
|
2012-09-03 20:00:34 +02:00
|
|
|
|
2013-11-26 11:30:37 +01:00
|
|
|
return data->virtio_scsi == 1;
|
2012-09-03 20:00:34 +02:00
|
|
|
}
|
2014-01-23 23:34:34 +01:00
|
|
|
diff --git a/test-tool/test-tool.c b/test-tool/test-tool.c
|
2014-03-28 15:19:16 +01:00
|
|
|
index 7e8d88e..8d5ae34 100644
|
2014-01-23 23:34:34 +01:00
|
|
|
--- a/test-tool/test-tool.c
|
|
|
|
+++ b/test-tool/test-tool.c
|
2014-03-28 15:19:16 +01:00
|
|
|
@@ -187,6 +187,7 @@ main (int argc, char *argv[])
|
2014-01-23 23:34:34 +01:00
|
|
|
exit (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
guestfs_set_verbose (g, 1);
|
|
|
|
+ guestfs_set_trace (g, 1);
|
|
|
|
|
|
|
|
if (qemu)
|
|
|
|
set_qemu (g, qemu, qemu_use_wrapper);
|