Commit 8f8f5620 authored by Arnd Bergmann's avatar Arnd Bergmann
Browse files

compat_ioctl: move CDROMREADADIO to cdrom.c



Again, there is only one file that needs this, so move the conversion
handler into the native implementation.

Reviewed-by: default avatarBen Hutchings <ben.hutchings@codethink.co.uk>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parent f3ee6e63
Loading
Loading
Loading
Loading
+0 −36
Original line number Diff line number Diff line
@@ -96,40 +96,6 @@ static int compat_hdio_ioctl(struct block_device *bdev, fmode_t mode,
	return error;
}

struct compat_cdrom_read_audio {
	union cdrom_addr	addr;
	u8			addr_format;
	compat_int_t		nframes;
	compat_caddr_t		buf;
};

static int compat_cdrom_read_audio(struct block_device *bdev, fmode_t mode,
		unsigned int cmd, unsigned long arg)
{
	struct cdrom_read_audio __user *cdread_audio;
	struct compat_cdrom_read_audio __user *cdread_audio32;
	__u32 data;
	void __user *datap;

	cdread_audio = compat_alloc_user_space(sizeof(*cdread_audio));
	cdread_audio32 = compat_ptr(arg);

	if (copy_in_user(&cdread_audio->addr,
			 &cdread_audio32->addr,
			 (sizeof(*cdread_audio32) -
			  sizeof(compat_caddr_t))))
		return -EFAULT;

	if (get_user(data, &cdread_audio32->buf))
		return -EFAULT;
	datap = compat_ptr(data);
	if (put_user(datap, &cdread_audio->buf))
		return -EFAULT;

	return __blkdev_driver_ioctl(bdev, mode, cmd,
			(unsigned long)cdread_audio);
}

struct compat_blkpg_ioctl_arg {
	compat_int_t op;
	compat_int_t flags;
@@ -179,8 +145,6 @@ static int compat_blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode,
	case HDIO_GET_ADDRESS:
	case HDIO_GET_BUSSTATE:
		return compat_hdio_ioctl(bdev, mode, cmd, arg);
	case CDROMREADAUDIO:
		return compat_cdrom_read_audio(bdev, mode, cmd, arg);

	/*
	 * No handler required for the ones below, we just need to
+25 −3
Original line number Diff line number Diff line
@@ -3017,9 +3017,31 @@ static noinline int mmc_ioctl_cdrom_read_audio(struct cdrom_device_info *cdi,
	struct cdrom_read_audio ra;
	int lba;

#ifdef CONFIG_COMPAT
	if (in_compat_syscall()) {
		struct compat_cdrom_read_audio {
			union cdrom_addr	addr;
			u8			addr_format;
			compat_int_t		nframes;
			compat_caddr_t		buf;
		} ra32;

		if (copy_from_user(&ra32, arg, sizeof(ra32)))
			return -EFAULT;

		ra = (struct cdrom_read_audio) {
			.addr		= ra32.addr,
			.addr_format	= ra32.addr_format,
			.nframes	= ra32.nframes,
			.buf		= compat_ptr(ra32.buf),
		};
	} else
#endif
	{
		if (copy_from_user(&ra, (struct cdrom_read_audio __user *)arg,
				   sizeof(ra)))
			return -EFAULT;
	}

	if (ra.addr_format == CDROM_MSF)
		lba = msf_to_lba(ra.addr.msf.minute,