qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH:] FreeBSD host physical cdrom fixes
@ 2009-03-23 22:46 Juergen Lock
  2009-03-28  8:40 ` Blue Swirl
  0 siblings, 1 reply; 6+ messages in thread
From: Juergen Lock @ 2009-03-23 22:46 UTC (permalink / raw)
  To: qemu-devel

This improves physical cdrom support on FreeBSD hosts to be almost as
good as on Linux, with the only notable exception that you still need to
either have the guest itself eject the disc if you want to take it
out/change it, or do a change command in the monitor after taking out
a disc in case a guest cannot eject it itself - otherwise the guest may
continue using state (like size) of the old disc.

 [Yes this is not perfect but still is way better than the old state of
things and thus commit-worthy in my opinion.  I don't think it needs
to be committed in incremental pieces, if you disagree please say so.]

Index: qemu/block-raw-posix.c
@@ -55,6 +55,7 @@
 #ifdef __FreeBSD__
 #include <signal.h>
 #include <sys/disk.h>
+#include <sys/cdio.h>
 #endif
 
 #ifdef __OpenBSD__
@@ -110,6 +111,9 @@
     int fd_got_error;
     int fd_media_changed;
 #endif
+#if defined(__FreeBSD__)
+    int cd_open_flags;
+#endif
     uint8_t* aligned_buf;
 } BDRVRawState;
 
@@ -117,6 +121,12 @@
 
 static int fd_open(BlockDriverState *bs);
 
+#if defined(__FreeBSD__)
+static int cd_open(BlockDriverState *bs);
+#endif
+
+static int raw_is_inserted(BlockDriverState *bs);
+
 static int raw_open(BlockDriverState *bs, const char *filename, int flags)
 {
     BDRVRawState *s = bs->opaque;
@@ -773,6 +783,9 @@
     int64_t size;
 #ifdef HOST_BSD
     struct stat sb;
+#ifdef __FreeBSD__
+    int reopened = 0;
+#endif
 #endif
 #ifdef __sun__
     struct dk_minfo minfo;
@@ -785,6 +798,9 @@
         return ret;
 
 #ifdef HOST_BSD
+#ifdef __FreeBSD__
+again:
+#endif
     if (!fstat(fd, &sb) && (S_IFCHR & sb.st_mode)) {
 #ifdef DIOCGMEDIASIZE
 	if (ioctl(fd, DIOCGMEDIASIZE, (off_t *)&size))
@@ -803,6 +819,19 @@
 #else
         size = lseek(fd, 0LL, SEEK_END);
 #endif
+#ifdef __FreeBSD__
+        switch(s->type) {
+        case FTYPE_CD:
+            /* XXX FreeBSD acd returns UINT_MAX sectors for an empty drive */
+            if (size == 2048LL * (unsigned)-1)
+                size = 0;
+            /* XXX no disc?  maybe we need to reopen... */
+            if (size <= 0 && !reopened && cd_open(bs) >= 0) {
+                reopened = 1;
+                goto again;
+            }
+        }
+#endif
     } else
 #endif
 #ifdef __sun__
@@ -993,6 +1022,14 @@
         bs->sg = 1;
     }
 #endif
+#if defined(__FreeBSD__)
+    if (strstart(filename, "/dev/cd", NULL) ||
+        strstart(filename, "/dev/acd", NULL)) {
+        s->type = FTYPE_CD;
+        s->cd_open_flags = open_flags;
+    }
+#endif
+    s->fd = -1;
     fd = open(filename, open_flags, 0644);
     if (fd < 0) {
         ret = -errno;
@@ -1001,6 +1038,11 @@
         return ret;
     }
     s->fd = fd;
+#if defined(__FreeBSD__)
+    /* make sure the door isnt locked at this time */
+    if (s->type == FTYPE_CD)
+        ioctl (s->fd, CDIOCALLOW);
+#endif
 #if defined(__linux__)
     /* close fd so that we can reopen it as needed */
     if (s->type == FTYPE_FD) {
@@ -1167,7 +1209,116 @@
 
     return ioctl(s->fd, req, buf);
 }
-#else
+#elif defined(__FreeBSD__)
+
+static int fd_open(BlockDriverState *bs)
+{
+    BDRVRawState *s = bs->opaque;
+
+    /* this is just to ensure s->fd is sane (its called by io ops) */
+    if (s->fd >= 0)
+        return 0;
+    return -EIO;
+}
+
+static int cd_open(BlockDriverState *bs)
+{
+#if defined(__FreeBSD__)
+    BDRVRawState *s = bs->opaque;
+    int fd;
+
+    switch(s->type) {
+    case FTYPE_CD:
+        /* XXX force reread of possibly changed/newly loaded disc,
+         * FreeBSD seems to not notice sometimes... */
+        if (s->fd >= 0)
+            close (s->fd);
+        fd = open(bs->filename, s->cd_open_flags, 0644);
+        if (fd < 0) {
+            s->fd = -1;
+            return -EIO;
+        }
+        s->fd = fd;
+        /* make sure the door isnt locked at this time */
+        ioctl (s->fd, CDIOCALLOW);
+    }
+#endif
+    return 0;
+}
+
+static int raw_is_inserted(BlockDriverState *bs)
+{
+    BDRVRawState *s = bs->opaque;
+
+    switch(s->type) {
+    case FTYPE_CD:
+        return (raw_getlength(bs) > 0);
+    case FTYPE_FD:
+        /* XXX handle this */
+        /* FALLTHRU */
+    default:
+        return 1;
+    }
+}
+
+static int raw_media_changed(BlockDriverState *bs)
+{
+    return -ENOTSUP;
+}
+
+static int raw_eject(BlockDriverState *bs, int eject_flag)
+{
+    BDRVRawState *s = bs->opaque;
+
+    switch(s->type) {
+    case FTYPE_CD:
+        if (s->fd < 0)
+            return -ENOTSUP;
+        (void) ioctl (s->fd, CDIOCALLOW);
+        if (eject_flag) {
+            if (ioctl (s->fd, CDIOCEJECT) < 0)
+                perror("CDIOCEJECT");
+        } else {
+            if (ioctl (s->fd, CDIOCCLOSE) < 0)
+                perror("CDIOCCLOSE");
+        }
+        if (cd_open(bs) < 0)
+            return -ENOTSUP;
+        break;
+    case FTYPE_FD:
+        /* XXX handle this */
+        /* FALLTHRU */
+    default:
+        return -ENOTSUP;
+    }
+    return 0;
+}
+
+static int raw_set_locked(BlockDriverState *bs, int locked)
+{
+    BDRVRawState *s = bs->opaque;
+
+    switch(s->type) {
+    case FTYPE_CD:
+        if (s->fd < 0)
+            return -ENOTSUP;
+        if (ioctl (s->fd, (locked ? CDIOCPREVENT : CDIOCALLOW)) < 0) {
+            /* Note: an error can happen if the distribution automatically
+               mounts the CD-ROM */
+            //        perror("CDROM_LOCKDOOR");
+        }
+        break;
+    default:
+        return -ENOTSUP;
+    }
+    return 0;
+}
+
+static int raw_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
+{
+    return -ENOTSUP;
+}
+#else /* !linux && !FreeBSD */
 
 static int fd_open(BlockDriverState *bs)
 {
@@ -1198,7 +1349,7 @@
 {
     return -ENOTSUP;
 }
-#endif /* !linux */
+#endif /* !linux && !FreeBSD */
 
 static int raw_sg_send_command(BlockDriverState *bs, void *buf, int count)
 {

Signed-off-by: Juergen Lock <nox@jelal.kn-bremen.de>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH:] FreeBSD host physical cdrom fixes
  2009-03-23 22:46 [Qemu-devel] [PATCH:] FreeBSD host physical cdrom fixes Juergen Lock
@ 2009-03-28  8:40 ` Blue Swirl
  2009-03-28 20:07   ` Juergen Lock
  0 siblings, 1 reply; 6+ messages in thread
From: Blue Swirl @ 2009-03-28  8:40 UTC (permalink / raw)
  To: qemu-devel

On 3/24/09, Juergen Lock <nox@jelal.kn-bremen.de> wrote:
> This improves physical cdrom support on FreeBSD hosts to be almost as
>  good as on Linux, with the only notable exception that you still need to
>  either have the guest itself eject the disc if you want to take it
>  out/change it, or do a change command in the monitor after taking out
>  a disc in case a guest cannot eject it itself - otherwise the guest may
>  continue using state (like size) of the old disc.
>
>   [Yes this is not perfect but still is way better than the old state of
>  things and thus commit-worthy in my opinion.  I don't think it needs
>  to be committed in incremental pieces, if you disagree please say so.]

Thanks, applied. OpenBSD also has cdio and the header shows NetBSD
ancestry, so maybe this works for all HOST_BSD? My OpenBSD machine
does not have a cdrom, so I can't test it.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH:] FreeBSD host physical cdrom fixes
  2009-03-28  8:40 ` Blue Swirl
