From: Programmingkid <programmingkidx@gmail.com>
To: Kevin Wolf <kwolf@redhat.com>
Cc: qemu-devel qemu-devel <qemu-devel@nongnu.org>,
Qemu-block <qemu-block@nongnu.org>
Subject: [Qemu-devel] [PATCH v8] block/raw-posix.c: Make physical devices usable in QEMU under Mac OS X host
Date: Wed, 25 Nov 2015 19:24:41 -0500 [thread overview]
Message-ID: <0CCF4621-0581-41FD-A207-9FE5E1EDC58D@gmail.com> (raw)
Mac OS X can be picky when it comes to allowing the user
to use physical devices in QEMU. Most mounted volumes
appear to be off limits to QEMU. If an issue is detected,
a message is displayed showing the user how to unmount a
volume.
Signed-off-by: John Arbuckle <programmingkidx@gmail.com>
---
block/raw-posix.c | 98 +++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 72 insertions(+), 26 deletions(-)
diff --git a/block/raw-posix.c b/block/raw-posix.c
index ccfec1c..d0190c1 100644
--- a/block/raw-posix.c
+++ b/block/raw-posix.c
@@ -42,9 +42,8 @@
#include <IOKit/storage/IOMediaBSDClient.h>
#include <IOKit/storage/IOMedia.h>
#include <IOKit/storage/IOCDMedia.h>
-//#include <IOKit/storage/IOCDTypes.h>
#include <CoreFoundation/CoreFoundation.h>
-#endif
+#endif /* (__APPLE__) && (__MACH__) */
#ifdef __sun__
#define _POSIX_PTHREAD_SEMANTICS 1
@@ -2033,7 +2032,36 @@ kern_return_t GetBSDPath(io_iterator_t mediaIterator, char *bsdPath,
return kernResult;
}
-#endif
+/* Sets up a real cdrom for use in QEMU */
+static bool setup_cdrom(char *bsd_path, Error **errp)
+{
+ int index, num_of_test_partitions = 2, fd;
+ char test_partition[MAXPATHLEN];
+ bool partition_found = false;
+
+ /* look for a working partition */
+ for (index = 0; index < num_of_test_partitions; index++) {
+ snprintf(test_partition, sizeof(test_partition), "%ss%d", bsd_path,
+ index);
+ fd = qemu_open(test_partition, O_RDONLY | O_BINARY | O_LARGEFILE);
+ if (fd >= 0) {
+ partition_found = true;
+ qemu_close(fd);
+ break;
+ }
+ }
+
+ /* if a working partition on the device was not found */
+ if (partition_found == false) {
+ error_setg(errp, "Error: Failed to find a working partition on "
+ "disc!\n");
+ } else {
+ DPRINTF("Using %s as optical disc\n", test_partition);
+ pstrcpy(bsd_path, MAXPATHLEN, test_partition);
+ }
+ return partition_found;
+}
+#endif /* defined(__APPLE__) && defined(__MACH__) */
static int hdev_probe_device(const char *filename)
{
@@ -2115,6 +2143,17 @@ static bool hdev_is_sg(BlockDriverState *bs)
return false;
}
+/* Prints directions on mounting and unmounting a device */
+static void printUnmountingDirections(const char *file_name)
+{
+ error_report("Error: If device %s is mounted on the desktop, unmount"
+ " it first before using it in QEMU.\n", file_name);
+ error_report("Command to unmount device: diskutil unmountDisk %s\n",
+ file_name);
+ error_report("Command to mount device: diskutil mountDisk %s\n",
+ file_name);
+}
+
static int hdev_open(BlockDriverState *bs, QDict *options, int flags,
Error **errp)
{
@@ -2123,32 +2162,32 @@ static int hdev_open(BlockDriverState *bs, QDict *options, int flags,
int ret;
#if defined(__APPLE__) && defined(__MACH__)
- const char *filename = qdict_get_str(options, "filename");
+ const char *file_name = qdict_get_str(options, "filename");
- if (strstart(filename, "/dev/cdrom", NULL)) {
- kern_return_t kernResult;
+ /* If using a real cdrom */
+ if (strcmp(file_name, "/dev/cdrom") == 0) {
+ char bsd_path[MAXPATHLEN];
io_iterator_t mediaIterator;
- char bsdPath[ MAXPATHLEN ];
- int fd;
-
- kernResult = FindEjectableCDMedia( &mediaIterator );
- kernResult = GetBSDPath(mediaIterator, bsdPath, sizeof(bsdPath),
- flags);
- if ( bsdPath[ 0 ] != '\0' ) {
- strcat(bsdPath,"s0");
- /* some CDs don't have a partition 0 */
- fd = qemu_open(bsdPath, O_RDONLY | O_BINARY | O_LARGEFILE);
- if (fd < 0) {
- bsdPath[strlen(bsdPath)-1] = '1';
- } else {
- qemu_close(fd);
- }
- filename = bsdPath;
- qdict_put(options, "filename", qstring_from_str(filename));
+ FindEjectableCDMedia(&mediaIterator);
+ GetBSDPath(mediaIterator, bsd_path, sizeof(bsd_path), flags);
+ if (mediaIterator) {
+ IOObjectRelease(mediaIterator);
+ }
+
+ /* If a real optical drive was not found */
+ if (bsd_path[0] == '\0') {
+ error_setg(errp, "Error: failed to obtain bsd path for optical"
+ " drive!\n");
+ return -1;
}
- if ( mediaIterator )
- IOObjectRelease( mediaIterator );
+ /* If finding a partition on the cdrom disc failed */
+ if (setup_cdrom(bsd_path, errp) == false) {
+ printUnmountingDirections(bsd_path);
+ return -1;
+ }
+ file_name = bsd_path;
+ qdict_put(options, "filename", qstring_from_str(file_name));
}
#endif
@@ -2159,9 +2198,16 @@ static int hdev_open(BlockDriverState *bs, QDict *options, int flags,
if (local_err) {
error_propagate(errp, local_err);
}
- return ret;
}
+#if defined(__APPLE__) && defined(__MACH__)
+ /* if a physical device experienced an error while being opened */
+ if (strncmp(file_name, "/dev/", 5) == 0 && ret != 0) {
+ printUnmountingDirections(file_name);
+ return -1;
+ }
+#endif /* defined(__APPLE__) && defined(__MACH__) */
+
/* Since this does ioctl the device must be already opened */
bs->sg = hdev_is_sg(bs);
--
1.7.5.4
next reply other threads:[~2015-11-26 0:24 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-26 0:24 Programmingkid [this message]
2015-11-26 1:03 ` [Qemu-devel] [PATCH v8] block/raw-posix.c: Make physical devices usable in QEMU under Mac OS X host Eric Blake
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0CCF4621-0581-41FD-A207-9FE5E1EDC58D@gmail.com \
--to=programmingkidx@gmail.com \
--cc=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).