aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Stezenbach <js@sig21.net>2011-06-29 16:25:17 +0200
committerKevin Wolf <kwolf@redhat.com>2011-07-05 11:23:29 +0200
commit343f85685ce3f9613c13e4d0f884698194b6a4f6 (patch)
tree4f2eb6addc2c333eec2469782c4d1a9f8e355db2
parent661a0f712b7c5b78408d85ba8b7f47ce44f395c0 (diff)
block/raw-posix: Linux compat-ioctl warning workaround
On Linux x86_64 host with 32bit userspace, running qemu or even just "qemu-img create -f qcow2 some.img 1G" causes a kernel warning: ioctl32(qemu-img:5296): Unknown cmd fd(3) cmd(00005326){t:'S';sz:0} arg(7fffffff) on some.img ioctl32(qemu-img:5296): Unknown cmd fd(3) cmd(801c0204){t:02;sz:28} arg(fff77350) on some.img ioctl 00005326 is CDROM_DRIVE_STATUS, ioctl 801c0204 is FDGETPRM. The warning appears because the Linux compat-ioctl handler for these ioctls only applies to block devices, while qemu also uses the ioctls on plain files. Work around by calling fstat() the ensure the ioctls are only used on block devices. Signed-off-by: Johannes Stezenbach <js@sig21.net> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
-rw-r--r--block/raw-posix.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/block/raw-posix.c b/block/raw-posix.c
index 4cd7d7afbb..34b64aa205 100644
--- a/block/raw-posix.c
+++ b/block/raw-posix.c
@@ -46,6 +46,8 @@
#include <sys/dkio.h>
#endif
#ifdef __linux__
+#include <sys/types.h>
+#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/param.h>
#include <linux/cdrom.h>
@@ -1188,6 +1190,7 @@ static int floppy_probe_device(const char *filename)
int fd, ret;
int prio = 0;
struct floppy_struct fdparam;
+ struct stat st;
if (strstart(filename, "/dev/fd", NULL))
prio = 50;
@@ -1196,12 +1199,17 @@ static int floppy_probe_device(const char *filename)
if (fd < 0) {
goto out;
}
+ ret = fstat(fd, &st);
+ if (ret == -1 || !S_ISBLK(st.st_mode)) {
+ goto outc;
+ }
/* Attempt to detect via a floppy specific ioctl */
ret = ioctl(fd, FDGETPRM, &fdparam);
if (ret >= 0)
prio = 100;
+outc:
close(fd);
out:
return prio;
@@ -1290,17 +1298,23 @@ static int cdrom_probe_device(const char *filename)
{
int fd, ret;
int prio = 0;
+ struct stat st;
fd = open(filename, O_RDONLY | O_NONBLOCK);
if (fd < 0) {
goto out;
}
+ ret = fstat(fd, &st);
+ if (ret == -1 || !S_ISBLK(st.st_mode)) {
+ goto outc;
+ }
/* Attempt to detect via a CDROM specific ioctl */
ret = ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT);
if (ret >= 0)
prio = 100;
+outc:
close(fd);
out:
return prio;