@ 2009-03-28 20:07   ` Juergen Lock
  2009-03-28 20:18     ` Blue Swirl
  0 siblings, 1 reply; 6+ messages in thread
From: Juergen Lock @ 2009-03-28 20:07 UTC (permalink / raw)
  To: blauwirbel; +Cc: qemu-devel

In article <f43fc5580903280140ie068b79sd0aef2c11bfcaff8@mail.gmail.com> you write:
>On 3/24/09, Juergen Lock <nox@jelal.kn-bremen.de> wrote:
>> This improves physical cdrom support on FreeBSD hosts to be almost as
>>  good as on Linux, with the only notable exception that you still need to
>>  either have the guest itself eject the disc if you want to take it
>>  out/change it, or do a change command in the monitor after taking out
>>  a disc in case a guest cannot eject it itself - otherwise the guest may
>>  continue using state (like size) of the old disc.
>>
>>   [Yes this is not perfect but still is way better than the old state of
>>  things and thus commit-worthy in my opinion.  I don't think it needs
>>  to be committed in incremental pieces, if you disagree please say so.]
>
>Thanks, applied.

Thanx!  Is anyone looking at my scsi disk/cdrom fixes/improvements series
also?
	http://lists.gnu.org/archive/html/qemu-devel/2009-03/msg01110.html
