* [PATCH 00/25] reduce code in fs/compat_ioctl.c
@ 2005-11-05 16:26 Arnd Bergmann
2005-11-05 16:27 ` [PATCH 11/25] framebuffer: move ioctl32 code to fbmem.c Arnd Bergmann
0 siblings, 1 reply; 3+ messages in thread
From: Arnd Bergmann @ 2005-11-05 16:26 UTC (permalink / raw)
To: linux-kernel
Cc: video4linux-list, linux-parport, zippel, rmk+serial, ext2-devel,
Kai.Makisara, netdev, linux-mtd, bluez-devel, hpa, urban,
samba-technical, Christoph Hellwig, tim, chas, osst,
linux-usb-devel, linux-scsi, linux-atm-general, reiserfs-dev,
lm-sensors, sfrench, vandrove, gadio, linux-serial, dgilbert,
osst-users, James.Bottomley, emoenke, nathans, marcel,
schwidefsky, maxk, packet-writing
On Sünnavend 05 November 2005 00:51, Christoph Hellwig wrote:
> On Sat, Nov 05, 2005 at 12:10:46AM +0100, Arnd Bergmann wrote:
> >
> > BTW, I now have a set of 25 patches that moves all handlers from
> > fs/compat_ioctl.c over to the respective drivers and subsystems,
> > but I'm not sure how to best test that.
> > I intend to at least give it a test run on my Opteron for the whatever
> > ioctls I normally use, but the rest is just guesswork. Christoph,
> > can you review those patches?
>
> I'm not sure moving everything from fs/compat_ioctl.c is a good idea.
> Everything that is just in a single driver or subsystem that has
> common ioctl code - sure. else it doesn't make a lot of sense.
Ok, here is my full set of patches, let's see which ones are
sensible and which ones we are better off without.
Getting rid of fs/compat_ioctl.c completely could at least simplify
the compat_sys_ioctl() code a bit and would also make sure that
we only build the handlers into the kernel that can be used
potentially, which reduces the binary size.
The patch set is still largely untested, except for a single
compile test, but at least some of the patches are very simple,
so maybe I can get a quick ack or nack on them.
In general, I'm just moving over the handlers to the respective
subsystem without changing the logic, so the patch should not
have any effect on the ioctl operation itself, but it also
means that the handlers still use compat_alloc_user_space
or get_fs/set_fs when it's not really necessary.
Arnd <><
drivers/block/ioctl.c | 549 +++++
drivers/block/loop.c | 76
drivers/block/paride/pcd.c | 1
drivers/block/paride/pd.c | 1
drivers/block/paride/pt.c | 1
drivers/block/pktcdvd.c | 20
drivers/bluetooth/hci_ldisc.c | 22
drivers/cdrom/Makefile | 2
drivers/cdrom/aztcd.c | 1
drivers/cdrom/cdu31a.c | 1
drivers/cdrom/cm206.c | 1
drivers/cdrom/compat.c | 163 +
drivers/cdrom/gscd.c | 1
drivers/cdrom/mcdx.c | 1
drivers/cdrom/optcd.c | 1
drivers/cdrom/sbpcd.c | 1
drivers/cdrom/sjcd.c | 1
drivers/cdrom/sonycd535.c | 2
drivers/char/Makefile | 1
drivers/char/compat_mtio.c | 81
drivers/char/ftape/zftape/zftape-init.c | 1
drivers/char/n_tty.c | 1
drivers/char/raw.c | 91
drivers/char/tty_io.c | 191 +
drivers/char/viotape.c | 1
drivers/char/vt.c | 3
drivers/char/vt_ioctl.c | 195 +
drivers/i2c/i2c-dev.c | 141 +
drivers/ide/ide-cd.c | 1
drivers/ide/ide-floppy.c | 1
drivers/ide/ide-tape.c | 1
drivers/media/radio/miropcm20-radio.c | 1
drivers/media/radio/radio-aimslab.c | 1
drivers/media/radio/radio-aztech.c | 1
drivers/media/radio/radio-cadet.c | 1
drivers/media/radio/radio-gemtek-pci.c | 1
drivers/media/radio/radio-gemtek.c | 1
drivers/media/radio/radio-maestro.c | 1
drivers/media/radio/radio-maxiradio.c | 1
drivers/media/radio/radio-rtrack2.c | 1
drivers/media/radio/radio-sf16fmi.c | 1
drivers/media/radio/radio-sf16fmr2.c | 1
drivers/media/radio/radio-terratec.c | 1
drivers/media/radio/radio-trust.c | 1
drivers/media/radio/radio-typhoon.c | 1
drivers/media/radio/radio-zoltrix.c | 1
drivers/media/video/Makefile | 2
drivers/media/video/arv.c | 1
drivers/media/video/bttv-driver.c | 1
drivers/media/video/bw-qcam.c | 1
drivers/media/video/c-qcam.c | 1
drivers/media/video/compat_ioctl.c | 318 +++
drivers/media/video/cpia.c | 1
drivers/media/video/cx88/cx88-video.c | 2
drivers/media/video/meye.c | 1
drivers/media/video/pms.c | 1
drivers/media/video/saa5249.c | 1
drivers/media/video/saa7134/saa7134-video.c | 2
drivers/media/video/stradis.c | 1
drivers/media/video/w9966.c | 1
drivers/media/video/zoran_driver.c | 1
drivers/media/video/zr36120.c | 1
drivers/mtd/mtdchar.c | 94
drivers/net/ppp_generic.c | 179 +
drivers/s390/char/tape_char.c | 1
drivers/scsi/osst.c | 2
drivers/scsi/sg.c | 154 +
drivers/scsi/sr.c | 1
drivers/scsi/st.c | 2
drivers/usb/core/devio.c | 139 +
drivers/usb/media/dsbr100.c | 1
drivers/usb/media/ov511.c | 1
drivers/usb/media/pwc/pwc-if.c | 1
drivers/usb/media/se401.c | 1
drivers/usb/media/stv680.c | 1
drivers/usb/media/usbvideo.c | 1
drivers/usb/media/vicam.c | 1
drivers/usb/media/w9968cf.c | 1
drivers/video/fbmem.c | 147 +
fs/autofs/root.c | 35
fs/autofs4/root.c | 41
fs/block_dev.c | 10
fs/cifs/cifsfs.c | 10
fs/cifs/cifsfs.h | 2
fs/cifs/ioctl.c | 29
fs/compat.c | 27
fs/compat_ioctl.c | 2918 ----------------------------
fs/ext2/dir.c | 3
fs/ext2/ext2.h | 1
fs/ext2/file.c | 6
fs/ext2/ioctl.c | 31
fs/ext3/dir.c | 3
fs/ext3/file.c | 3
fs/ext3/ioctl.c | 66
fs/fat/dir.c | 54
fs/hfsplus/dir.c | 4
fs/hfsplus/hfsplus_fs.h | 4
fs/hfsplus/inode.c | 4
fs/hfsplus/ioctl.c | 29
fs/ncpfs/dir.c | 3
fs/ncpfs/file.c | 4
fs/ncpfs/ioctl.c | 241 ++
fs/reiserfs/dir.c | 3
fs/reiserfs/file.c | 4
fs/reiserfs/ioctl.c | 36
fs/smbfs/dir.c | 4
fs/smbfs/file.c | 4
fs/smbfs/ioctl.c | 16
fs/smbfs/proto.h | 1
fs/xfs/linux-2.6/xfs_ioctl32.c | 15
include/linux/cdrom.h | 2
include/linux/compat_ioctl.h | 387 ---
include/linux/ext2_fs.h | 7
include/linux/ext3_fs.h | 1
include/linux/fs.h | 3
include/linux/ioctl32.h | 2
include/linux/mtio.h | 12
include/linux/ncp_fs.h | 1
include/linux/net.h | 2
include/linux/reiserfs_fs.h | 9
include/linux/socket.h | 4
include/linux/tty.h | 2
include/linux/tty_driver.h | 4
include/linux/tty_ldisc.h | 2
include/linux/videodev.h | 2
include/net/sock.h | 9
net/atm/common.h | 1
net/atm/ioctl.c | 167 +
net/atm/pvc.c | 3
net/atm/svc.c | 3
net/bluetooth/bnep/sock.c | 1
net/bluetooth/cmtp/sock.c | 1
net/bluetooth/hci_sock.c | 1
net/bluetooth/hidp/sock.c | 1
net/bluetooth/rfcomm/sock.c | 1
net/compat.c | 1456 +++++++++----
net/socket.c | 7
137 files changed, 4527 insertions(+), 3807 deletions(-)
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 11/25] framebuffer: move ioctl32 code to fbmem.c
2005-11-05 16:26 [PATCH 00/25] reduce code in fs/compat_ioctl.c Arnd Bergmann
@ 2005-11-05 16:27 ` Arnd Bergmann
2005-11-06 0:16 ` Antonino A. Daplas
0 siblings, 1 reply; 3+ messages in thread
From: Arnd Bergmann @ 2005-11-05 16:27 UTC (permalink / raw)
To: linux-kernel; +Cc: Christoph Hellwig, adaplas, linux-fbdev-devel, Arnd Bergmann
[-- Attachment #1: fb-ioctl.diff --]
[-- Type: text/plain, Size: 9559 bytes --]
The frame buffer layer already had some code dealing with
compat ioctls, this patch moves over the remaining code
from fs/compat_ioctl.c
CC: adaplas@pol.net
CC: linux-fbdev-devel@lists.sourceforge.net
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Index: linux-2.6.14-rc/drivers/video/fbmem.c
===================================================================
--- linux-2.6.14-rc.orig/drivers/video/fbmem.c 2005-11-05 02:38:51.000000000 +0100
+++ linux-2.6.14-rc/drivers/video/fbmem.c 2005-11-05 02:41:37.000000000 +0100
@@ -14,6 +14,7 @@
#include <linux/config.h>
#include <linux/module.h>
+#include <linux/compat.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/sched.h>
@@ -829,18 +830,154 @@
}
#ifdef CONFIG_COMPAT
+struct fb_fix_screeninfo32 {
+ char id[16];
+ compat_caddr_t smem_start;
+ u32 smem_len;
+ u32 type;
+ u32 type_aux;
+ u32 visual;
+ u16 xpanstep;
+ u16 ypanstep;
+ u16 ywrapstep;
+ u32 line_length;
+ compat_caddr_t mmio_start;
+ u32 mmio_len;
+ u32 accel;
+ u16 reserved[3];
+};
+
+struct fb_cmap32 {
+ u32 start;
+ u32 len;
+ compat_caddr_t red;
+ compat_caddr_t green;
+ compat_caddr_t blue;
+ compat_caddr_t transp;
+};
+
+static int fb_getput_cmap(struct inode *inode, struct file *file,
+ unsigned int cmd, unsigned long arg)
+{
+ struct fb_cmap_user __user *cmap;
+ struct fb_cmap32 __user *cmap32;
+ __u32 data;
+ int err;
+
+ cmap = compat_alloc_user_space(sizeof(*cmap));
+ cmap32 = compat_ptr(arg);
+
+ if (copy_in_user(&cmap->start, &cmap32->start, 2 * sizeof(__u32)))
+ return -EFAULT;
+
+ if (get_user(data, &cmap32->red) ||
+ put_user(compat_ptr(data), &cmap->red) ||
+ get_user(data, &cmap32->green) ||
+ put_user(compat_ptr(data), &cmap->green) ||
+ get_user(data, &cmap32->blue) ||
+ put_user(compat_ptr(data), &cmap->blue) ||
+ get_user(data, &cmap32->transp) ||
+ put_user(compat_ptr(data), &cmap->transp))
+ return -EFAULT;
+
+ err = fb_ioctl(inode, file, cmd, (unsigned long) cmap);
+
+ if (!err) {
+ if (copy_in_user(&cmap32->start,
+ &cmap->start,
+ 2 * sizeof(__u32)))
+ err = -EFAULT;
+ }
+ return err;
+}
+
+static int do_fscreeninfo_to_user(struct fb_fix_screeninfo *fix,
+ struct fb_fix_screeninfo32 __user *fix32)
+{
+ __u32 data;
+ int err;
+
+ err = copy_to_user(&fix32->id, &fix->id, sizeof(fix32->id));
+
+ data = (__u32) (unsigned long) fix->smem_start;
+ err |= put_user(data, &fix32->smem_start);
+
+ err |= put_user(fix->smem_len, &fix32->smem_len);
+ err |= put_user(fix->type, &fix32->type);
+ err |= put_user(fix->type_aux, &fix32->type_aux);
+ err |= put_user(fix->visual, &fix32->visual);
+ err |= put_user(fix->xpanstep, &fix32->xpanstep);
+ err |= put_user(fix->ypanstep, &fix32->ypanstep);
+ err |= put_user(fix->ywrapstep, &fix32->ywrapstep);
+ err |= put_user(fix->line_length, &fix32->line_length);
+
+ data = (__u32) (unsigned long) fix->mmio_start;
+ err |= put_user(data, &fix32->mmio_start);
+
+ err |= put_user(fix->mmio_len, &fix32->mmio_len);
+ err |= put_user(fix->accel, &fix32->accel);
+ err |= copy_to_user(fix32->reserved, fix->reserved,
+ sizeof(fix->reserved));
+
+ return err;
+}
+
+static int fb_get_fscreeninfo(struct inode *inode, struct file *file,
+ unsigned int cmd, unsigned long arg)
+{
+ mm_segment_t old_fs;
+ struct fb_fix_screeninfo fix;
+ struct fb_fix_screeninfo32 __user *fix32;
+ int err;
+
+ fix32 = compat_ptr(arg);
+
+ old_fs = get_fs();
+ set_fs(KERNEL_DS);
+ err = fb_ioctl(inode, file, cmd, (unsigned long) &fix);
+ set_fs(old_fs);
+
+ if (!err)
+ err = do_fscreeninfo_to_user(&fix, fix32);
+
+ return err;
+}
+
static long
fb_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
- int fbidx = iminor(file->f_dentry->d_inode);
+ struct inode *inode = file->f_dentry->d_inode;
+ int fbidx = iminor(inode);
struct fb_info *info = registered_fb[fbidx];
struct fb_ops *fb = info->fbops;
- long ret;
+ long ret = -ENOIOCTLCMD;
- if (fb->fb_compat_ioctl == NULL)
- return -ENOIOCTLCMD;
lock_kernel();
- ret = fb->fb_compat_ioctl(file, cmd, arg, info);
+ switch(cmd) {
+ case FBIOGET_VSCREENINFO:
+ case FBIOPUT_VSCREENINFO:
+ case FBIOPAN_DISPLAY:
+ case FBIOGET_CON2FBMAP:
+ case FBIOPUT_CON2FBMAP:
+ arg = (unsigned long) compat_ptr(arg);
+ case FBIOBLANK:
+ ret = fb_ioctl(inode, file, cmd, arg);
+ break;
+
+ case FBIOGET_FSCREENINFO:
+ ret = fb_get_fscreeninfo(inode, file, cmd, arg);
+ break;
+
+ case FBIOGETCMAP:
+ case FBIOPUTCMAP:
+ ret = fb_getput_cmap(inode, file, cmd, arg);
+ break;
+
+ default:
+ if (fb->fb_compat_ioctl)
+ ret = fb->fb_compat_ioctl(file, cmd, arg, info);
+ break;
+ }
unlock_kernel();
return ret;
}
Index: linux-2.6.14-rc/fs/compat_ioctl.c
===================================================================
--- linux-2.6.14-rc.orig/fs/compat_ioctl.c 2005-11-05 02:41:35.000000000 +0100
+++ linux-2.6.14-rc/fs/compat_ioctl.c 2005-11-05 02:41:37.000000000 +0100
@@ -157,146 +157,6 @@
return err;
}
-struct fb_fix_screeninfo32 {
- char id[16];
- compat_caddr_t smem_start;
- u32 smem_len;
- u32 type;
- u32 type_aux;
- u32 visual;
- u16 xpanstep;
- u16 ypanstep;
- u16 ywrapstep;
- u32 line_length;
- compat_caddr_t mmio_start;
- u32 mmio_len;
- u32 accel;
- u16 reserved[3];
-};
-
-struct fb_cmap32 {
- u32 start;
- u32 len;
- compat_caddr_t red;
- compat_caddr_t green;
- compat_caddr_t blue;
- compat_caddr_t transp;
-};
-
-static int fb_getput_cmap(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
- struct fb_cmap_user __user *cmap;
- struct fb_cmap32 __user *cmap32;
- __u32 data;
- int err;
-
- cmap = compat_alloc_user_space(sizeof(*cmap));
- cmap32 = compat_ptr(arg);
-
- if (copy_in_user(&cmap->start, &cmap32->start, 2 * sizeof(__u32)))
- return -EFAULT;
-
- if (get_user(data, &cmap32->red) ||
- put_user(compat_ptr(data), &cmap->red) ||
- get_user(data, &cmap32->green) ||
- put_user(compat_ptr(data), &cmap->green) ||
- get_user(data, &cmap32->blue) ||
- put_user(compat_ptr(data), &cmap->blue) ||
- get_user(data, &cmap32->transp) ||
- put_user(compat_ptr(data), &cmap->transp))
- return -EFAULT;
-
- err = sys_ioctl(fd, cmd, (unsigned long) cmap);
-
- if (!err) {
- if (copy_in_user(&cmap32->start,
- &cmap->start,
- 2 * sizeof(__u32)))
- err = -EFAULT;
- }
- return err;
-}
-
-static int do_fscreeninfo_to_user(struct fb_fix_screeninfo *fix,
- struct fb_fix_screeninfo32 __user *fix32)
-{
- __u32 data;
- int err;
-
- err = copy_to_user(&fix32->id, &fix->id, sizeof(fix32->id));
-
- data = (__u32) (unsigned long) fix->smem_start;
- err |= put_user(data, &fix32->smem_start);
-
- err |= put_user(fix->smem_len, &fix32->smem_len);
- err |= put_user(fix->type, &fix32->type);
- err |= put_user(fix->type_aux, &fix32->type_aux);
- err |= put_user(fix->visual, &fix32->visual);
- err |= put_user(fix->xpanstep, &fix32->xpanstep);
- err |= put_user(fix->ypanstep, &fix32->ypanstep);
- err |= put_user(fix->ywrapstep, &fix32->ywrapstep);
- err |= put_user(fix->line_length, &fix32->line_length);
-
- data = (__u32) (unsigned long) fix->mmio_start;
- err |= put_user(data, &fix32->mmio_start);
-
- err |= put_user(fix->mmio_len, &fix32->mmio_len);
- err |= put_user(fix->accel, &fix32->accel);
- err |= copy_to_user(fix32->reserved, fix->reserved,
- sizeof(fix->reserved));
-
- return err;
-}
-
-static int fb_get_fscreeninfo(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
- mm_segment_t old_fs;
- struct fb_fix_screeninfo fix;
- struct fb_fix_screeninfo32 __user *fix32;
- int err;
-
- fix32 = compat_ptr(arg);
-
- old_fs = get_fs();
- set_fs(KERNEL_DS);
- err = sys_ioctl(fd, cmd, (unsigned long) &fix);
- set_fs(old_fs);
-
- if (!err)
- err = do_fscreeninfo_to_user(&fix, fix32);
-
- return err;
-}
-
-static int fb_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
- int err;
-
- switch (cmd) {
- case FBIOGET_FSCREENINFO:
- err = fb_get_fscreeninfo(fd,cmd, arg);
- break;
-
- case FBIOGETCMAP:
- case FBIOPUTCMAP:
- err = fb_getput_cmap(fd, cmd, arg);
- break;
-
- default:
- do {
- static int count;
- if (++count <= 20)
- printk("%s: Unknown fb ioctl cmd fd(%d) "
- "cmd(%08x) arg(%08lx)\n",
- __FUNCTION__, fd, cmd, arg);
- } while(0);
- err = -ENOSYS;
- break;
- };
-
- return err;
-}
-
typedef struct sg_io_hdr32 {
compat_int_t interface_id; /* [i] 'S' for SCSI generic (required) */
compat_int_t dxfer_direction; /* [i] data transfer direction */
@@ -1283,9 +1143,6 @@
#endif
#ifdef DECLARES
-HANDLE_IOCTL(FBIOGET_FSCREENINFO, fb_ioctl_trans)
-HANDLE_IOCTL(FBIOGETCMAP, fb_ioctl_trans)
-HANDLE_IOCTL(FBIOPUTCMAP, fb_ioctl_trans)
HANDLE_IOCTL(SG_IO,sg_ioctl_trans)
HANDLE_IOCTL(MTIOCGET32, mt_ioctl_trans)
HANDLE_IOCTL(MTIOCPOS32, mt_ioctl_trans)
Index: linux-2.6.14-rc/include/linux/compat_ioctl.h
===================================================================
--- linux-2.6.14-rc.orig/include/linux/compat_ioctl.h 2005-11-05 02:41:33.000000000 +0100
+++ linux-2.6.14-rc/include/linux/compat_ioctl.h 2005-11-05 02:41:37.000000000 +0100
@@ -10,13 +10,6 @@
#define ULONG_IOCTL(cmd) HANDLE_IOCTL((cmd),(ioctl_trans_handler_t)sys_ioctl)
#endif
-/* Big F */
-COMPATIBLE_IOCTL(FBIOBLANK)
-COMPATIBLE_IOCTL(FBIOGET_VSCREENINFO)
-COMPATIBLE_IOCTL(FBIOPUT_VSCREENINFO)
-COMPATIBLE_IOCTL(FBIOPAN_DISPLAY)
-COMPATIBLE_IOCTL(FBIOGET_CON2FBMAP)
-COMPATIBLE_IOCTL(FBIOPUT_CON2FBMAP)
/* Little f */
COMPATIBLE_IOCTL(FIOCLEX)
COMPATIBLE_IOCTL(FIONCLEX)
--
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 11/25] framebuffer: move ioctl32 code to fbmem.c
2005-11-05 16:27 ` [PATCH 11/25] framebuffer: move ioctl32 code to fbmem.c Arnd Bergmann
@ 2005-11-06 0:16 ` Antonino A. Daplas
0 siblings, 0 replies; 3+ messages in thread
From: Antonino A. Daplas @ 2005-11-06 0:16 UTC (permalink / raw)
To: Arnd Bergmann; +Cc: linux-kernel, Christoph Hellwig, linux-fbdev-devel
Arnd Bergmann wrote:
> The frame buffer layer already had some code dealing with
> compat ioctls, this patch moves over the remaining code
> from fs/compat_ioctl.c
This is fine with me.
Tony
-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server. Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2005-11-06 0:16 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-11-05 16:26 [PATCH 00/25] reduce code in fs/compat_ioctl.c Arnd Bergmann
2005-11-05 16:27 ` [PATCH 11/25] framebuffer: move ioctl32 code to fbmem.c Arnd Bergmann
2005-11-06 0:16 ` Antonino A. Daplas
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).