Message ID | 1263234619-14522-1-git-send-email-crobinso@redhat.com |
---|---|
State | New |
Headers | show |
On Mon, Jan 11, 2010 at 01:30:18PM -0500, Cole Robinson wrote: > Current CDROM detection is hardcoded based on source file name. > Make this smarter by attempting a CDROM specific ioctl. > > This makes '-cdrom /dev/sr0' succeed with no media present. > > Signed-off-by: Cole Robinson <crobinso@redhat.com> > --- > block/raw-posix.c | 18 +++++++++++++++++- > 1 files changed, 17 insertions(+), 1 deletions(-) > > diff --git a/block/raw-posix.c b/block/raw-posix.c > index 5a6a22b..3ec58d0 100644 > --- a/block/raw-posix.c > +++ b/block/raw-posix.c > @@ -1140,9 +1140,25 @@ static int cdrom_open(BlockDriverState *bs, const char *filename, int flags) > > static int cdrom_probe_device(const char *filename) > { > + int fd, ret; > + > if (strstart(filename, "/dev/cd", NULL)) > return 100; > - return 0; > + > + fd = open(filename, O_RDONLY | O_NONBLOCK); > + if (fd < 0) { > + return 0; > + } > + > + /* Attempt to detect via a CDROM specific ioctl */ > + if (ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT) < 0 && errno == EINVAL) { > + ret = 0; > + } else { > + ret = 100; > + } > + > + close(fd); > + return ret; > } > > static int cdrom_is_inserted(BlockDriverState *bs) Does this render the remaining "/dev/cd" check unnecessary? Likewise for the similar change that you posted for floppies.
On 01/11/2010 06:13 PM, Simon Horman wrote: > On Mon, Jan 11, 2010 at 01:30:18PM -0500, Cole Robinson wrote: >> Current CDROM detection is hardcoded based on source file name. >> Make this smarter by attempting a CDROM specific ioctl. >> >> This makes '-cdrom /dev/sr0' succeed with no media present. >> >> Signed-off-by: Cole Robinson <crobinso@redhat.com> >> --- >> block/raw-posix.c | 18 +++++++++++++++++- >> 1 files changed, 17 insertions(+), 1 deletions(-) >> >> diff --git a/block/raw-posix.c b/block/raw-posix.c >> index 5a6a22b..3ec58d0 100644 >> --- a/block/raw-posix.c >> +++ b/block/raw-posix.c >> @@ -1140,9 +1140,25 @@ static int cdrom_open(BlockDriverState *bs, const char *filename, int flags) >> >> static int cdrom_probe_device(const char *filename) >> { >> + int fd, ret; >> + >> if (strstart(filename, "/dev/cd", NULL)) >> return 100; >> - return 0; >> + >> + fd = open(filename, O_RDONLY | O_NONBLOCK); >> + if (fd < 0) { >> + return 0; >> + } >> + >> + /* Attempt to detect via a CDROM specific ioctl */ >> + if (ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT) < 0 && errno == EINVAL) { >> + ret = 0; >> + } else { >> + ret = 100; >> + } >> + >> + close(fd); >> + return ret; >> } >> >> static int cdrom_is_inserted(BlockDriverState *bs) > > Does this render the remaining "/dev/cd" check unnecessary? > Likewise for the similar change that you posted for floppies. > Probably, but I figured I'd be conservative and keep the check in place to avoid possible regressions. If one of the regular devs/maintainers wants it removed I'll respin the patches. Thanks, Cole
diff --git a/block/raw-posix.c b/block/raw-posix.c index 5a6a22b..3ec58d0 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -1140,9 +1140,25 @@ static int cdrom_open(BlockDriverState *bs, const char *filename, int flags) static int cdrom_probe_device(const char *filename) { + int fd, ret; + if (strstart(filename, "/dev/cd", NULL)) return 100; - return 0; + + fd = open(filename, O_RDONLY | O_NONBLOCK); + if (fd < 0) { + return 0; + } + + /* Attempt to detect via a CDROM specific ioctl */ + if (ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT) < 0 && errno == EINVAL) { + ret = 0; + } else { + ret = 100; + } + + close(fd); + return ret; } static int cdrom_is_inserted(BlockDriverState *bs)
Current CDROM detection is hardcoded based on source file name. Make this smarter by attempting a CDROM specific ioctl. This makes '-cdrom /dev/sr0' succeed with no media present. Signed-off-by: Cole Robinson <crobinso@redhat.com> --- block/raw-posix.c | 18 +++++++++++++++++- 1 files changed, 17 insertions(+), 1 deletions(-)