Without it for example eject won't work on emulated scsi cdroms i.e.
you'd still have to use the monitor...

> OpenBSD also has cdio and the header shows NetBSD
>ancestry, so maybe this works for all HOST_BSD? My OpenBSD machine
>does not have a cdrom, so I can't test it.
>
 Hmm that may be possible, but I also can't test it.

	Juergen

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH:] FreeBSD host physical cdrom fixes
  2009-03-28 20:07   ` Juergen Lock
@ 2009-03-28 20:18     ` Blue Swirl
  2009-03-29 12:42       ` Juergen Lock
  0 siblings, 1 reply; 6+ messages in thread
From: Blue Swirl @ 2009-03-28 20:18 UTC (permalink / raw)
  To: Juergen Lock; +Cc: qemu-devel

On 3/28/09, Juergen Lock <nox@jelal.kn-bremen.de> wrote:
> In article <f43fc5580903280140ie068b79sd0aef2c11bfcaff8@mail.gmail.com> you write:
>  >On 3/24/09, Juergen Lock <nox@jelal.kn-bremen.de> wrote:
>  >> This improves physical cdrom support on FreeBSD hosts to be almost as
>  >>  good as on Linux, with the only notable exception that you still need to
>  >>  either have the guest itself eject the disc if you want to take it
>  >>  out/change it, or do a change command in the monitor after taking out
>  >>  a disc in case a guest cannot eject it itself - otherwise the guest may
>  >>  continue using state (like size) of the old disc.
>  >>
>  >>   [Yes this is not perfect but still is way better than the old state of
>  >>  things and thus commit-worthy in my opinion.  I don't think it needs
>  >>  to be committed in incremental pieces, if you disagree please say so.]
>  >
>  >Thanks, applied.
>
>
> Thanx!  Is anyone looking at my scsi disk/cdrom fixes/improvements series
>  also?
>         http://lists.gnu.org/archive/html/qemu-devel/2009-03/msg01110.html
>  Without it for example eject won't work on emulated scsi cdroms i.e.
>  you'd still have to use the monitor...

Yes I'm looking, but I'm not sure if the problems I see result from
other stuff or your patches.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH:] FreeBSD host physical cdrom fixes
  2009-03-28 20:18     ` Blue Swirl
@ 2009-03-29 12:42       ` Juergen Lock
  2009-03-29 15:13         ` Blue Swirl
  0 siblings, 1 reply; 6+ messages in thread
From: Juergen Lock @ 2009-03-29 12:42 UTC (permalink / raw)
  To: Blue Swirl; +Cc: qemu-devel

On Sat, Mar 28, 2009 at 10:18:04PM +0200, Blue Swirl wrote:
> On 3/28/09, Juergen Lock <nox@jelal.kn-bremen.de> wrote:
> > In article <f43fc5580903280140ie068b79sd0aef2c11bfcaff8@mail.gmail.com> you write:
> >  >On 3/24/09, Juergen Lock <nox@jelal.kn-bremen.de> wrote:
> >  >> This improves physical cdrom support on FreeBSD hosts to be almost as
> >  >>  good as on Linux, with the only notable exception that you still need to
> >  >>  either have the guest itself eject the disc if you want to take it
> >  >>  out/change it, or do a change command in the monitor after taking out
> >  >>  a disc in case a guest cannot eject it itself - otherwise the guest may
> >  >>  continue using state (like size) of the old disc.
> >  >>
> >  >>   [Yes this is not perfect but still is way better than the old state of
> >  >>  things and thus commit-worthy in my opinion.  I don't think it needs
> >  >>  to be committed in incremental pieces, if you disagree please say so.]
> >  >
> >  >Thanks, applied.
> >
> >
> > Thanx!  Is anyone looking at my scsi disk/cdrom fixes/improvements series
> >  also?
> >         http://lists.gnu.org/archive/html/qemu-devel/2009-03/msg01110.html
> >  Without it for example eject won't work on emulated scsi cdroms i.e.
> >  you'd still have to use the monitor...
> 
> Yes I'm looking, but I'm not sure if the problems I see result from
> other stuff or your patches.

Hmm what are the issues you are seeing?

 Wondering... :)
	Juergen

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH:] FreeBSD host physical cdrom fixes
  2009-03-29 12:42       ` Juergen Lock
@ 2009-03-29 15:13         ` Blue Swirl
  0 siblings, 0 replies; 6+ messages in thread
From: Blue Swirl @ 2009-03-29 15:13 UTC (permalink / raw)
  To: Juergen Lock; +Cc: qemu-devel

On 3/29/09, Juergen Lock <nox@jelal.kn-bremen.de> wrote:
> On Sat, Mar 28, 2009 at 10:18:04PM +0200, Blue Swirl wrote:
>  > On 3/28/09, Juergen Lock <nox@jelal.kn-bremen.de> wrote:
>  > > In article <f43fc5580903280140ie068b79sd0aef2c11bfcaff8@mail.gmail.com> you write:
>  > >  >On 3/24/09, Juergen Lock <nox@jelal.kn-bremen.de> wrote:
>  > >  >> This improves physical cdrom support on FreeBSD hosts to be almost as
>  > >  >>  good as on Linux, with the only notable exception that you still need to
>  > >  >>  either have the guest itself eject the disc if you want to take it
>  > >  >>  out/change it, or do a change command in the monitor after taking out
>  > >  >>  a disc in case a guest cannot eject it itself - otherwise the guest may
>  > >  >>  continue using state (like size) of the old disc.
>  > >  >>
>  > >  >>   [Yes this is not perfect but still is way better than the old state of
>  > >  >>  things and thus commit-worthy in my opinion.  I don't think it needs
>  > >  >>  to be committed in incremental pieces, if you disagree please say so.]
>  > >  >
>  > >  >Thanks, applied.
>  > >
>  > >
>  > > Thanx!  Is anyone looking at my scsi disk/cdrom fixes/improvements series
>  > >  also?
>  > >         http://lists.gnu.org/archive/html/qemu-devel/2009-03/msg01110.html
>  > >  Without it for example eject won't work on emulated scsi cdroms i.e.
>  > >  you'd still have to use the monitor...
>  >
>  > Yes I'm looking, but I'm not sure if the problems I see result from
>  > other stuff or your patches.
>
>
> Hmm what are the issues you are seeing?

Debian 4.0 r0 CD won't boot, but it happens without your patches too.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2009-03-29 15:13 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-23 22:46 [Qemu-devel] [PATCH:] FreeBSD host physical cdrom fixes Juergen Lock
2009-03-28  8:40 ` Blue Swirl
2009-03-28 20:07   ` Juergen Lock
2009-03-28 20:18     ` Blue Swirl
2009-03-29 12:42       ` Juergen Lock
2009-03-29 15:13         ` Blue Swirl

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).