2005-04-17 02:20:36 +04:00
/*
* ioctl32 . c : Conversion between 32 bit and 64 bit native ioctls .
*
* Copyright ( C ) 1997 - 2000 Jakub Jelinek ( jakub @ redhat . com )
* Copyright ( C ) 1998 Eddie C . Dost ( ecd @ skynet . be )
* Copyright ( C ) 2001 , 2002 Andi Kleen , SuSE Labs
* Copyright ( C ) 2003 Pavel Machek ( pavel @ suse . cz )
*
* These routines maintain argument size conversion between 32 bit and 64 bit
* ioctls .
*/
2008-01-06 13:15:55 +03:00
# include <linux/joystick.h>
2005-04-17 02:20:36 +04:00
# include <linux/types.h>
# include <linux/compat.h>
# include <linux/kernel.h>
2006-01-11 23:17:46 +03:00
# include <linux/capability.h>
2005-04-17 02:20:36 +04:00
# include <linux/compiler.h>
# include <linux/sched.h>
# include <linux/smp.h>
2009-07-11 22:08:37 +04:00
# include <linux/smp_lock.h>
2005-04-17 02:20:36 +04:00
# include <linux/ioctl.h>
# include <linux/if.h>
# include <linux/if_bridge.h>
# include <linux/slab.h>
2009-03-31 07:33:13 +04:00
# include <linux/raid/md_u.h>
2005-04-17 02:20:36 +04:00
# include <linux/kd.h>
# include <linux/route.h>
# include <linux/in6.h>
# include <linux/ipv6_route.h>
# include <linux/skbuff.h>
# include <linux/netlink.h>
# include <linux/vt.h>
2009-06-19 22:28:07 +04:00
# include <linux/falloc.h>
2005-04-17 02:20:36 +04:00
# include <linux/fs.h>
# include <linux/file.h>
# include <linux/ppp_defs.h>
# include <linux/if_ppp.h>
# include <linux/if_pppox.h>
# include <linux/mtio.h>
# include <linux/auto_fs.h>
# include <linux/auto_fs4.h>
# include <linux/tty.h>
# include <linux/vt_kern.h>
# include <linux/fb.h>
# include <linux/videodev.h>
# include <linux/netdevice.h>
# include <linux/raw.h>
# include <linux/smb_fs.h>
# include <linux/blkdev.h>
# include <linux/elevator.h>
# include <linux/rtc.h>
# include <linux/pci.h>
# include <linux/module.h>
# include <linux/serial.h>
# include <linux/if_tun.h>
# include <linux/ctype.h>
# include <linux/syscalls.h>
# include <linux/i2c.h>
# include <linux/i2c-dev.h>
# include <linux/atalk.h>
# include <net/bluetooth/bluetooth.h>
# include <net/bluetooth/hci.h>
# include <net/bluetooth/rfcomm.h>
# include <linux/capi.h>
2006-06-26 11:25:35 +04:00
# include <linux/gigaset_dev.h>
2005-04-17 02:20:36 +04:00
2008-07-16 17:52:00 +04:00
# ifdef CONFIG_BLOCK
2009-04-20 12:23:02 +04:00
# include <linux/loop.h>
2005-04-17 02:20:36 +04:00
# include <scsi/scsi.h>
# include <scsi/scsi_ioctl.h>
# include <scsi/sg.h>
2008-07-16 17:52:00 +04:00
# endif
2005-04-17 02:20:36 +04:00
# include <asm/uaccess.h>
# include <linux/ethtool.h>
# include <linux/mii.h>
# include <linux/if_bonding.h>
# include <linux/watchdog.h>
# include <linux/soundcard.h>
# include <linux/lp.h>
# include <linux/ppdev.h>
# include <linux/atm.h>
# include <linux/atmarp.h>
# include <linux/atmclip.h>
# include <linux/atmdev.h>
# include <linux/atmioc.h>
# include <linux/atmlec.h>
# include <linux/atmmpc.h>
# include <linux/atmsvc.h>
# include <linux/atm_tcp.h>
# include <linux/sonet.h>
# include <linux/atm_suni.h>
# include <linux/usb.h>
# include <linux/usbdevice_fs.h>
# include <linux/nbd.h>
# include <linux/random.h>
# include <linux/filter.h>
# include <linux/pktcdvd.h>
# include <linux/hiddev.h>
2005-11-16 11:52:57 +03:00
# include <linux/dvb/audio.h>
# include <linux/dvb/dmx.h>
# include <linux/dvb/frontend.h>
# include <linux/dvb/video.h>
2007-07-29 11:50:42 +04:00
# ifdef CONFIG_SPARC
# include <asm/fbio.h>
# endif
2006-01-10 07:52:14 +03:00
static int do_ioctl32_pointer ( unsigned int fd , unsigned int cmd ,
unsigned long arg , struct file * f )
{
return sys_ioctl ( fd , cmd , ( unsigned long ) compat_ptr ( arg ) ) ;
}
2005-04-17 02:20:36 +04:00
static int w_long ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
mm_segment_t old_fs = get_fs ( ) ;
int err ;
unsigned long val ;
set_fs ( KERNEL_DS ) ;
err = sys_ioctl ( fd , cmd , ( unsigned long ) & val ) ;
set_fs ( old_fs ) ;
if ( ! err & & put_user ( val , ( u32 __user * ) compat_ptr ( arg ) ) )
return - EFAULT ;
return err ;
}
static int rw_long ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
mm_segment_t old_fs = get_fs ( ) ;
u32 __user * argptr = compat_ptr ( arg ) ;
int err ;
unsigned long val ;
if ( get_user ( val , argptr ) )
return - EFAULT ;
set_fs ( KERNEL_DS ) ;
err = sys_ioctl ( fd , cmd , ( unsigned long ) & val ) ;
set_fs ( old_fs ) ;
if ( ! err & & put_user ( val , argptr ) )
return - EFAULT ;
return err ;
}
2005-11-16 11:52:57 +03:00
struct compat_video_event {
int32_t type ;
compat_time_t timestamp ;
union {
video_size_t size ;
unsigned int frame_rate ;
} u ;
} ;
static int do_video_get_event ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
struct video_event kevent ;
mm_segment_t old_fs = get_fs ( ) ;
int err ;
set_fs ( KERNEL_DS ) ;
err = sys_ioctl ( fd , cmd , ( unsigned long ) & kevent ) ;
set_fs ( old_fs ) ;
if ( ! err ) {
struct compat_video_event __user * up = compat_ptr ( arg ) ;
err = put_user ( kevent . type , & up - > type ) ;
err | = put_user ( kevent . timestamp , & up - > timestamp ) ;
err | = put_user ( kevent . u . size . w , & up - > u . size . w ) ;
err | = put_user ( kevent . u . size . h , & up - > u . size . h ) ;
err | = put_user ( kevent . u . size . aspect_ratio ,
& up - > u . size . aspect_ratio ) ;
if ( err )
err = - EFAULT ;
}
return err ;
}
struct compat_video_still_picture {
compat_uptr_t iFrame ;
int32_t size ;
} ;
static int do_video_stillpicture ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
struct compat_video_still_picture __user * up ;
struct video_still_picture __user * up_native ;
compat_uptr_t fp ;
int32_t size ;
int err ;
up = ( struct compat_video_still_picture __user * ) arg ;
err = get_user ( fp , & up - > iFrame ) ;
err | = get_user ( size , & up - > size ) ;
if ( err )
return - EFAULT ;
up_native =
compat_alloc_user_space ( sizeof ( struct video_still_picture ) ) ;
2006-12-07 07:36:36 +03:00
err = put_user ( compat_ptr ( fp ) , & up_native - > iFrame ) ;
err | = put_user ( size , & up_native - > size ) ;
if ( err )
return - EFAULT ;
2005-11-16 11:52:57 +03:00
err = sys_ioctl ( fd , cmd , ( unsigned long ) up_native ) ;
return err ;
}
struct compat_video_spu_palette {
int length ;
compat_uptr_t palette ;
} ;
static int do_video_set_spu_palette ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
struct compat_video_spu_palette __user * up ;
struct video_spu_palette __user * up_native ;
compat_uptr_t palp ;
int length , err ;
up = ( struct compat_video_spu_palette __user * ) arg ;
err = get_user ( palp , & up - > palette ) ;
err | = get_user ( length , & up - > length ) ;
up_native = compat_alloc_user_space ( sizeof ( struct video_spu_palette ) ) ;
2006-12-07 07:36:36 +03:00
err = put_user ( compat_ptr ( palp ) , & up_native - > palette ) ;
err | = put_user ( length , & up_native - > length ) ;
if ( err )
return - EFAULT ;
2005-11-16 11:52:57 +03:00
err = sys_ioctl ( fd , cmd , ( unsigned long ) up_native ) ;
return err ;
}
[PATCH] BLOCK: Make it possible to disable the block layer [try #6]
Make it possible to disable the block layer. Not all embedded devices require
it, some can make do with just JFFS2, NFS, ramfs, etc - none of which require
the block layer to be present.
This patch does the following:
(*) Introduces CONFIG_BLOCK to disable the block layer, buffering and blockdev
support.
(*) Adds dependencies on CONFIG_BLOCK to any configuration item that controls
an item that uses the block layer. This includes:
(*) Block I/O tracing.
(*) Disk partition code.
(*) All filesystems that are block based, eg: Ext3, ReiserFS, ISOFS.
(*) The SCSI layer. As far as I can tell, even SCSI chardevs use the
block layer to do scheduling. Some drivers that use SCSI facilities -
such as USB storage - end up disabled indirectly from this.
(*) Various block-based device drivers, such as IDE and the old CDROM
drivers.
(*) MTD blockdev handling and FTL.
(*) JFFS - which uses set_bdev_super(), something it could avoid doing by
taking a leaf out of JFFS2's book.
(*) Makes most of the contents of linux/blkdev.h, linux/buffer_head.h and
linux/elevator.h contingent on CONFIG_BLOCK being set. sector_div() is,
however, still used in places, and so is still available.
(*) Also made contingent are the contents of linux/mpage.h, linux/genhd.h and
parts of linux/fs.h.
(*) Makes a number of files in fs/ contingent on CONFIG_BLOCK.
(*) Makes mm/bounce.c (bounce buffering) contingent on CONFIG_BLOCK.
(*) set_page_dirty() doesn't call __set_page_dirty_buffers() if CONFIG_BLOCK
is not enabled.
(*) fs/no-block.c is created to hold out-of-line stubs and things that are
required when CONFIG_BLOCK is not set:
(*) Default blockdev file operations (to give error ENODEV on opening).
(*) Makes some /proc changes:
(*) /proc/devices does not list any blockdevs.
(*) /proc/diskstats and /proc/partitions are contingent on CONFIG_BLOCK.
(*) Makes some compat ioctl handling contingent on CONFIG_BLOCK.
(*) If CONFIG_BLOCK is not defined, makes sys_quotactl() return -ENODEV if
given command other than Q_SYNC or if a special device is specified.
(*) In init/do_mounts.c, no reference is made to the blockdev routines if
CONFIG_BLOCK is not defined. This does not prohibit NFS roots or JFFS2.
(*) The bdflush, ioprio_set and ioprio_get syscalls can now be absent (return
error ENOSYS by way of cond_syscall if so).
(*) The seclvl_bd_claim() and seclvl_bd_release() security calls do nothing if
CONFIG_BLOCK is not set, since they can't then happen.
Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2006-09-30 22:45:40 +04:00
# ifdef CONFIG_BLOCK
2005-04-17 02:20:36 +04:00
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 */
unsigned char cmd_len ; /* [i] SCSI command length ( <= 16 bytes) */
unsigned char mx_sb_len ; /* [i] max length to write to sbp */
unsigned short iovec_count ; /* [i] 0 implies no scatter gather */
compat_uint_t dxfer_len ; /* [i] byte count of data transfer */
compat_uint_t dxferp ; /* [i], [*io] points to data transfer memory
or scatter gather list */
compat_uptr_t cmdp ; /* [i], [*i] points to command to perform */
compat_uptr_t sbp ; /* [i], [*o] points to sense_buffer memory */
compat_uint_t timeout ; /* [i] MAX_UINT->no timeout (unit: millisec) */
compat_uint_t flags ; /* [i] 0 -> default, see SG_FLAG... */
compat_int_t pack_id ; /* [i->o] unused internally (normally) */
compat_uptr_t usr_ptr ; /* [i->o] unused internally */
unsigned char status ; /* [o] scsi status */
unsigned char masked_status ; /* [o] shifted, masked scsi status */
unsigned char msg_status ; /* [o] messaging level data (optional) */
unsigned char sb_len_wr ; /* [o] byte count actually written to sbp */
unsigned short host_status ; /* [o] errors from host adapter */
unsigned short driver_status ; /* [o] errors from software driver */
compat_int_t resid ; /* [o] dxfer_len - actual_transferred */
compat_uint_t duration ; /* [o] time taken by cmd (unit: millisec) */
compat_uint_t info ; /* [o] auxiliary information */
} sg_io_hdr32_t ; /* 64 bytes long (on sparc32) */
typedef struct sg_iovec32 {
compat_uint_t iov_base ;
compat_uint_t iov_len ;
} sg_iovec32_t ;
static int sg_build_iovec ( sg_io_hdr_t __user * sgio , void __user * dxferp , u16 iovec_count )
{
sg_iovec_t __user * iov = ( sg_iovec_t __user * ) ( sgio + 1 ) ;
sg_iovec32_t __user * iov32 = dxferp ;
int i ;
for ( i = 0 ; i < iovec_count ; i + + ) {
u32 base , len ;
if ( get_user ( base , & iov32 [ i ] . iov_base ) | |
get_user ( len , & iov32 [ i ] . iov_len ) | |
put_user ( compat_ptr ( base ) , & iov [ i ] . iov_base ) | |
put_user ( len , & iov [ i ] . iov_len ) )
return - EFAULT ;
}
if ( put_user ( iov , & sgio - > dxferp ) )
return - EFAULT ;
return 0 ;
}
static int sg_ioctl_trans ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
sg_io_hdr_t __user * sgio ;
sg_io_hdr32_t __user * sgio32 ;
u16 iovec_count ;
u32 data ;
void __user * dxferp ;
int err ;
sgio32 = compat_ptr ( arg ) ;
if ( get_user ( iovec_count , & sgio32 - > iovec_count ) )
return - EFAULT ;
{
void __user * top = compat_alloc_user_space ( 0 ) ;
void __user * new = compat_alloc_user_space ( sizeof ( sg_io_hdr_t ) +
( iovec_count * sizeof ( sg_iovec_t ) ) ) ;
if ( new > top )
return - EINVAL ;
sgio = new ;
}
/* Ok, now construct. */
if ( copy_in_user ( & sgio - > interface_id , & sgio32 - > interface_id ,
( 2 * sizeof ( int ) ) +
( 2 * sizeof ( unsigned char ) ) +
( 1 * sizeof ( unsigned short ) ) +
( 1 * sizeof ( unsigned int ) ) ) )
return - EFAULT ;
if ( get_user ( data , & sgio32 - > dxferp ) )
return - EFAULT ;
dxferp = compat_ptr ( data ) ;
if ( iovec_count ) {
if ( sg_build_iovec ( sgio , dxferp , iovec_count ) )
return - EFAULT ;
} else {
if ( put_user ( dxferp , & sgio - > dxferp ) )
return - EFAULT ;
}
{
unsigned char __user * cmdp ;
unsigned char __user * sbp ;
if ( get_user ( data , & sgio32 - > cmdp ) )
return - EFAULT ;
cmdp = compat_ptr ( data ) ;
if ( get_user ( data , & sgio32 - > sbp ) )
return - EFAULT ;
sbp = compat_ptr ( data ) ;
if ( put_user ( cmdp , & sgio - > cmdp ) | |
put_user ( sbp , & sgio - > sbp ) )
return - EFAULT ;
}
if ( copy_in_user ( & sgio - > timeout , & sgio32 - > timeout ,
3 * sizeof ( int ) ) )
return - EFAULT ;
if ( get_user ( data , & sgio32 - > usr_ptr ) )
return - EFAULT ;
if ( put_user ( compat_ptr ( data ) , & sgio - > usr_ptr ) )
return - EFAULT ;
err = sys_ioctl ( fd , cmd , ( unsigned long ) sgio ) ;
if ( err > = 0 ) {
void __user * datap ;
if ( copy_in_user ( & sgio32 - > pack_id , & sgio - > pack_id ,
sizeof ( int ) ) | |
get_user ( datap , & sgio - > usr_ptr ) | |
put_user ( ( u32 ) ( unsigned long ) datap ,
& sgio32 - > usr_ptr ) | |
copy_in_user ( & sgio32 - > status , & sgio - > status ,
( 4 * sizeof ( unsigned char ) ) +
( 2 * sizeof ( unsigned short ) ) +
( 3 * sizeof ( int ) ) ) )
err = - EFAULT ;
}
return err ;
}
2006-01-12 00:44:03 +03:00
struct compat_sg_req_info { /* used by SG_GET_REQUEST_TABLE ioctl() */
char req_state ;
char orphan ;
char sg_io_owned ;
char problem ;
int pack_id ;
compat_uptr_t usr_ptr ;
unsigned int duration ;
int unused ;
} ;
static int sg_grt_trans ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
int err , i ;
2006-02-01 14:33:33 +03:00
sg_req_info_t __user * r ;
struct compat_sg_req_info __user * o = ( void __user * ) arg ;
2006-01-12 00:44:03 +03:00
r = compat_alloc_user_space ( sizeof ( sg_req_info_t ) * SG_MAX_QUEUE ) ;
err = sys_ioctl ( fd , cmd , ( unsigned long ) r ) ;
if ( err < 0 )
return err ;
for ( i = 0 ; i < SG_MAX_QUEUE ; i + + ) {
void __user * ptr ;
int d ;
if ( copy_in_user ( o + i , r + i , offsetof ( sg_req_info_t , usr_ptr ) ) | |
get_user ( ptr , & r [ i ] . usr_ptr ) | |
get_user ( d , & r [ i ] . duration ) | |
put_user ( ( u32 ) ( unsigned long ) ( ptr ) , & o [ i ] . usr_ptr ) | |
put_user ( d , & o [ i ] . duration ) )
return - EFAULT ;
}
return err ;
}
[PATCH] BLOCK: Make it possible to disable the block layer [try #6]
Make it possible to disable the block layer. Not all embedded devices require
it, some can make do with just JFFS2, NFS, ramfs, etc - none of which require
the block layer to be present.
This patch does the following:
(*) Introduces CONFIG_BLOCK to disable the block layer, buffering and blockdev
support.
(*) Adds dependencies on CONFIG_BLOCK to any configuration item that controls
an item that uses the block layer. This includes:
(*) Block I/O tracing.
(*) Disk partition code.
(*) All filesystems that are block based, eg: Ext3, ReiserFS, ISOFS.
(*) The SCSI layer. As far as I can tell, even SCSI chardevs use the
block layer to do scheduling. Some drivers that use SCSI facilities -
such as USB storage - end up disabled indirectly from this.
(*) Various block-based device drivers, such as IDE and the old CDROM
drivers.
(*) MTD blockdev handling and FTL.
(*) JFFS - which uses set_bdev_super(), something it could avoid doing by
taking a leaf out of JFFS2's book.
(*) Makes most of the contents of linux/blkdev.h, linux/buffer_head.h and
linux/elevator.h contingent on CONFIG_BLOCK being set. sector_div() is,
however, still used in places, and so is still available.
(*) Also made contingent are the contents of linux/mpage.h, linux/genhd.h and
parts of linux/fs.h.
(*) Makes a number of files in fs/ contingent on CONFIG_BLOCK.
(*) Makes mm/bounce.c (bounce buffering) contingent on CONFIG_BLOCK.
(*) set_page_dirty() doesn't call __set_page_dirty_buffers() if CONFIG_BLOCK
is not enabled.
(*) fs/no-block.c is created to hold out-of-line stubs and things that are
required when CONFIG_BLOCK is not set:
(*) Default blockdev file operations (to give error ENODEV on opening).
(*) Makes some /proc changes:
(*) /proc/devices does not list any blockdevs.
(*) /proc/diskstats and /proc/partitions are contingent on CONFIG_BLOCK.
(*) Makes some compat ioctl handling contingent on CONFIG_BLOCK.
(*) If CONFIG_BLOCK is not defined, makes sys_quotactl() return -ENODEV if
given command other than Q_SYNC or if a special device is specified.
(*) In init/do_mounts.c, no reference is made to the blockdev routines if
CONFIG_BLOCK is not defined. This does not prohibit NFS roots or JFFS2.
(*) The bdflush, ioprio_set and ioprio_get syscalls can now be absent (return
error ENOSYS by way of cond_syscall if so).
(*) The seclvl_bd_claim() and seclvl_bd_release() security calls do nothing if
CONFIG_BLOCK is not set, since they can't then happen.
Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2006-09-30 22:45:40 +04:00
# endif /* CONFIG_BLOCK */
2006-01-12 00:44:03 +03:00
2005-04-17 02:20:36 +04:00
struct sock_fprog32 {
unsigned short len ;
compat_caddr_t filter ;
} ;
# define PPPIOCSPASS32 _IOW('t', 71, struct sock_fprog32)
# define PPPIOCSACTIVE32 _IOW('t', 70, struct sock_fprog32)
static int ppp_sock_fprog_ioctl_trans ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
struct sock_fprog32 __user * u_fprog32 = compat_ptr ( arg ) ;
struct sock_fprog __user * u_fprog64 = compat_alloc_user_space ( sizeof ( struct sock_fprog ) ) ;
void __user * fptr64 ;
u32 fptr32 ;
u16 flen ;
if ( get_user ( flen , & u_fprog32 - > len ) | |
get_user ( fptr32 , & u_fprog32 - > filter ) )
return - EFAULT ;
fptr64 = compat_ptr ( fptr32 ) ;
if ( put_user ( flen , & u_fprog64 - > len ) | |
put_user ( fptr64 , & u_fprog64 - > filter ) )
return - EFAULT ;
if ( cmd = = PPPIOCSPASS32 )
cmd = PPPIOCSPASS ;
else
cmd = PPPIOCSACTIVE ;
return sys_ioctl ( fd , cmd , ( unsigned long ) u_fprog64 ) ;
}
struct ppp_option_data32 {
compat_caddr_t ptr ;
u32 length ;
compat_int_t transmit ;
} ;
# define PPPIOCSCOMPRESS32 _IOW('t', 77, struct ppp_option_data32)
struct ppp_idle32 {
compat_time_t xmit_idle ;
compat_time_t recv_idle ;
} ;
# define PPPIOCGIDLE32 _IOR('t', 63, struct ppp_idle32)
static int ppp_gidle ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
struct ppp_idle __user * idle ;
struct ppp_idle32 __user * idle32 ;
__kernel_time_t xmit , recv ;
int err ;
idle = compat_alloc_user_space ( sizeof ( * idle ) ) ;
idle32 = compat_ptr ( arg ) ;
err = sys_ioctl ( fd , PPPIOCGIDLE , ( unsigned long ) idle ) ;
if ( ! err ) {
if ( get_user ( xmit , & idle - > xmit_idle ) | |
get_user ( recv , & idle - > recv_idle ) | |
put_user ( xmit , & idle32 - > xmit_idle ) | |
put_user ( recv , & idle32 - > recv_idle ) )
err = - EFAULT ;
}
return err ;
}
static int ppp_scompress ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
struct ppp_option_data __user * odata ;
struct ppp_option_data32 __user * odata32 ;
__u32 data ;
void __user * datap ;
odata = compat_alloc_user_space ( sizeof ( * odata ) ) ;
odata32 = compat_ptr ( arg ) ;
if ( get_user ( data , & odata32 - > ptr ) )
return - EFAULT ;
datap = compat_ptr ( data ) ;
if ( put_user ( datap , & odata - > ptr ) )
return - EFAULT ;
if ( copy_in_user ( & odata - > length , & odata32 - > length ,
sizeof ( __u32 ) + sizeof ( int ) ) )
return - EFAULT ;
return sys_ioctl ( fd , PPPIOCSCOMPRESS , ( unsigned long ) odata ) ;
}
static int ppp_ioctl_trans ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
int err ;
switch ( cmd ) {
case PPPIOCGIDLE32 :
err = ppp_gidle ( fd , cmd , arg ) ;
break ;
case PPPIOCSCOMPRESS32 :
err = ppp_scompress ( fd , cmd , arg ) ;
break ;
default :
do {
static int count ;
if ( + + count < = 20 )
printk ( " ppp_ioctl: Unknown cmd fd(%d) "
" cmd(%08x) arg(%08x) \n " ,
( int ) fd , ( unsigned int ) cmd , ( unsigned int ) arg ) ;
} while ( 0 ) ;
err = - EINVAL ;
break ;
} ;
return err ;
}
[PATCH] BLOCK: Make it possible to disable the block layer [try #6]
Make it possible to disable the block layer. Not all embedded devices require
it, some can make do with just JFFS2, NFS, ramfs, etc - none of which require
the block layer to be present.
This patch does the following:
(*) Introduces CONFIG_BLOCK to disable the block layer, buffering and blockdev
support.
(*) Adds dependencies on CONFIG_BLOCK to any configuration item that controls
an item that uses the block layer. This includes:
(*) Block I/O tracing.
(*) Disk partition code.
(*) All filesystems that are block based, eg: Ext3, ReiserFS, ISOFS.
(*) The SCSI layer. As far as I can tell, even SCSI chardevs use the
block layer to do scheduling. Some drivers that use SCSI facilities -
such as USB storage - end up disabled indirectly from this.
(*) Various block-based device drivers, such as IDE and the old CDROM
drivers.
(*) MTD blockdev handling and FTL.
(*) JFFS - which uses set_bdev_super(), something it could avoid doing by
taking a leaf out of JFFS2's book.
(*) Makes most of the contents of linux/blkdev.h, linux/buffer_head.h and
linux/elevator.h contingent on CONFIG_BLOCK being set. sector_div() is,
however, still used in places, and so is still available.
(*) Also made contingent are the contents of linux/mpage.h, linux/genhd.h and
parts of linux/fs.h.
(*) Makes a number of files in fs/ contingent on CONFIG_BLOCK.
(*) Makes mm/bounce.c (bounce buffering) contingent on CONFIG_BLOCK.
(*) set_page_dirty() doesn't call __set_page_dirty_buffers() if CONFIG_BLOCK
is not enabled.
(*) fs/no-block.c is created to hold out-of-line stubs and things that are
required when CONFIG_BLOCK is not set:
(*) Default blockdev file operations (to give error ENODEV on opening).
(*) Makes some /proc changes:
(*) /proc/devices does not list any blockdevs.
(*) /proc/diskstats and /proc/partitions are contingent on CONFIG_BLOCK.
(*) Makes some compat ioctl handling contingent on CONFIG_BLOCK.
(*) If CONFIG_BLOCK is not defined, makes sys_quotactl() return -ENODEV if
given command other than Q_SYNC or if a special device is specified.
(*) In init/do_mounts.c, no reference is made to the blockdev routines if
CONFIG_BLOCK is not defined. This does not prohibit NFS roots or JFFS2.
(*) The bdflush, ioprio_set and ioprio_get syscalls can now be absent (return
error ENOSYS by way of cond_syscall if so).
(*) The seclvl_bd_claim() and seclvl_bd_release() security calls do nothing if
CONFIG_BLOCK is not set, since they can't then happen.
Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2006-09-30 22:45:40 +04:00
# ifdef CONFIG_BLOCK
2005-04-17 02:20:36 +04:00
struct mtget32 {
compat_long_t mt_type ;
compat_long_t mt_resid ;
compat_long_t mt_dsreg ;
compat_long_t mt_gstat ;
compat_long_t mt_erreg ;
compat_daddr_t mt_fileno ;
compat_daddr_t mt_blkno ;
} ;
# define MTIOCGET32 _IOR('m', 2, struct mtget32)
struct mtpos32 {
compat_long_t mt_blkno ;
} ;
# define MTIOCPOS32 _IOR('m', 3, struct mtpos32)
static int mt_ioctl_trans ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
mm_segment_t old_fs = get_fs ( ) ;
struct mtget get ;
struct mtget32 __user * umget32 ;
struct mtpos pos ;
struct mtpos32 __user * upos32 ;
unsigned long kcmd ;
void * karg ;
int err = 0 ;
switch ( cmd ) {
case MTIOCPOS32 :
kcmd = MTIOCPOS ;
karg = & pos ;
break ;
case MTIOCGET32 :
kcmd = MTIOCGET ;
karg = & get ;
break ;
default :
do {
static int count ;
if ( + + count < = 20 )
printk ( " mt_ioctl: Unknown cmd fd(%d) "
" cmd(%08x) arg(%08x) \n " ,
( int ) fd , ( unsigned int ) cmd , ( unsigned int ) arg ) ;
} while ( 0 ) ;
return - EINVAL ;
}
set_fs ( KERNEL_DS ) ;
err = sys_ioctl ( fd , kcmd , ( unsigned long ) karg ) ;
set_fs ( old_fs ) ;
if ( err )
return err ;
switch ( cmd ) {
case MTIOCPOS32 :
upos32 = compat_ptr ( arg ) ;
err = __put_user ( pos . mt_blkno , & upos32 - > mt_blkno ) ;
break ;
case MTIOCGET32 :
umget32 = compat_ptr ( arg ) ;
err = __put_user ( get . mt_type , & umget32 - > mt_type ) ;
err | = __put_user ( get . mt_resid , & umget32 - > mt_resid ) ;
err | = __put_user ( get . mt_dsreg , & umget32 - > mt_dsreg ) ;
err | = __put_user ( get . mt_gstat , & umget32 - > mt_gstat ) ;
err | = __put_user ( get . mt_erreg , & umget32 - > mt_erreg ) ;
err | = __put_user ( get . mt_fileno , & umget32 - > mt_fileno ) ;
err | = __put_user ( get . mt_blkno , & umget32 - > mt_blkno ) ;
break ;
}
return err ? - EFAULT : 0 ;
}
[PATCH] BLOCK: Make it possible to disable the block layer [try #6]
Make it possible to disable the block layer. Not all embedded devices require
it, some can make do with just JFFS2, NFS, ramfs, etc - none of which require
the block layer to be present.
This patch does the following:
(*) Introduces CONFIG_BLOCK to disable the block layer, buffering and blockdev
support.
(*) Adds dependencies on CONFIG_BLOCK to any configuration item that controls
an item that uses the block layer. This includes:
(*) Block I/O tracing.
(*) Disk partition code.
(*) All filesystems that are block based, eg: Ext3, ReiserFS, ISOFS.
(*) The SCSI layer. As far as I can tell, even SCSI chardevs use the
block layer to do scheduling. Some drivers that use SCSI facilities -
such as USB storage - end up disabled indirectly from this.
(*) Various block-based device drivers, such as IDE and the old CDROM
drivers.
(*) MTD blockdev handling and FTL.
(*) JFFS - which uses set_bdev_super(), something it could avoid doing by
taking a leaf out of JFFS2's book.
(*) Makes most of the contents of linux/blkdev.h, linux/buffer_head.h and
linux/elevator.h contingent on CONFIG_BLOCK being set. sector_div() is,
however, still used in places, and so is still available.
(*) Also made contingent are the contents of linux/mpage.h, linux/genhd.h and
parts of linux/fs.h.
(*) Makes a number of files in fs/ contingent on CONFIG_BLOCK.
(*) Makes mm/bounce.c (bounce buffering) contingent on CONFIG_BLOCK.
(*) set_page_dirty() doesn't call __set_page_dirty_buffers() if CONFIG_BLOCK
is not enabled.
(*) fs/no-block.c is created to hold out-of-line stubs and things that are
required when CONFIG_BLOCK is not set:
(*) Default blockdev file operations (to give error ENODEV on opening).
(*) Makes some /proc changes:
(*) /proc/devices does not list any blockdevs.
(*) /proc/diskstats and /proc/partitions are contingent on CONFIG_BLOCK.
(*) Makes some compat ioctl handling contingent on CONFIG_BLOCK.
(*) If CONFIG_BLOCK is not defined, makes sys_quotactl() return -ENODEV if
given command other than Q_SYNC or if a special device is specified.
(*) In init/do_mounts.c, no reference is made to the blockdev routines if
CONFIG_BLOCK is not defined. This does not prohibit NFS roots or JFFS2.
(*) The bdflush, ioprio_set and ioprio_get syscalls can now be absent (return
error ENOSYS by way of cond_syscall if so).
(*) The seclvl_bd_claim() and seclvl_bd_release() security calls do nothing if
CONFIG_BLOCK is not set, since they can't then happen.
Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2006-09-30 22:45:40 +04:00
# endif /* CONFIG_BLOCK */
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_VT
static int vt_check ( struct file * file )
{
struct tty_struct * tty ;
2006-12-08 13:36:35 +03:00
struct inode * inode = file - > f_path . dentry - > d_inode ;
2007-05-26 03:39:17 +04:00
struct vc_data * vc ;
2005-04-17 02:20:36 +04:00
2008-04-30 11:53:29 +04:00
if ( file - > f_op - > unlocked_ioctl ! = tty_ioctl )
2005-04-17 02:20:36 +04:00
return - EINVAL ;
tty = ( struct tty_struct * ) file - > private_data ;
if ( tty_paranoia_check ( tty , inode , " tty_ioctl " ) )
return - EINVAL ;
2008-04-30 11:54:13 +04:00
if ( tty - > ops - > ioctl ! = vt_ioctl )
2005-04-17 02:20:36 +04:00
return - EINVAL ;
2007-05-26 03:39:17 +04:00
vc = ( struct vc_data * ) tty - > driver_data ;
if ( ! vc_cons_allocated ( vc - > vc_num ) ) /* impossible? */
return - ENOIOCTLCMD ;
2005-04-17 02:20:36 +04:00
/*
* To have permissions to do most of the vt ioctls , we either have
2007-05-26 03:39:17 +04:00
* to be the owner of the tty , or have CAP_SYS_TTY_CONFIG .
2005-04-17 02:20:36 +04:00
*/
2007-05-26 03:39:17 +04:00
if ( current - > signal - > tty = = tty | | capable ( CAP_SYS_TTY_CONFIG ) )
2005-04-17 02:20:36 +04:00
return 1 ;
return 0 ;
}
struct consolefontdesc32 {
unsigned short charcount ; /* characters in font (256 or 512) */
unsigned short charheight ; /* scan lines per character (1-32) */
compat_caddr_t chardata ; /* font data in expanded form */
} ;
static int do_fontx_ioctl ( unsigned int fd , unsigned int cmd , unsigned long arg , struct file * file )
{
struct consolefontdesc32 __user * user_cfd = compat_ptr ( arg ) ;
struct console_font_op op ;
compat_caddr_t data ;
int i , perm ;
perm = vt_check ( file ) ;
if ( perm < 0 ) return perm ;
switch ( cmd ) {
case PIO_FONTX :
if ( ! perm )
return - EPERM ;
op . op = KD_FONT_OP_SET ;
op . flags = 0 ;
op . width = 8 ;
if ( get_user ( op . height , & user_cfd - > charheight ) | |
get_user ( op . charcount , & user_cfd - > charcount ) | |
get_user ( data , & user_cfd - > chardata ) )
return - EFAULT ;
op . data = compat_ptr ( data ) ;
return con_font_op ( vc_cons [ fg_console ] . d , & op ) ;
case GIO_FONTX :
op . op = KD_FONT_OP_GET ;
op . flags = 0 ;
op . width = 8 ;
if ( get_user ( op . height , & user_cfd - > charheight ) | |
get_user ( op . charcount , & user_cfd - > charcount ) | |
get_user ( data , & user_cfd - > chardata ) )
return - EFAULT ;
if ( ! data )
return 0 ;
op . data = compat_ptr ( data ) ;
i = con_font_op ( vc_cons [ fg_console ] . d , & op ) ;
if ( i )
return i ;
if ( put_user ( op . height , & user_cfd - > charheight ) | |
put_user ( op . charcount , & user_cfd - > charcount ) | |
put_user ( ( compat_caddr_t ) ( unsigned long ) op . data ,
& user_cfd - > chardata ) )
return - EFAULT ;
return 0 ;
}
return - EINVAL ;
}
struct console_font_op32 {
compat_uint_t op ; /* operation code KD_FONT_OP_* */
compat_uint_t flags ; /* KD_FONT_FLAG_* */
compat_uint_t width , height ; /* font size */
compat_uint_t charcount ;
compat_caddr_t data ; /* font data with height fixed to 32 */
} ;
static int do_kdfontop_ioctl ( unsigned int fd , unsigned int cmd , unsigned long arg , struct file * file )
{
struct console_font_op op ;
struct console_font_op32 __user * fontop = compat_ptr ( arg ) ;
int perm = vt_check ( file ) , i ;
struct vc_data * vc ;
if ( perm < 0 ) return perm ;
if ( copy_from_user ( & op , fontop , sizeof ( struct console_font_op32 ) ) )
return - EFAULT ;
if ( ! perm & & op . op ! = KD_FONT_OP_GET )
return - EPERM ;
op . data = compat_ptr ( ( ( struct console_font_op32 * ) & op ) - > data ) ;
op . flags | = KD_FONT_FLAG_OLD ;
vc = ( ( struct tty_struct * ) file - > private_data ) - > driver_data ;
i = con_font_op ( vc , & op ) ;
if ( i )
return i ;
( ( struct console_font_op32 * ) & op ) - > data = ( unsigned long ) op . data ;
if ( copy_to_user ( fontop , & op , sizeof ( struct console_font_op32 ) ) )
return - EFAULT ;
return 0 ;
}
struct unimapdesc32 {
unsigned short entry_ct ;
compat_caddr_t entries ;
} ;
static int do_unimap_ioctl ( unsigned int fd , unsigned int cmd , unsigned long arg , struct file * file )
{
struct unimapdesc32 tmp ;
struct unimapdesc32 __user * user_ud = compat_ptr ( arg ) ;
int perm = vt_check ( file ) ;
2007-05-26 03:39:17 +04:00
struct vc_data * vc ;
if ( perm < 0 )
return perm ;
2005-04-17 02:20:36 +04:00
if ( copy_from_user ( & tmp , user_ud , sizeof tmp ) )
return - EFAULT ;
2007-05-26 03:39:17 +04:00
if ( tmp . entries )
if ( ! access_ok ( VERIFY_WRITE , compat_ptr ( tmp . entries ) ,
tmp . entry_ct * sizeof ( struct unipair ) ) )
return - EFAULT ;
vc = ( ( struct tty_struct * ) file - > private_data ) - > driver_data ;
2005-04-17 02:20:36 +04:00
switch ( cmd ) {
case PIO_UNIMAP :
2007-05-26 03:39:17 +04:00
if ( ! perm )
return - EPERM ;
return con_set_unimap ( vc , tmp . entry_ct ,
compat_ptr ( tmp . entries ) ) ;
2005-04-17 02:20:36 +04:00
case GIO_UNIMAP :
2007-05-26 03:39:17 +04:00
if ( ! perm & & fg_console ! = vc - > vc_num )
return - EPERM ;
return con_get_unimap ( vc , tmp . entry_ct , & ( user_ud - > entry_ct ) ,
compat_ptr ( tmp . entries ) ) ;
2005-04-17 02:20:36 +04:00
}
return 0 ;
}
# endif /* CONFIG_VT */
static int do_smb_getmountuid ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
mm_segment_t old_fs = get_fs ( ) ;
__kernel_uid_t kuid ;
int err ;
cmd = SMB_IOC_GETMOUNTUID ;
set_fs ( KERNEL_DS ) ;
err = sys_ioctl ( fd , cmd , ( unsigned long ) & kuid ) ;
set_fs ( old_fs ) ;
if ( err > = 0 )
err = put_user ( kuid , ( compat_uid_t __user * ) compat_ptr ( arg ) ) ;
return err ;
}
2008-01-25 00:16:20 +03:00
static __used int
2005-04-17 02:20:36 +04:00
ret_einval ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
return - EINVAL ;
}
static int ioc_settimeout ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
return rw_long ( fd , AUTOFS_IOC_SETTIMEOUT , arg ) ;
}
/* Bluetooth ioctls */
# define HCIUARTSETPROTO _IOW('U', 200, int)
# define HCIUARTGETPROTO _IOR('U', 201, int)
# define BNEPCONNADD _IOW('B', 200, int)
# define BNEPCONNDEL _IOW('B', 201, int)
# define BNEPGETCONNLIST _IOR('B', 210, int)
# define BNEPGETCONNINFO _IOR('B', 211, int)
# define CMTPCONNADD _IOW('C', 200, int)
# define CMTPCONNDEL _IOW('C', 201, int)
# define CMTPGETCONNLIST _IOR('C', 210, int)
# define CMTPGETCONNINFO _IOR('C', 211, int)
# define HIDPCONNADD _IOW('H', 200, int)
# define HIDPCONNDEL _IOW('H', 201, int)
# define HIDPGETCONNLIST _IOR('H', 210, int)
# define HIDPGETCONNINFO _IOR('H', 211, int)
[PATCH] BLOCK: Make it possible to disable the block layer [try #6]
Make it possible to disable the block layer. Not all embedded devices require
it, some can make do with just JFFS2, NFS, ramfs, etc - none of which require
the block layer to be present.
This patch does the following:
(*) Introduces CONFIG_BLOCK to disable the block layer, buffering and blockdev
support.
(*) Adds dependencies on CONFIG_BLOCK to any configuration item that controls
an item that uses the block layer. This includes:
(*) Block I/O tracing.
(*) Disk partition code.
(*) All filesystems that are block based, eg: Ext3, ReiserFS, ISOFS.
(*) The SCSI layer. As far as I can tell, even SCSI chardevs use the
block layer to do scheduling. Some drivers that use SCSI facilities -
such as USB storage - end up disabled indirectly from this.
(*) Various block-based device drivers, such as IDE and the old CDROM
drivers.
(*) MTD blockdev handling and FTL.
(*) JFFS - which uses set_bdev_super(), something it could avoid doing by
taking a leaf out of JFFS2's book.
(*) Makes most of the contents of linux/blkdev.h, linux/buffer_head.h and
linux/elevator.h contingent on CONFIG_BLOCK being set. sector_div() is,
however, still used in places, and so is still available.
(*) Also made contingent are the contents of linux/mpage.h, linux/genhd.h and
parts of linux/fs.h.
(*) Makes a number of files in fs/ contingent on CONFIG_BLOCK.
(*) Makes mm/bounce.c (bounce buffering) contingent on CONFIG_BLOCK.
(*) set_page_dirty() doesn't call __set_page_dirty_buffers() if CONFIG_BLOCK
is not enabled.
(*) fs/no-block.c is created to hold out-of-line stubs and things that are
required when CONFIG_BLOCK is not set:
(*) Default blockdev file operations (to give error ENODEV on opening).
(*) Makes some /proc changes:
(*) /proc/devices does not list any blockdevs.
(*) /proc/diskstats and /proc/partitions are contingent on CONFIG_BLOCK.
(*) Makes some compat ioctl handling contingent on CONFIG_BLOCK.
(*) If CONFIG_BLOCK is not defined, makes sys_quotactl() return -ENODEV if
given command other than Q_SYNC or if a special device is specified.
(*) In init/do_mounts.c, no reference is made to the blockdev routines if
CONFIG_BLOCK is not defined. This does not prohibit NFS roots or JFFS2.
(*) The bdflush, ioprio_set and ioprio_get syscalls can now be absent (return
error ENOSYS by way of cond_syscall if so).
(*) The seclvl_bd_claim() and seclvl_bd_release() security calls do nothing if
CONFIG_BLOCK is not set, since they can't then happen.
Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2006-09-30 22:45:40 +04:00
# ifdef CONFIG_BLOCK
2005-04-17 02:20:36 +04:00
struct raw32_config_request
{
compat_int_t raw_minor ;
__u64 block_major ;
__u64 block_minor ;
} __attribute__ ( ( packed ) ) ;
static int get_raw32_request ( struct raw_config_request * req , struct raw32_config_request __user * user_req )
{
int ret ;
if ( ! access_ok ( VERIFY_READ , user_req , sizeof ( struct raw32_config_request ) ) )
return - EFAULT ;
ret = __get_user ( req - > raw_minor , & user_req - > raw_minor ) ;
ret | = __get_user ( req - > block_major , & user_req - > block_major ) ;
ret | = __get_user ( req - > block_minor , & user_req - > block_minor ) ;
return ret ? - EFAULT : 0 ;
}
static int set_raw32_request ( struct raw_config_request * req , struct raw32_config_request __user * user_req )
{
int ret ;
if ( ! access_ok ( VERIFY_WRITE , user_req , sizeof ( struct raw32_config_request ) ) )
return - EFAULT ;
ret = __put_user ( req - > raw_minor , & user_req - > raw_minor ) ;
ret | = __put_user ( req - > block_major , & user_req - > block_major ) ;
ret | = __put_user ( req - > block_minor , & user_req - > block_minor ) ;
return ret ? - EFAULT : 0 ;
}
static int raw_ioctl ( unsigned fd , unsigned cmd , unsigned long arg )
{
int ret ;
switch ( cmd ) {
case RAW_SETBIND :
case RAW_GETBIND : {
struct raw_config_request req ;
struct raw32_config_request __user * user_req = compat_ptr ( arg ) ;
mm_segment_t oldfs = get_fs ( ) ;
if ( ( ret = get_raw32_request ( & req , user_req ) ) )
return ret ;
set_fs ( KERNEL_DS ) ;
ret = sys_ioctl ( fd , cmd , ( unsigned long ) & req ) ;
set_fs ( oldfs ) ;
if ( ( ! ret ) & & ( cmd = = RAW_GETBIND ) ) {
ret = set_raw32_request ( & req , user_req ) ;
}
break ;
}
default :
ret = sys_ioctl ( fd , cmd , arg ) ;
break ;
}
return ret ;
}
[PATCH] BLOCK: Make it possible to disable the block layer [try #6]
Make it possible to disable the block layer. Not all embedded devices require
it, some can make do with just JFFS2, NFS, ramfs, etc - none of which require
the block layer to be present.
This patch does the following:
(*) Introduces CONFIG_BLOCK to disable the block layer, buffering and blockdev
support.
(*) Adds dependencies on CONFIG_BLOCK to any configuration item that controls
an item that uses the block layer. This includes:
(*) Block I/O tracing.
(*) Disk partition code.
(*) All filesystems that are block based, eg: Ext3, ReiserFS, ISOFS.
(*) The SCSI layer. As far as I can tell, even SCSI chardevs use the
block layer to do scheduling. Some drivers that use SCSI facilities -
such as USB storage - end up disabled indirectly from this.
(*) Various block-based device drivers, such as IDE and the old CDROM
drivers.
(*) MTD blockdev handling and FTL.
(*) JFFS - which uses set_bdev_super(), something it could avoid doing by
taking a leaf out of JFFS2's book.
(*) Makes most of the contents of linux/blkdev.h, linux/buffer_head.h and
linux/elevator.h contingent on CONFIG_BLOCK being set. sector_div() is,
however, still used in places, and so is still available.
(*) Also made contingent are the contents of linux/mpage.h, linux/genhd.h and
parts of linux/fs.h.
(*) Makes a number of files in fs/ contingent on CONFIG_BLOCK.
(*) Makes mm/bounce.c (bounce buffering) contingent on CONFIG_BLOCK.
(*) set_page_dirty() doesn't call __set_page_dirty_buffers() if CONFIG_BLOCK
is not enabled.
(*) fs/no-block.c is created to hold out-of-line stubs and things that are
required when CONFIG_BLOCK is not set:
(*) Default blockdev file operations (to give error ENODEV on opening).
(*) Makes some /proc changes:
(*) /proc/devices does not list any blockdevs.
(*) /proc/diskstats and /proc/partitions are contingent on CONFIG_BLOCK.
(*) Makes some compat ioctl handling contingent on CONFIG_BLOCK.
(*) If CONFIG_BLOCK is not defined, makes sys_quotactl() return -ENODEV if
given command other than Q_SYNC or if a special device is specified.
(*) In init/do_mounts.c, no reference is made to the blockdev routines if
CONFIG_BLOCK is not defined. This does not prohibit NFS roots or JFFS2.
(*) The bdflush, ioprio_set and ioprio_get syscalls can now be absent (return
error ENOSYS by way of cond_syscall if so).
(*) The seclvl_bd_claim() and seclvl_bd_release() security calls do nothing if
CONFIG_BLOCK is not set, since they can't then happen.
Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2006-09-30 22:45:40 +04:00
# endif /* CONFIG_BLOCK */
2005-04-17 02:20:36 +04:00
struct serial_struct32 {
compat_int_t type ;
compat_int_t line ;
compat_uint_t port ;
compat_int_t irq ;
compat_int_t flags ;
compat_int_t xmit_fifo_size ;
compat_int_t custom_divisor ;
compat_int_t baud_base ;
unsigned short close_delay ;
char io_type ;
char reserved_char [ 1 ] ;
compat_int_t hub6 ;
unsigned short closing_wait ; /* time to wait before closing */
unsigned short closing_wait2 ; /* no longer used... */
compat_uint_t iomem_base ;
unsigned short iomem_reg_shift ;
unsigned int port_high ;
/* compat_ulong_t iomap_base FIXME */
compat_int_t reserved [ 1 ] ;
} ;
static int serial_struct_ioctl ( unsigned fd , unsigned cmd , unsigned long arg )
{
typedef struct serial_struct SS ;
typedef struct serial_struct32 SS32 ;
struct serial_struct32 __user * ss32 = compat_ptr ( arg ) ;
int err ;
struct serial_struct ss ;
mm_segment_t oldseg = get_fs ( ) ;
__u32 udata ;
2006-12-07 07:36:36 +03:00
unsigned int base ;
2005-04-17 02:20:36 +04:00
if ( cmd = = TIOCSSERIAL ) {
if ( ! access_ok ( VERIFY_READ , ss32 , sizeof ( SS32 ) ) )
return - EFAULT ;
if ( __copy_from_user ( & ss , ss32 , offsetof ( SS32 , iomem_base ) ) )
return - EFAULT ;
2006-12-07 07:36:36 +03:00
if ( __get_user ( udata , & ss32 - > iomem_base ) )
return - EFAULT ;
2005-04-17 02:20:36 +04:00
ss . iomem_base = compat_ptr ( udata ) ;
2006-12-07 07:36:36 +03:00
if ( __get_user ( ss . iomem_reg_shift , & ss32 - > iomem_reg_shift ) | |
__get_user ( ss . port_high , & ss32 - > port_high ) )
return - EFAULT ;
2005-04-17 02:20:36 +04:00
ss . iomap_base = 0UL ;
}
set_fs ( KERNEL_DS ) ;
err = sys_ioctl ( fd , cmd , ( unsigned long ) ( & ss ) ) ;
set_fs ( oldseg ) ;
if ( cmd = = TIOCGSERIAL & & err > = 0 ) {
if ( ! access_ok ( VERIFY_WRITE , ss32 , sizeof ( SS32 ) ) )
return - EFAULT ;
if ( __copy_to_user ( ss32 , & ss , offsetof ( SS32 , iomem_base ) ) )
return - EFAULT ;
2006-12-07 07:36:36 +03:00
base = ( unsigned long ) ss . iomem_base > > 32 ?
0xffffffff : ( unsigned ) ( unsigned long ) ss . iomem_base ;
if ( __put_user ( base , & ss32 - > iomem_base ) | |
__put_user ( ss . iomem_reg_shift , & ss32 - > iomem_reg_shift ) | |
__put_user ( ss . port_high , & ss32 - > port_high ) )
return - EFAULT ;
2005-04-17 02:20:36 +04:00
}
return err ;
}
struct usbdevfs_ctrltransfer32 {
u8 bRequestType ;
u8 bRequest ;
u16 wValue ;
u16 wIndex ;
u16 wLength ;
u32 timeout ; /* in milliseconds */
compat_caddr_t data ;
} ;
# define USBDEVFS_CONTROL32 _IOWR('U', 0, struct usbdevfs_ctrltransfer32)
static int do_usbdevfs_control ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
struct usbdevfs_ctrltransfer32 __user * p32 = compat_ptr ( arg ) ;
struct usbdevfs_ctrltransfer __user * p ;
__u32 udata ;
p = compat_alloc_user_space ( sizeof ( * p ) ) ;
if ( copy_in_user ( p , p32 , ( sizeof ( * p32 ) - sizeof ( compat_caddr_t ) ) ) | |
get_user ( udata , & p32 - > data ) | |
put_user ( compat_ptr ( udata ) , & p - > data ) )
return - EFAULT ;
return sys_ioctl ( fd , USBDEVFS_CONTROL , ( unsigned long ) p ) ;
}
struct usbdevfs_bulktransfer32 {
compat_uint_t ep ;
compat_uint_t len ;
compat_uint_t timeout ; /* in milliseconds */
compat_caddr_t data ;
} ;
# define USBDEVFS_BULK32 _IOWR('U', 2, struct usbdevfs_bulktransfer32)
static int do_usbdevfs_bulk ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
struct usbdevfs_bulktransfer32 __user * p32 = compat_ptr ( arg ) ;
struct usbdevfs_bulktransfer __user * p ;
compat_uint_t n ;
compat_caddr_t addr ;
p = compat_alloc_user_space ( sizeof ( * p ) ) ;
if ( get_user ( n , & p32 - > ep ) | | put_user ( n , & p - > ep ) | |
get_user ( n , & p32 - > len ) | | put_user ( n , & p - > len ) | |
get_user ( n , & p32 - > timeout ) | | put_user ( n , & p - > timeout ) | |
get_user ( addr , & p32 - > data ) | | put_user ( compat_ptr ( addr ) , & p - > data ) )
return - EFAULT ;
return sys_ioctl ( fd , USBDEVFS_BULK , ( unsigned long ) p ) ;
}
/*
* USBDEVFS_SUBMITURB , USBDEVFS_REAPURB and USBDEVFS_REAPURBNDELAY
* are handled in usbdevfs core . - Christopher Li
*/
struct usbdevfs_disconnectsignal32 {
compat_int_t signr ;
compat_caddr_t context ;
} ;
# define USBDEVFS_DISCSIGNAL32 _IOR('U', 14, struct usbdevfs_disconnectsignal32)
static int do_usbdevfs_discsignal ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
struct usbdevfs_disconnectsignal kdis ;
struct usbdevfs_disconnectsignal32 __user * udis ;
mm_segment_t old_fs ;
u32 uctx ;
int err ;
udis = compat_ptr ( arg ) ;
if ( get_user ( kdis . signr , & udis - > signr ) | |
__get_user ( uctx , & udis - > context ) )
return - EFAULT ;
kdis . context = compat_ptr ( uctx ) ;
old_fs = get_fs ( ) ;
set_fs ( KERNEL_DS ) ;
err = sys_ioctl ( fd , USBDEVFS_DISCSIGNAL , ( unsigned long ) & kdis ) ;
set_fs ( old_fs ) ;
return err ;
}
/*
* I2C layer ioctls
*/
struct i2c_msg32 {
u16 addr ;
u16 flags ;
u16 len ;
compat_caddr_t buf ;
} ;
struct i2c_rdwr_ioctl_data32 {
compat_caddr_t msgs ; /* struct i2c_msg __user *msgs */
u32 nmsgs ;
} ;
struct i2c_smbus_ioctl_data32 {
u8 read_write ;
u8 command ;
u32 size ;
compat_caddr_t data ; /* union i2c_smbus_data *data */
} ;
struct i2c_rdwr_aligned {
struct i2c_rdwr_ioctl_data cmd ;
struct i2c_msg msgs [ 0 ] ;
} ;
static int do_i2c_rdwr_ioctl ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
struct i2c_rdwr_ioctl_data32 __user * udata = compat_ptr ( arg ) ;
struct i2c_rdwr_aligned __user * tdata ;
struct i2c_msg __user * tmsgs ;
struct i2c_msg32 __user * umsgs ;
compat_caddr_t datap ;
int nmsgs , i ;
if ( get_user ( nmsgs , & udata - > nmsgs ) )
return - EFAULT ;
if ( nmsgs > I2C_RDRW_IOCTL_MAX_MSGS )
return - EINVAL ;
if ( get_user ( datap , & udata - > msgs ) )
return - EFAULT ;
umsgs = compat_ptr ( datap ) ;
tdata = compat_alloc_user_space ( sizeof ( * tdata ) +
nmsgs * sizeof ( struct i2c_msg ) ) ;
tmsgs = & tdata - > msgs [ 0 ] ;
if ( put_user ( nmsgs , & tdata - > cmd . nmsgs ) | |
put_user ( tmsgs , & tdata - > cmd . msgs ) )
return - EFAULT ;
for ( i = 0 ; i < nmsgs ; i + + ) {
if ( copy_in_user ( & tmsgs [ i ] . addr , & umsgs [ i ] . addr , 3 * sizeof ( u16 ) ) )
return - EFAULT ;
if ( get_user ( datap , & umsgs [ i ] . buf ) | |
put_user ( compat_ptr ( datap ) , & tmsgs [ i ] . buf ) )
return - EFAULT ;
}
return sys_ioctl ( fd , cmd , ( unsigned long ) tdata ) ;
}
static int do_i2c_smbus_ioctl ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
struct i2c_smbus_ioctl_data __user * tdata ;
struct i2c_smbus_ioctl_data32 __user * udata ;
compat_caddr_t datap ;
tdata = compat_alloc_user_space ( sizeof ( * tdata ) ) ;
if ( tdata = = NULL )
return - ENOMEM ;
if ( ! access_ok ( VERIFY_WRITE , tdata , sizeof ( * tdata ) ) )
return - EFAULT ;
udata = compat_ptr ( arg ) ;
if ( ! access_ok ( VERIFY_READ , udata , sizeof ( * udata ) ) )
return - EFAULT ;
if ( __copy_in_user ( & tdata - > read_write , & udata - > read_write , 2 * sizeof ( u8 ) ) )
return - EFAULT ;
if ( __copy_in_user ( & tdata - > size , & udata - > size , 2 * sizeof ( u32 ) ) )
return - EFAULT ;
if ( __get_user ( datap , & udata - > data ) | |
__put_user ( compat_ptr ( datap ) , & tdata - > data ) )
return - EFAULT ;
return sys_ioctl ( fd , cmd , ( unsigned long ) tdata ) ;
}
2006-01-10 07:52:11 +03:00
# define RTC_IRQP_READ32 _IOR('p', 0x0b, compat_ulong_t)
# define RTC_IRQP_SET32 _IOW('p', 0x0c, compat_ulong_t)
# define RTC_EPOCH_READ32 _IOR('p', 0x0d, compat_ulong_t)
# define RTC_EPOCH_SET32 _IOW('p', 0x0e, compat_ulong_t)
static int rtc_ioctl ( unsigned fd , unsigned cmd , unsigned long arg )
{
mm_segment_t oldfs = get_fs ( ) ;
compat_ulong_t val32 ;
unsigned long kval ;
int ret ;
switch ( cmd ) {
case RTC_IRQP_READ32 :
case RTC_EPOCH_READ32 :
set_fs ( KERNEL_DS ) ;
ret = sys_ioctl ( fd , ( cmd = = RTC_IRQP_READ32 ) ?
RTC_IRQP_READ : RTC_EPOCH_READ ,
( unsigned long ) & kval ) ;
set_fs ( oldfs ) ;
if ( ret )
return ret ;
val32 = kval ;
return put_user ( val32 , ( unsigned int __user * ) arg ) ;
case RTC_IRQP_SET32 :
2006-02-26 06:18:55 +03:00
return sys_ioctl ( fd , RTC_IRQP_SET , arg ) ;
2006-01-10 07:52:11 +03:00
case RTC_EPOCH_SET32 :
2006-02-26 06:18:55 +03:00
return sys_ioctl ( fd , RTC_EPOCH_SET , arg ) ;
2006-01-10 07:52:11 +03:00
default :
/* unreached */
return - ENOIOCTLCMD ;
}
}
2006-01-12 12:05:26 +03:00
static int
lp_timeout_trans ( unsigned int fd , unsigned int cmd , unsigned long arg )
{
2006-02-01 14:33:33 +03:00
struct compat_timeval __user * tc = ( struct compat_timeval __user * ) arg ;
struct timeval __user * tn = compat_alloc_user_space ( sizeof ( struct timeval ) ) ;
2006-01-12 12:05:26 +03:00
struct timeval ts ;
if ( get_user ( ts . tv_sec , & tc - > tv_sec ) | |
get_user ( ts . tv_usec , & tc - > tv_usec ) | |
put_user ( ts . tv_sec , & tn - > tv_sec ) | |
put_user ( ts . tv_usec , & tn - > tv_usec ) )
return - EFAULT ;
return sys_ioctl ( fd , cmd , ( unsigned long ) tn ) ;
}
2009-06-19 22:28:07 +04:00
/* on ia32 l_start is on a 32-bit boundary */
# if defined(CONFIG_IA64) || defined(CONFIG_X86_64)
struct space_resv_32 {
__s16 l_type ;
__s16 l_whence ;
__s64 l_start __attribute__ ( ( packed ) ) ;
/* len == 0 means until end of file */
__s64 l_len __attribute__ ( ( packed ) ) ;
__s32 l_sysid ;
__u32 l_pid ;
__s32 l_pad [ 4 ] ; /* reserve area */
} ;
# define FS_IOC_RESVSP_32 _IOW ('X', 40, struct space_resv_32)
# define FS_IOC_RESVSP64_32 _IOW ('X', 42, struct space_resv_32)
/* just account for different alignment */
static int compat_ioctl_preallocate ( struct file * file , unsigned long arg )
{
2009-11-12 01:26:34 +03:00
struct space_resv_32 __user * p32 = compat_ptr ( arg ) ;
2009-06-19 22:28:07 +04:00
struct space_resv __user * p = compat_alloc_user_space ( sizeof ( * p ) ) ;
if ( copy_in_user ( & p - > l_type , & p32 - > l_type , sizeof ( s16 ) ) | |
copy_in_user ( & p - > l_whence , & p32 - > l_whence , sizeof ( s16 ) ) | |
copy_in_user ( & p - > l_start , & p32 - > l_start , sizeof ( s64 ) ) | |
copy_in_user ( & p - > l_len , & p32 - > l_len , sizeof ( s64 ) ) | |
copy_in_user ( & p - > l_sysid , & p32 - > l_sysid , sizeof ( s32 ) ) | |
copy_in_user ( & p - > l_pid , & p32 - > l_pid , sizeof ( u32 ) ) | |
copy_in_user ( & p - > l_pad , & p32 - > l_pad , 4 * sizeof ( u32 ) ) )
return - EFAULT ;
return ioctl_preallocate ( file , p ) ;
}
# endif
2007-05-08 11:29:21 +04:00
typedef int ( * ioctl_trans_handler_t ) ( unsigned int , unsigned int ,
unsigned long , struct file * ) ;
struct ioctl_trans {
unsigned long cmd ;
ioctl_trans_handler_t handler ;
struct ioctl_trans * next ;
} ;
2006-01-10 07:52:14 +03:00
# define HANDLE_IOCTL(cmd,handler) \
{ ( cmd ) , ( ioctl_trans_handler_t ) ( handler ) } ,
/* pointer to compatible structure or no argument */
# define COMPATIBLE_IOCTL(cmd) \
{ ( cmd ) , do_ioctl32_pointer } ,
/* argument is an unsigned long integer, not a pointer */
# define ULONG_IOCTL(cmd) \
{ ( cmd ) , ( ioctl_trans_handler_t ) sys_ioctl } ,
2005-04-17 02:20:36 +04:00
2007-05-02 21:27:20 +04:00
/* ioctl should not be warned about even if it's not implemented.
Valid reasons to use this :
- It is implemented with - > compat_ioctl on some device , but programs
call it on others too .
- The ioctl is not implemented in the native kernel , but programs
call it commonly anyways .
Most other reasons are not valid . */
# define IGNORE_IOCTL(cmd) COMPATIBLE_IOCTL(cmd)
2006-01-10 07:52:14 +03:00
2007-05-08 11:29:21 +04:00
static struct ioctl_trans ioctl_start [ ] = {
2007-05-08 11:29:07 +04:00
/* compatible ioctls first */
COMPATIBLE_IOCTL ( 0x4B50 ) /* KDGHWCLK - not in the kernel, but don't complain */
COMPATIBLE_IOCTL ( 0x4B51 ) /* KDSHWCLK - not in the kernel, but don't complain */
/* Big T */
COMPATIBLE_IOCTL ( TCGETA )
COMPATIBLE_IOCTL ( TCSETA )
COMPATIBLE_IOCTL ( TCSETAW )
COMPATIBLE_IOCTL ( TCSETAF )
COMPATIBLE_IOCTL ( TCSBRK )
ULONG_IOCTL ( TCSBRKP )
COMPATIBLE_IOCTL ( TCXONC )
COMPATIBLE_IOCTL ( TCFLSH )
COMPATIBLE_IOCTL ( TCGETS )
COMPATIBLE_IOCTL ( TCSETS )
COMPATIBLE_IOCTL ( TCSETSW )
COMPATIBLE_IOCTL ( TCSETSF )
COMPATIBLE_IOCTL ( TIOCLINUX )
COMPATIBLE_IOCTL ( TIOCSBRK )
COMPATIBLE_IOCTL ( TIOCCBRK )
ULONG_IOCTL ( TIOCMIWAIT )
COMPATIBLE_IOCTL ( TIOCGICOUNT )
/* Little t */
COMPATIBLE_IOCTL ( TIOCGETD )
COMPATIBLE_IOCTL ( TIOCSETD )
COMPATIBLE_IOCTL ( TIOCEXCL )
COMPATIBLE_IOCTL ( TIOCNXCL )
COMPATIBLE_IOCTL ( TIOCCONS )
COMPATIBLE_IOCTL ( TIOCGSOFTCAR )
COMPATIBLE_IOCTL ( TIOCSSOFTCAR )
COMPATIBLE_IOCTL ( TIOCSWINSZ )
COMPATIBLE_IOCTL ( TIOCGWINSZ )
COMPATIBLE_IOCTL ( TIOCMGET )
COMPATIBLE_IOCTL ( TIOCMBIC )
COMPATIBLE_IOCTL ( TIOCMBIS )
COMPATIBLE_IOCTL ( TIOCMSET )
COMPATIBLE_IOCTL ( TIOCPKT )
COMPATIBLE_IOCTL ( TIOCNOTTY )
COMPATIBLE_IOCTL ( TIOCSTI )
COMPATIBLE_IOCTL ( TIOCOUTQ )
COMPATIBLE_IOCTL ( TIOCSPGRP )
COMPATIBLE_IOCTL ( TIOCGPGRP )
ULONG_IOCTL ( TIOCSCTTY )
COMPATIBLE_IOCTL ( TIOCGPTN )
COMPATIBLE_IOCTL ( TIOCSPTLCK )
COMPATIBLE_IOCTL ( TIOCSERGETLSR )
2007-11-29 03:22:07 +03:00
# ifdef TCGETS2
COMPATIBLE_IOCTL ( TCGETS2 )
COMPATIBLE_IOCTL ( TCSETS2 )
COMPATIBLE_IOCTL ( TCSETSW2 )
COMPATIBLE_IOCTL ( TCSETSF2 )
# endif
2007-05-08 11:29:07 +04:00
/* Little f */
COMPATIBLE_IOCTL ( FIOCLEX )
COMPATIBLE_IOCTL ( FIONCLEX )
COMPATIBLE_IOCTL ( FIOASYNC )
COMPATIBLE_IOCTL ( FIONBIO )
COMPATIBLE_IOCTL ( FIONREAD ) /* This is also TIOCINQ */
2009-08-07 02:07:37 +04:00
COMPATIBLE_IOCTL ( FS_IOC_FIEMAP )
2007-05-08 11:29:07 +04:00
/* 0x00 */
COMPATIBLE_IOCTL ( FIBMAP )
COMPATIBLE_IOCTL ( FIGETBSZ )
2009-02-26 23:32:51 +03:00
/* 'X' - originally XFS but some now in the VFS */
COMPATIBLE_IOCTL ( FIFREEZE )
COMPATIBLE_IOCTL ( FITHAW )
2007-05-08 11:29:07 +04:00
/* RAID */
COMPATIBLE_IOCTL ( RAID_VERSION )
COMPATIBLE_IOCTL ( GET_ARRAY_INFO )
COMPATIBLE_IOCTL ( GET_DISK_INFO )
COMPATIBLE_IOCTL ( PRINT_RAID_DEBUG )
COMPATIBLE_IOCTL ( RAID_AUTORUN )
COMPATIBLE_IOCTL ( CLEAR_ARRAY )
COMPATIBLE_IOCTL ( ADD_NEW_DISK )
ULONG_IOCTL ( HOT_REMOVE_DISK )
COMPATIBLE_IOCTL ( SET_ARRAY_INFO )
COMPATIBLE_IOCTL ( SET_DISK_INFO )
COMPATIBLE_IOCTL ( WRITE_RAID_INFO )
COMPATIBLE_IOCTL ( UNPROTECT_ARRAY )
COMPATIBLE_IOCTL ( PROTECT_ARRAY )
ULONG_IOCTL ( HOT_ADD_DISK )
ULONG_IOCTL ( SET_DISK_FAULTY )
COMPATIBLE_IOCTL ( RUN_ARRAY )
COMPATIBLE_IOCTL ( STOP_ARRAY )
COMPATIBLE_IOCTL ( STOP_ARRAY_RO )
COMPATIBLE_IOCTL ( RESTART_ARRAY_RW )
COMPATIBLE_IOCTL ( GET_BITMAP_FILE )
ULONG_IOCTL ( SET_BITMAP_FILE )
/* Big K */
COMPATIBLE_IOCTL ( PIO_FONT )
COMPATIBLE_IOCTL ( GIO_FONT )
2009-02-19 01:48:39 +03:00
COMPATIBLE_IOCTL ( PIO_CMAP )
COMPATIBLE_IOCTL ( GIO_CMAP )
2007-05-08 11:29:07 +04:00
ULONG_IOCTL ( KDSIGACCEPT )
COMPATIBLE_IOCTL ( KDGETKEYCODE )
COMPATIBLE_IOCTL ( KDSETKEYCODE )
ULONG_IOCTL ( KIOCSOUND )
ULONG_IOCTL ( KDMKTONE )
COMPATIBLE_IOCTL ( KDGKBTYPE )
ULONG_IOCTL ( KDSETMODE )
COMPATIBLE_IOCTL ( KDGETMODE )
ULONG_IOCTL ( KDSKBMODE )
COMPATIBLE_IOCTL ( KDGKBMODE )
ULONG_IOCTL ( KDSKBMETA )
COMPATIBLE_IOCTL ( KDGKBMETA )
COMPATIBLE_IOCTL ( KDGKBENT )
COMPATIBLE_IOCTL ( KDSKBENT )
COMPATIBLE_IOCTL ( KDGKBSENT )
COMPATIBLE_IOCTL ( KDSKBSENT )
COMPATIBLE_IOCTL ( KDGKBDIACR )
COMPATIBLE_IOCTL ( KDSKBDIACR )
COMPATIBLE_IOCTL ( KDKBDREP )
COMPATIBLE_IOCTL ( KDGKBLED )
ULONG_IOCTL ( KDSKBLED )
COMPATIBLE_IOCTL ( KDGETLED )
ULONG_IOCTL ( KDSETLED )
COMPATIBLE_IOCTL ( GIO_SCRNMAP )
COMPATIBLE_IOCTL ( PIO_SCRNMAP )
COMPATIBLE_IOCTL ( GIO_UNISCRNMAP )
COMPATIBLE_IOCTL ( PIO_UNISCRNMAP )
COMPATIBLE_IOCTL ( PIO_FONTRESET )
COMPATIBLE_IOCTL ( PIO_UNIMAPCLR )
2008-07-16 17:52:00 +04:00
# ifdef CONFIG_BLOCK
2007-05-08 11:29:07 +04:00
/* Big S */
COMPATIBLE_IOCTL ( SCSI_IOCTL_GET_IDLUN )
COMPATIBLE_IOCTL ( SCSI_IOCTL_DOORLOCK )
COMPATIBLE_IOCTL ( SCSI_IOCTL_DOORUNLOCK )
COMPATIBLE_IOCTL ( SCSI_IOCTL_TEST_UNIT_READY )
COMPATIBLE_IOCTL ( SCSI_IOCTL_GET_BUS_NUMBER )
COMPATIBLE_IOCTL ( SCSI_IOCTL_SEND_COMMAND )
COMPATIBLE_IOCTL ( SCSI_IOCTL_PROBE_HOST )
COMPATIBLE_IOCTL ( SCSI_IOCTL_GET_PCI )
2008-07-16 17:52:00 +04:00
# endif
2007-05-08 11:29:07 +04:00
/* Big V */
COMPATIBLE_IOCTL ( VT_SETMODE )
COMPATIBLE_IOCTL ( VT_GETMODE )
COMPATIBLE_IOCTL ( VT_GETSTATE )
COMPATIBLE_IOCTL ( VT_OPENQRY )
ULONG_IOCTL ( VT_ACTIVATE )
ULONG_IOCTL ( VT_WAITACTIVE )
ULONG_IOCTL ( VT_RELDISP )
ULONG_IOCTL ( VT_DISALLOCATE )
COMPATIBLE_IOCTL ( VT_RESIZE )
COMPATIBLE_IOCTL ( VT_RESIZEX )
COMPATIBLE_IOCTL ( VT_LOCKSWITCH )
COMPATIBLE_IOCTL ( VT_UNLOCKSWITCH )
COMPATIBLE_IOCTL ( VT_GETHIFONTMASK )
/* Little p (/dev/rtc, /dev/envctrl, etc.) */
COMPATIBLE_IOCTL ( RTC_AIE_ON )
COMPATIBLE_IOCTL ( RTC_AIE_OFF )
COMPATIBLE_IOCTL ( RTC_UIE_ON )
COMPATIBLE_IOCTL ( RTC_UIE_OFF )
COMPATIBLE_IOCTL ( RTC_PIE_ON )
COMPATIBLE_IOCTL ( RTC_PIE_OFF )
COMPATIBLE_IOCTL ( RTC_WIE_ON )
COMPATIBLE_IOCTL ( RTC_WIE_OFF )
COMPATIBLE_IOCTL ( RTC_ALM_SET )
COMPATIBLE_IOCTL ( RTC_ALM_READ )
COMPATIBLE_IOCTL ( RTC_RD_TIME )
COMPATIBLE_IOCTL ( RTC_SET_TIME )
COMPATIBLE_IOCTL ( RTC_WKALM_SET )
COMPATIBLE_IOCTL ( RTC_WKALM_RD )
/*
* These two are only for the sbus rtc driver , but
* hwclock tries them on every rtc device first when
* running on sparc . On other architectures the entries
* are useless but harmless .
*/
COMPATIBLE_IOCTL ( _IOR ( ' p ' , 20 , int [ 7 ] ) ) /* RTCGET */
COMPATIBLE_IOCTL ( _IOW ( ' p ' , 21 , int [ 7 ] ) ) /* RTCSET */
/* Little m */
COMPATIBLE_IOCTL ( MTIOCTOP )
/* Socket level stuff */
COMPATIBLE_IOCTL ( FIOQSIZE )
2008-07-16 17:52:00 +04:00
# ifdef CONFIG_BLOCK
2007-05-08 11:29:07 +04:00
/* SG stuff */
COMPATIBLE_IOCTL ( SG_SET_TIMEOUT )
COMPATIBLE_IOCTL ( SG_GET_TIMEOUT )
COMPATIBLE_IOCTL ( SG_EMULATED_HOST )
ULONG_IOCTL ( SG_SET_TRANSFORM )
COMPATIBLE_IOCTL ( SG_GET_TRANSFORM )
COMPATIBLE_IOCTL ( SG_SET_RESERVED_SIZE )
COMPATIBLE_IOCTL ( SG_GET_RESERVED_SIZE )
COMPATIBLE_IOCTL ( SG_GET_SCSI_ID )
COMPATIBLE_IOCTL ( SG_SET_FORCE_LOW_DMA )
COMPATIBLE_IOCTL ( SG_GET_LOW_DMA )
COMPATIBLE_IOCTL ( SG_SET_FORCE_PACK_ID )
COMPATIBLE_IOCTL ( SG_GET_PACK_ID )
COMPATIBLE_IOCTL ( SG_GET_NUM_WAITING )
COMPATIBLE_IOCTL ( SG_SET_DEBUG )
COMPATIBLE_IOCTL ( SG_GET_SG_TABLESIZE )
COMPATIBLE_IOCTL ( SG_GET_COMMAND_Q )
COMPATIBLE_IOCTL ( SG_SET_COMMAND_Q )
COMPATIBLE_IOCTL ( SG_GET_VERSION_NUM )
COMPATIBLE_IOCTL ( SG_NEXT_CMD_LEN )
COMPATIBLE_IOCTL ( SG_SCSI_RESET )
COMPATIBLE_IOCTL ( SG_GET_REQUEST_TABLE )
COMPATIBLE_IOCTL ( SG_SET_KEEP_ORPHAN )
COMPATIBLE_IOCTL ( SG_GET_KEEP_ORPHAN )
2008-07-16 17:52:00 +04:00
# endif
2007-05-08 11:29:07 +04:00
/* PPP stuff */
COMPATIBLE_IOCTL ( PPPIOCGFLAGS )
COMPATIBLE_IOCTL ( PPPIOCSFLAGS )
COMPATIBLE_IOCTL ( PPPIOCGASYNCMAP )
COMPATIBLE_IOCTL ( PPPIOCSASYNCMAP )
COMPATIBLE_IOCTL ( PPPIOCGUNIT )
COMPATIBLE_IOCTL ( PPPIOCGRASYNCMAP )
COMPATIBLE_IOCTL ( PPPIOCSRASYNCMAP )
COMPATIBLE_IOCTL ( PPPIOCGMRU )
COMPATIBLE_IOCTL ( PPPIOCSMRU )
COMPATIBLE_IOCTL ( PPPIOCSMAXCID )
COMPATIBLE_IOCTL ( PPPIOCGXASYNCMAP )
COMPATIBLE_IOCTL ( PPPIOCSXASYNCMAP )
COMPATIBLE_IOCTL ( PPPIOCXFERUNIT )
/* PPPIOCSCOMPRESS is translated */
COMPATIBLE_IOCTL ( PPPIOCGNPMODE )
COMPATIBLE_IOCTL ( PPPIOCSNPMODE )
COMPATIBLE_IOCTL ( PPPIOCGDEBUG )
COMPATIBLE_IOCTL ( PPPIOCSDEBUG )
/* PPPIOCSPASS is translated */
/* PPPIOCSACTIVE is translated */
/* PPPIOCGIDLE is translated */
COMPATIBLE_IOCTL ( PPPIOCNEWUNIT )
COMPATIBLE_IOCTL ( PPPIOCATTACH )
COMPATIBLE_IOCTL ( PPPIOCDETACH )
COMPATIBLE_IOCTL ( PPPIOCSMRRU )
COMPATIBLE_IOCTL ( PPPIOCCONNECT )
COMPATIBLE_IOCTL ( PPPIOCDISCONN )
COMPATIBLE_IOCTL ( PPPIOCATTCHAN )
COMPATIBLE_IOCTL ( PPPIOCGCHAN )
/* PPPOX */
COMPATIBLE_IOCTL ( PPPOEIOCSFWD )
COMPATIBLE_IOCTL ( PPPOEIOCDFWD )
/* LP */
COMPATIBLE_IOCTL ( LPGETSTATUS )
/* ppdev */
COMPATIBLE_IOCTL ( PPSETMODE )
COMPATIBLE_IOCTL ( PPRSTATUS )
COMPATIBLE_IOCTL ( PPRCONTROL )
COMPATIBLE_IOCTL ( PPWCONTROL )
COMPATIBLE_IOCTL ( PPFCONTROL )
COMPATIBLE_IOCTL ( PPRDATA )
COMPATIBLE_IOCTL ( PPWDATA )
COMPATIBLE_IOCTL ( PPCLAIM )
COMPATIBLE_IOCTL ( PPRELEASE )
COMPATIBLE_IOCTL ( PPYIELD )
COMPATIBLE_IOCTL ( PPEXCL )
COMPATIBLE_IOCTL ( PPDATADIR )
COMPATIBLE_IOCTL ( PPNEGOT )
COMPATIBLE_IOCTL ( PPWCTLONIRQ )
COMPATIBLE_IOCTL ( PPCLRIRQ )
COMPATIBLE_IOCTL ( PPSETPHASE )
COMPATIBLE_IOCTL ( PPGETMODES )
COMPATIBLE_IOCTL ( PPGETMODE )
COMPATIBLE_IOCTL ( PPGETPHASE )
COMPATIBLE_IOCTL ( PPGETFLAGS )
COMPATIBLE_IOCTL ( PPSETFLAGS )
/* pktcdvd */
COMPATIBLE_IOCTL ( PACKET_CTRL_CMD )
/* Big A */
/* sparc only */
/* Big Q for sound/OSS */
COMPATIBLE_IOCTL ( SNDCTL_SEQ_RESET )
COMPATIBLE_IOCTL ( SNDCTL_SEQ_SYNC )
COMPATIBLE_IOCTL ( SNDCTL_SYNTH_INFO )
COMPATIBLE_IOCTL ( SNDCTL_SEQ_CTRLRATE )
COMPATIBLE_IOCTL ( SNDCTL_SEQ_GETOUTCOUNT )
COMPATIBLE_IOCTL ( SNDCTL_SEQ_GETINCOUNT )
COMPATIBLE_IOCTL ( SNDCTL_SEQ_PERCMODE )
COMPATIBLE_IOCTL ( SNDCTL_FM_LOAD_INSTR )
COMPATIBLE_IOCTL ( SNDCTL_SEQ_TESTMIDI )
COMPATIBLE_IOCTL ( SNDCTL_SEQ_RESETSAMPLES )
COMPATIBLE_IOCTL ( SNDCTL_SEQ_NRSYNTHS )
COMPATIBLE_IOCTL ( SNDCTL_SEQ_NRMIDIS )
COMPATIBLE_IOCTL ( SNDCTL_MIDI_INFO )
COMPATIBLE_IOCTL ( SNDCTL_SEQ_THRESHOLD )
COMPATIBLE_IOCTL ( SNDCTL_SYNTH_MEMAVL )
COMPATIBLE_IOCTL ( SNDCTL_FM_4OP_ENABLE )
COMPATIBLE_IOCTL ( SNDCTL_SEQ_PANIC )
COMPATIBLE_IOCTL ( SNDCTL_SEQ_OUTOFBAND )
COMPATIBLE_IOCTL ( SNDCTL_SEQ_GETTIME )
COMPATIBLE_IOCTL ( SNDCTL_SYNTH_ID )
COMPATIBLE_IOCTL ( SNDCTL_SYNTH_CONTROL )
COMPATIBLE_IOCTL ( SNDCTL_SYNTH_REMOVESAMPLE )
/* Big T for sound/OSS */
COMPATIBLE_IOCTL ( SNDCTL_TMR_TIMEBASE )
COMPATIBLE_IOCTL ( SNDCTL_TMR_START )
COMPATIBLE_IOCTL ( SNDCTL_TMR_STOP )
COMPATIBLE_IOCTL ( SNDCTL_TMR_CONTINUE )
COMPATIBLE_IOCTL ( SNDCTL_TMR_TEMPO )
COMPATIBLE_IOCTL ( SNDCTL_TMR_SOURCE )
COMPATIBLE_IOCTL ( SNDCTL_TMR_METRONOME )
COMPATIBLE_IOCTL ( SNDCTL_TMR_SELECT )
/* Little m for sound/OSS */
COMPATIBLE_IOCTL ( SNDCTL_MIDI_PRETIME )
COMPATIBLE_IOCTL ( SNDCTL_MIDI_MPUMODE )
COMPATIBLE_IOCTL ( SNDCTL_MIDI_MPUCMD )
/* Big P for sound/OSS */
COMPATIBLE_IOCTL ( SNDCTL_DSP_RESET )
COMPATIBLE_IOCTL ( SNDCTL_DSP_SYNC )
COMPATIBLE_IOCTL ( SNDCTL_DSP_SPEED )
COMPATIBLE_IOCTL ( SNDCTL_DSP_STEREO )
COMPATIBLE_IOCTL ( SNDCTL_DSP_GETBLKSIZE )
COMPATIBLE_IOCTL ( SNDCTL_DSP_CHANNELS )
COMPATIBLE_IOCTL ( SOUND_PCM_WRITE_FILTER )
COMPATIBLE_IOCTL ( SNDCTL_DSP_POST )
COMPATIBLE_IOCTL ( SNDCTL_DSP_SUBDIVIDE )
COMPATIBLE_IOCTL ( SNDCTL_DSP_SETFRAGMENT )
COMPATIBLE_IOCTL ( SNDCTL_DSP_GETFMTS )
COMPATIBLE_IOCTL ( SNDCTL_DSP_SETFMT )
COMPATIBLE_IOCTL ( SNDCTL_DSP_GETOSPACE )
COMPATIBLE_IOCTL ( SNDCTL_DSP_GETISPACE )
COMPATIBLE_IOCTL ( SNDCTL_DSP_NONBLOCK )
COMPATIBLE_IOCTL ( SNDCTL_DSP_GETCAPS )
COMPATIBLE_IOCTL ( SNDCTL_DSP_GETTRIGGER )
COMPATIBLE_IOCTL ( SNDCTL_DSP_SETTRIGGER )
COMPATIBLE_IOCTL ( SNDCTL_DSP_GETIPTR )
COMPATIBLE_IOCTL ( SNDCTL_DSP_GETOPTR )
/* SNDCTL_DSP_MAPINBUF, XXX needs translation */
/* SNDCTL_DSP_MAPOUTBUF, XXX needs translation */
COMPATIBLE_IOCTL ( SNDCTL_DSP_SETSYNCRO )
COMPATIBLE_IOCTL ( SNDCTL_DSP_SETDUPLEX )
COMPATIBLE_IOCTL ( SNDCTL_DSP_GETODELAY )
COMPATIBLE_IOCTL ( SNDCTL_DSP_PROFILE )
COMPATIBLE_IOCTL ( SOUND_PCM_READ_RATE )
COMPATIBLE_IOCTL ( SOUND_PCM_READ_CHANNELS )
COMPATIBLE_IOCTL ( SOUND_PCM_READ_BITS )
COMPATIBLE_IOCTL ( SOUND_PCM_READ_FILTER )
/* Big C for sound/OSS */
COMPATIBLE_IOCTL ( SNDCTL_COPR_RESET )
COMPATIBLE_IOCTL ( SNDCTL_COPR_LOAD )
COMPATIBLE_IOCTL ( SNDCTL_COPR_RDATA )
COMPATIBLE_IOCTL ( SNDCTL_COPR_RCODE )
COMPATIBLE_IOCTL ( SNDCTL_COPR_WDATA )
COMPATIBLE_IOCTL ( SNDCTL_COPR_WCODE )
COMPATIBLE_IOCTL ( SNDCTL_COPR_RUN )
COMPATIBLE_IOCTL ( SNDCTL_COPR_HALT )
COMPATIBLE_IOCTL ( SNDCTL_COPR_SENDMSG )
COMPATIBLE_IOCTL ( SNDCTL_COPR_RCVMSG )
/* Big M for sound/OSS */
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_VOLUME )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_BASS )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_TREBLE )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_SYNTH )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_PCM )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_SPEAKER )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_LINE )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_MIC )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_CD )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_IMIX )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_ALTPCM )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_RECLEV )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_IGAIN )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_OGAIN )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_LINE1 )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_LINE2 )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_LINE3 )
COMPATIBLE_IOCTL ( MIXER_READ ( SOUND_MIXER_DIGITAL1 ) )
COMPATIBLE_IOCTL ( MIXER_READ ( SOUND_MIXER_DIGITAL2 ) )
COMPATIBLE_IOCTL ( MIXER_READ ( SOUND_MIXER_DIGITAL3 ) )
COMPATIBLE_IOCTL ( MIXER_READ ( SOUND_MIXER_PHONEIN ) )
COMPATIBLE_IOCTL ( MIXER_READ ( SOUND_MIXER_PHONEOUT ) )
COMPATIBLE_IOCTL ( MIXER_READ ( SOUND_MIXER_VIDEO ) )
COMPATIBLE_IOCTL ( MIXER_READ ( SOUND_MIXER_RADIO ) )
COMPATIBLE_IOCTL ( MIXER_READ ( SOUND_MIXER_MONITOR ) )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_MUTE )
/* SOUND_MIXER_READ_ENHANCE, same value as READ_MUTE */
/* SOUND_MIXER_READ_LOUD, same value as READ_MUTE */
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_RECSRC )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_DEVMASK )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_RECMASK )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_STEREODEVS )
COMPATIBLE_IOCTL ( SOUND_MIXER_READ_CAPS )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_VOLUME )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_BASS )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_TREBLE )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_SYNTH )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_PCM )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_SPEAKER )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_LINE )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_MIC )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_CD )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_IMIX )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_ALTPCM )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_RECLEV )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_IGAIN )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_OGAIN )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_LINE1 )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_LINE2 )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_LINE3 )
COMPATIBLE_IOCTL ( MIXER_WRITE ( SOUND_MIXER_DIGITAL1 ) )
COMPATIBLE_IOCTL ( MIXER_WRITE ( SOUND_MIXER_DIGITAL2 ) )
COMPATIBLE_IOCTL ( MIXER_WRITE ( SOUND_MIXER_DIGITAL3 ) )
COMPATIBLE_IOCTL ( MIXER_WRITE ( SOUND_MIXER_PHONEIN ) )
COMPATIBLE_IOCTL ( MIXER_WRITE ( SOUND_MIXER_PHONEOUT ) )
COMPATIBLE_IOCTL ( MIXER_WRITE ( SOUND_MIXER_VIDEO ) )
COMPATIBLE_IOCTL ( MIXER_WRITE ( SOUND_MIXER_RADIO ) )
COMPATIBLE_IOCTL ( MIXER_WRITE ( SOUND_MIXER_MONITOR ) )
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_MUTE )
/* SOUND_MIXER_WRITE_ENHANCE, same value as WRITE_MUTE */
/* SOUND_MIXER_WRITE_LOUD, same value as WRITE_MUTE */
COMPATIBLE_IOCTL ( SOUND_MIXER_WRITE_RECSRC )
COMPATIBLE_IOCTL ( SOUND_MIXER_INFO )
COMPATIBLE_IOCTL ( SOUND_OLD_MIXER_INFO )
COMPATIBLE_IOCTL ( SOUND_MIXER_ACCESS )
COMPATIBLE_IOCTL ( SOUND_MIXER_AGC )
COMPATIBLE_IOCTL ( SOUND_MIXER_3DSE )
COMPATIBLE_IOCTL ( SOUND_MIXER_PRIVATE1 )
COMPATIBLE_IOCTL ( SOUND_MIXER_PRIVATE2 )
COMPATIBLE_IOCTL ( SOUND_MIXER_PRIVATE3 )
COMPATIBLE_IOCTL ( SOUND_MIXER_PRIVATE4 )
COMPATIBLE_IOCTL ( SOUND_MIXER_PRIVATE5 )
COMPATIBLE_IOCTL ( SOUND_MIXER_GETLEVELS )
COMPATIBLE_IOCTL ( SOUND_MIXER_SETLEVELS )
COMPATIBLE_IOCTL ( OSS_GETVERSION )
/* AUTOFS */
ULONG_IOCTL ( AUTOFS_IOC_READY )
ULONG_IOCTL ( AUTOFS_IOC_FAIL )
COMPATIBLE_IOCTL ( AUTOFS_IOC_CATATONIC )
COMPATIBLE_IOCTL ( AUTOFS_IOC_PROTOVER )
COMPATIBLE_IOCTL ( AUTOFS_IOC_EXPIRE )
COMPATIBLE_IOCTL ( AUTOFS_IOC_EXPIRE_MULTI )
COMPATIBLE_IOCTL ( AUTOFS_IOC_PROTOSUBVER )
COMPATIBLE_IOCTL ( AUTOFS_IOC_ASKUMOUNT )
/* Raw devices */
COMPATIBLE_IOCTL ( RAW_SETBIND )
COMPATIBLE_IOCTL ( RAW_GETBIND )
/* SMB ioctls which do not need any translations */
COMPATIBLE_IOCTL ( SMB_IOC_NEWCONN )
/* Watchdog */
COMPATIBLE_IOCTL ( WDIOC_GETSUPPORT )
COMPATIBLE_IOCTL ( WDIOC_GETSTATUS )
COMPATIBLE_IOCTL ( WDIOC_GETBOOTSTATUS )
COMPATIBLE_IOCTL ( WDIOC_GETTEMP )
COMPATIBLE_IOCTL ( WDIOC_SETOPTIONS )
COMPATIBLE_IOCTL ( WDIOC_KEEPALIVE )
COMPATIBLE_IOCTL ( WDIOC_SETTIMEOUT )
COMPATIBLE_IOCTL ( WDIOC_GETTIMEOUT )
/* Big R */
COMPATIBLE_IOCTL ( RNDGETENTCNT )
COMPATIBLE_IOCTL ( RNDADDTOENTCNT )
COMPATIBLE_IOCTL ( RNDGETPOOL )
COMPATIBLE_IOCTL ( RNDADDENTROPY )
COMPATIBLE_IOCTL ( RNDZAPENTCNT )
COMPATIBLE_IOCTL ( RNDCLEARPOOL )
/* Bluetooth */
COMPATIBLE_IOCTL ( HCIDEVUP )
COMPATIBLE_IOCTL ( HCIDEVDOWN )
COMPATIBLE_IOCTL ( HCIDEVRESET )
COMPATIBLE_IOCTL ( HCIDEVRESTAT )
COMPATIBLE_IOCTL ( HCIGETDEVLIST )
COMPATIBLE_IOCTL ( HCIGETDEVINFO )
COMPATIBLE_IOCTL ( HCIGETCONNLIST )
COMPATIBLE_IOCTL ( HCIGETCONNINFO )
2008-07-14 22:13:50 +04:00
COMPATIBLE_IOCTL ( HCIGETAUTHINFO )
2007-05-08 11:29:07 +04:00
COMPATIBLE_IOCTL ( HCISETRAW )
COMPATIBLE_IOCTL ( HCISETSCAN )
COMPATIBLE_IOCTL ( HCISETAUTH )
COMPATIBLE_IOCTL ( HCISETENCRYPT )
COMPATIBLE_IOCTL ( HCISETPTYPE )
COMPATIBLE_IOCTL ( HCISETLINKPOL )
COMPATIBLE_IOCTL ( HCISETLINKMODE )
COMPATIBLE_IOCTL ( HCISETACLMTU )
COMPATIBLE_IOCTL ( HCISETSCOMTU )
COMPATIBLE_IOCTL ( HCIINQUIRY )
COMPATIBLE_IOCTL ( HCIUARTSETPROTO )
COMPATIBLE_IOCTL ( HCIUARTGETPROTO )
COMPATIBLE_IOCTL ( RFCOMMCREATEDEV )
COMPATIBLE_IOCTL ( RFCOMMRELEASEDEV )
COMPATIBLE_IOCTL ( RFCOMMGETDEVLIST )
COMPATIBLE_IOCTL ( RFCOMMGETDEVINFO )
COMPATIBLE_IOCTL ( RFCOMMSTEALDLC )
COMPATIBLE_IOCTL ( BNEPCONNADD )
COMPATIBLE_IOCTL ( BNEPCONNDEL )
COMPATIBLE_IOCTL ( BNEPGETCONNLIST )
COMPATIBLE_IOCTL ( BNEPGETCONNINFO )
COMPATIBLE_IOCTL ( CMTPCONNADD )
COMPATIBLE_IOCTL ( CMTPCONNDEL )
COMPATIBLE_IOCTL ( CMTPGETCONNLIST )
COMPATIBLE_IOCTL ( CMTPGETCONNINFO )
COMPATIBLE_IOCTL ( HIDPCONNADD )
COMPATIBLE_IOCTL ( HIDPCONNDEL )
COMPATIBLE_IOCTL ( HIDPGETCONNLIST )
COMPATIBLE_IOCTL ( HIDPGETCONNINFO )
/* CAPI */
COMPATIBLE_IOCTL ( CAPI_REGISTER )
COMPATIBLE_IOCTL ( CAPI_GET_MANUFACTURER )
COMPATIBLE_IOCTL ( CAPI_GET_VERSION )
COMPATIBLE_IOCTL ( CAPI_GET_SERIAL )
COMPATIBLE_IOCTL ( CAPI_GET_PROFILE )
COMPATIBLE_IOCTL ( CAPI_MANUFACTURER_CMD )
COMPATIBLE_IOCTL ( CAPI_GET_ERRCODE )
COMPATIBLE_IOCTL ( CAPI_INSTALLED )
COMPATIBLE_IOCTL ( CAPI_GET_FLAGS )
COMPATIBLE_IOCTL ( CAPI_SET_FLAGS )
COMPATIBLE_IOCTL ( CAPI_CLR_FLAGS )
COMPATIBLE_IOCTL ( CAPI_NCCI_OPENCOUNT )
COMPATIBLE_IOCTL ( CAPI_NCCI_GETUNIT )
/* Siemens Gigaset */
COMPATIBLE_IOCTL ( GIGASET_REDIR )
COMPATIBLE_IOCTL ( GIGASET_CONFIG )
COMPATIBLE_IOCTL ( GIGASET_BRKCHARS )
COMPATIBLE_IOCTL ( GIGASET_VERSION )
/* Misc. */
COMPATIBLE_IOCTL ( 0x41545900 ) /* ATYIO_CLKR */
COMPATIBLE_IOCTL ( 0x41545901 ) /* ATYIO_CLKW */
COMPATIBLE_IOCTL ( PCIIOC_CONTROLLER )
COMPATIBLE_IOCTL ( PCIIOC_MMAP_IS_IO )
COMPATIBLE_IOCTL ( PCIIOC_MMAP_IS_MEM )
COMPATIBLE_IOCTL ( PCIIOC_WRITE_COMBINE )
/* USB */
COMPATIBLE_IOCTL ( USBDEVFS_RESETEP )
COMPATIBLE_IOCTL ( USBDEVFS_SETINTERFACE )
COMPATIBLE_IOCTL ( USBDEVFS_SETCONFIGURATION )
COMPATIBLE_IOCTL ( USBDEVFS_GETDRIVER )
COMPATIBLE_IOCTL ( USBDEVFS_DISCARDURB )
COMPATIBLE_IOCTL ( USBDEVFS_CLAIMINTERFACE )
COMPATIBLE_IOCTL ( USBDEVFS_RELEASEINTERFACE )
COMPATIBLE_IOCTL ( USBDEVFS_CONNECTINFO )
COMPATIBLE_IOCTL ( USBDEVFS_HUB_PORTINFO )
COMPATIBLE_IOCTL ( USBDEVFS_RESET )
COMPATIBLE_IOCTL ( USBDEVFS_SUBMITURB32 )
COMPATIBLE_IOCTL ( USBDEVFS_REAPURB32 )
COMPATIBLE_IOCTL ( USBDEVFS_REAPURBNDELAY32 )
COMPATIBLE_IOCTL ( USBDEVFS_CLEAR_HALT )
/* NBD */
ULONG_IOCTL ( NBD_SET_SOCK )
ULONG_IOCTL ( NBD_SET_BLKSIZE )
ULONG_IOCTL ( NBD_SET_SIZE )
COMPATIBLE_IOCTL ( NBD_DO_IT )
COMPATIBLE_IOCTL ( NBD_CLEAR_SOCK )
COMPATIBLE_IOCTL ( NBD_CLEAR_QUE )
COMPATIBLE_IOCTL ( NBD_PRINT_DEBUG )
ULONG_IOCTL ( NBD_SET_SIZE_BLOCKS )
COMPATIBLE_IOCTL ( NBD_DISCONNECT )
/* i2c */
COMPATIBLE_IOCTL ( I2C_SLAVE )
COMPATIBLE_IOCTL ( I2C_SLAVE_FORCE )
COMPATIBLE_IOCTL ( I2C_TENBIT )
COMPATIBLE_IOCTL ( I2C_PEC )
COMPATIBLE_IOCTL ( I2C_RETRIES )
COMPATIBLE_IOCTL ( I2C_TIMEOUT )
/* hiddev */
COMPATIBLE_IOCTL ( HIDIOCGVERSION )
COMPATIBLE_IOCTL ( HIDIOCAPPLICATION )
COMPATIBLE_IOCTL ( HIDIOCGDEVINFO )
COMPATIBLE_IOCTL ( HIDIOCGSTRING )
COMPATIBLE_IOCTL ( HIDIOCINITREPORT )
COMPATIBLE_IOCTL ( HIDIOCGREPORT )
COMPATIBLE_IOCTL ( HIDIOCSREPORT )
COMPATIBLE_IOCTL ( HIDIOCGREPORTINFO )
COMPATIBLE_IOCTL ( HIDIOCGFIELDINFO )
COMPATIBLE_IOCTL ( HIDIOCGUSAGE )
COMPATIBLE_IOCTL ( HIDIOCSUSAGE )
COMPATIBLE_IOCTL ( HIDIOCGUCODE )
COMPATIBLE_IOCTL ( HIDIOCGFLAG )
COMPATIBLE_IOCTL ( HIDIOCSFLAG )
COMPATIBLE_IOCTL ( HIDIOCGCOLLECTIONINDEX )
COMPATIBLE_IOCTL ( HIDIOCGCOLLECTIONINFO )
/* dvb */
COMPATIBLE_IOCTL ( AUDIO_STOP )
COMPATIBLE_IOCTL ( AUDIO_PLAY )
COMPATIBLE_IOCTL ( AUDIO_PAUSE )
COMPATIBLE_IOCTL ( AUDIO_CONTINUE )
COMPATIBLE_IOCTL ( AUDIO_SELECT_SOURCE )
COMPATIBLE_IOCTL ( AUDIO_SET_MUTE )
COMPATIBLE_IOCTL ( AUDIO_SET_AV_SYNC )
COMPATIBLE_IOCTL ( AUDIO_SET_BYPASS_MODE )
COMPATIBLE_IOCTL ( AUDIO_CHANNEL_SELECT )
COMPATIBLE_IOCTL ( AUDIO_GET_STATUS )
COMPATIBLE_IOCTL ( AUDIO_GET_CAPABILITIES )
COMPATIBLE_IOCTL ( AUDIO_CLEAR_BUFFER )
COMPATIBLE_IOCTL ( AUDIO_SET_ID )
COMPATIBLE_IOCTL ( AUDIO_SET_MIXER )
COMPATIBLE_IOCTL ( AUDIO_SET_STREAMTYPE )
COMPATIBLE_IOCTL ( AUDIO_SET_EXT_ID )
COMPATIBLE_IOCTL ( AUDIO_SET_ATTRIBUTES )
COMPATIBLE_IOCTL ( AUDIO_SET_KARAOKE )
COMPATIBLE_IOCTL ( DMX_START )
COMPATIBLE_IOCTL ( DMX_STOP )
COMPATIBLE_IOCTL ( DMX_SET_FILTER )
COMPATIBLE_IOCTL ( DMX_SET_PES_FILTER )
COMPATIBLE_IOCTL ( DMX_SET_BUFFER_SIZE )
COMPATIBLE_IOCTL ( DMX_GET_PES_PIDS )
COMPATIBLE_IOCTL ( DMX_GET_CAPS )
COMPATIBLE_IOCTL ( DMX_SET_SOURCE )
COMPATIBLE_IOCTL ( DMX_GET_STC )
COMPATIBLE_IOCTL ( FE_GET_INFO )
COMPATIBLE_IOCTL ( FE_DISEQC_RESET_OVERLOAD )
COMPATIBLE_IOCTL ( FE_DISEQC_SEND_MASTER_CMD )
COMPATIBLE_IOCTL ( FE_DISEQC_RECV_SLAVE_REPLY )
COMPATIBLE_IOCTL ( FE_DISEQC_SEND_BURST )
COMPATIBLE_IOCTL ( FE_SET_TONE )
COMPATIBLE_IOCTL ( FE_SET_VOLTAGE )
COMPATIBLE_IOCTL ( FE_ENABLE_HIGH_LNB_VOLTAGE )
COMPATIBLE_IOCTL ( FE_READ_STATUS )
COMPATIBLE_IOCTL ( FE_READ_BER )
COMPATIBLE_IOCTL ( FE_READ_SIGNAL_STRENGTH )
COMPATIBLE_IOCTL ( FE_READ_SNR )
COMPATIBLE_IOCTL ( FE_READ_UNCORRECTED_BLOCKS )
COMPATIBLE_IOCTL ( FE_SET_FRONTEND )
COMPATIBLE_IOCTL ( FE_GET_FRONTEND )
COMPATIBLE_IOCTL ( FE_GET_EVENT )
COMPATIBLE_IOCTL ( FE_DISHNETWORK_SEND_LEGACY_CMD )
COMPATIBLE_IOCTL ( VIDEO_STOP )
COMPATIBLE_IOCTL ( VIDEO_PLAY )
COMPATIBLE_IOCTL ( VIDEO_FREEZE )
COMPATIBLE_IOCTL ( VIDEO_CONTINUE )
COMPATIBLE_IOCTL ( VIDEO_SELECT_SOURCE )
COMPATIBLE_IOCTL ( VIDEO_SET_BLANK )
COMPATIBLE_IOCTL ( VIDEO_GET_STATUS )
COMPATIBLE_IOCTL ( VIDEO_SET_DISPLAY_FORMAT )
COMPATIBLE_IOCTL ( VIDEO_FAST_FORWARD )
COMPATIBLE_IOCTL ( VIDEO_SLOWMOTION )
COMPATIBLE_IOCTL ( VIDEO_GET_CAPABILITIES )
COMPATIBLE_IOCTL ( VIDEO_CLEAR_BUFFER )
COMPATIBLE_IOCTL ( VIDEO_SET_ID )
COMPATIBLE_IOCTL ( VIDEO_SET_STREAMTYPE )
COMPATIBLE_IOCTL ( VIDEO_SET_FORMAT )
COMPATIBLE_IOCTL ( VIDEO_SET_SYSTEM )
COMPATIBLE_IOCTL ( VIDEO_SET_HIGHLIGHT )
COMPATIBLE_IOCTL ( VIDEO_SET_SPU )
COMPATIBLE_IOCTL ( VIDEO_GET_NAVI )
COMPATIBLE_IOCTL ( VIDEO_SET_ATTRIBUTES )
COMPATIBLE_IOCTL ( VIDEO_GET_SIZE )
COMPATIBLE_IOCTL ( VIDEO_GET_FRAME_RATE )
2008-01-06 13:15:55 +03:00
/* joystick */
COMPATIBLE_IOCTL ( JSIOCGVERSION )
COMPATIBLE_IOCTL ( JSIOCGAXES )
COMPATIBLE_IOCTL ( JSIOCGBUTTONS )
COMPATIBLE_IOCTL ( JSIOCGNAME ( 0 ) )
2007-05-08 11:29:07 +04:00
/* now things that need handlers */
[PATCH] BLOCK: Make it possible to disable the block layer [try #6]
Make it possible to disable the block layer. Not all embedded devices require
it, some can make do with just JFFS2, NFS, ramfs, etc - none of which require
the block layer to be present.
This patch does the following:
(*) Introduces CONFIG_BLOCK to disable the block layer, buffering and blockdev
support.
(*) Adds dependencies on CONFIG_BLOCK to any configuration item that controls
an item that uses the block layer. This includes:
(*) Block I/O tracing.
(*) Disk partition code.
(*) All filesystems that are block based, eg: Ext3, ReiserFS, ISOFS.
(*) The SCSI layer. As far as I can tell, even SCSI chardevs use the
block layer to do scheduling. Some drivers that use SCSI facilities -
such as USB storage - end up disabled indirectly from this.
(*) Various block-based device drivers, such as IDE and the old CDROM
drivers.
(*) MTD blockdev handling and FTL.
(*) JFFS - which uses set_bdev_super(), something it could avoid doing by
taking a leaf out of JFFS2's book.
(*) Makes most of the contents of linux/blkdev.h, linux/buffer_head.h and
linux/elevator.h contingent on CONFIG_BLOCK being set. sector_div() is,
however, still used in places, and so is still available.
(*) Also made contingent are the contents of linux/mpage.h, linux/genhd.h and
parts of linux/fs.h.
(*) Makes a number of files in fs/ contingent on CONFIG_BLOCK.
(*) Makes mm/bounce.c (bounce buffering) contingent on CONFIG_BLOCK.
(*) set_page_dirty() doesn't call __set_page_dirty_buffers() if CONFIG_BLOCK
is not enabled.
(*) fs/no-block.c is created to hold out-of-line stubs and things that are
required when CONFIG_BLOCK is not set:
(*) Default blockdev file operations (to give error ENODEV on opening).
(*) Makes some /proc changes:
(*) /proc/devices does not list any blockdevs.
(*) /proc/diskstats and /proc/partitions are contingent on CONFIG_BLOCK.
(*) Makes some compat ioctl handling contingent on CONFIG_BLOCK.
(*) If CONFIG_BLOCK is not defined, makes sys_quotactl() return -ENODEV if
given command other than Q_SYNC or if a special device is specified.
(*) In init/do_mounts.c, no reference is made to the blockdev routines if
CONFIG_BLOCK is not defined. This does not prohibit NFS roots or JFFS2.
(*) The bdflush, ioprio_set and ioprio_get syscalls can now be absent (return
error ENOSYS by way of cond_syscall if so).
(*) The seclvl_bd_claim() and seclvl_bd_release() security calls do nothing if
CONFIG_BLOCK is not set, since they can't then happen.
Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2006-09-30 22:45:40 +04:00
# ifdef CONFIG_BLOCK
2005-04-17 02:20:36 +04:00
HANDLE_IOCTL ( SG_IO , sg_ioctl_trans )
2006-01-12 00:44:03 +03:00
HANDLE_IOCTL ( SG_GET_REQUEST_TABLE , sg_grt_trans )
[PATCH] BLOCK: Make it possible to disable the block layer [try #6]
Make it possible to disable the block layer. Not all embedded devices require
it, some can make do with just JFFS2, NFS, ramfs, etc - none of which require
the block layer to be present.
This patch does the following:
(*) Introduces CONFIG_BLOCK to disable the block layer, buffering and blockdev
support.
(*) Adds dependencies on CONFIG_BLOCK to any configuration item that controls
an item that uses the block layer. This includes:
(*) Block I/O tracing.
(*) Disk partition code.
(*) All filesystems that are block based, eg: Ext3, ReiserFS, ISOFS.
(*) The SCSI layer. As far as I can tell, even SCSI chardevs use the
block layer to do scheduling. Some drivers that use SCSI facilities -
such as USB storage - end up disabled indirectly from this.
(*) Various block-based device drivers, such as IDE and the old CDROM
drivers.
(*) MTD blockdev handling and FTL.
(*) JFFS - which uses set_bdev_super(), something it could avoid doing by
taking a leaf out of JFFS2's book.
(*) Makes most of the contents of linux/blkdev.h, linux/buffer_head.h and
linux/elevator.h contingent on CONFIG_BLOCK being set. sector_div() is,
however, still used in places, and so is still available.
(*) Also made contingent are the contents of linux/mpage.h, linux/genhd.h and
parts of linux/fs.h.
(*) Makes a number of files in fs/ contingent on CONFIG_BLOCK.
(*) Makes mm/bounce.c (bounce buffering) contingent on CONFIG_BLOCK.
(*) set_page_dirty() doesn't call __set_page_dirty_buffers() if CONFIG_BLOCK
is not enabled.
(*) fs/no-block.c is created to hold out-of-line stubs and things that are
required when CONFIG_BLOCK is not set:
(*) Default blockdev file operations (to give error ENODEV on opening).
(*) Makes some /proc changes:
(*) /proc/devices does not list any blockdevs.
(*) /proc/diskstats and /proc/partitions are contingent on CONFIG_BLOCK.
(*) Makes some compat ioctl handling contingent on CONFIG_BLOCK.
(*) If CONFIG_BLOCK is not defined, makes sys_quotactl() return -ENODEV if
given command other than Q_SYNC or if a special device is specified.
(*) In init/do_mounts.c, no reference is made to the blockdev routines if
CONFIG_BLOCK is not defined. This does not prohibit NFS roots or JFFS2.
(*) The bdflush, ioprio_set and ioprio_get syscalls can now be absent (return
error ENOSYS by way of cond_syscall if so).
(*) The seclvl_bd_claim() and seclvl_bd_release() security calls do nothing if
CONFIG_BLOCK is not set, since they can't then happen.
Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2006-09-30 22:45:40 +04:00
# endif
2005-04-17 02:20:36 +04:00
HANDLE_IOCTL ( PPPIOCGIDLE32 , ppp_ioctl_trans )
HANDLE_IOCTL ( PPPIOCSCOMPRESS32 , ppp_ioctl_trans )
HANDLE_IOCTL ( PPPIOCSPASS32 , ppp_sock_fprog_ioctl_trans )
HANDLE_IOCTL ( PPPIOCSACTIVE32 , ppp_sock_fprog_ioctl_trans )
[PATCH] BLOCK: Make it possible to disable the block layer [try #6]
Make it possible to disable the block layer. Not all embedded devices require
it, some can make do with just JFFS2, NFS, ramfs, etc - none of which require
the block layer to be present.
This patch does the following:
(*) Introduces CONFIG_BLOCK to disable the block layer, buffering and blockdev
support.
(*) Adds dependencies on CONFIG_BLOCK to any configuration item that controls
an item that uses the block layer. This includes:
(*) Block I/O tracing.
(*) Disk partition code.
(*) All filesystems that are block based, eg: Ext3, ReiserFS, ISOFS.
(*) The SCSI layer. As far as I can tell, even SCSI chardevs use the
block layer to do scheduling. Some drivers that use SCSI facilities -
such as USB storage - end up disabled indirectly from this.
(*) Various block-based device drivers, such as IDE and the old CDROM
drivers.
(*) MTD blockdev handling and FTL.
(*) JFFS - which uses set_bdev_super(), something it could avoid doing by
taking a leaf out of JFFS2's book.
(*) Makes most of the contents of linux/blkdev.h, linux/buffer_head.h and
linux/elevator.h contingent on CONFIG_BLOCK being set. sector_div() is,
however, still used in places, and so is still available.
(*) Also made contingent are the contents of linux/mpage.h, linux/genhd.h and
parts of linux/fs.h.
(*) Makes a number of files in fs/ contingent on CONFIG_BLOCK.
(*) Makes mm/bounce.c (bounce buffering) contingent on CONFIG_BLOCK.
(*) set_page_dirty() doesn't call __set_page_dirty_buffers() if CONFIG_BLOCK
is not enabled.
(*) fs/no-block.c is created to hold out-of-line stubs and things that are
required when CONFIG_BLOCK is not set:
(*) Default blockdev file operations (to give error ENODEV on opening).
(*) Makes some /proc changes:
(*) /proc/devices does not list any blockdevs.
(*) /proc/diskstats and /proc/partitions are contingent on CONFIG_BLOCK.
(*) Makes some compat ioctl handling contingent on CONFIG_BLOCK.
(*) If CONFIG_BLOCK is not defined, makes sys_quotactl() return -ENODEV if
given command other than Q_SYNC or if a special device is specified.
(*) In init/do_mounts.c, no reference is made to the blockdev routines if
CONFIG_BLOCK is not defined. This does not prohibit NFS roots or JFFS2.
(*) The bdflush, ioprio_set and ioprio_get syscalls can now be absent (return
error ENOSYS by way of cond_syscall if so).
(*) The seclvl_bd_claim() and seclvl_bd_release() security calls do nothing if
CONFIG_BLOCK is not set, since they can't then happen.
Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2006-09-30 22:45:40 +04:00
# ifdef CONFIG_BLOCK
2005-04-17 02:20:36 +04:00
HANDLE_IOCTL ( MTIOCGET32 , mt_ioctl_trans )
HANDLE_IOCTL ( MTIOCPOS32 , mt_ioctl_trans )
[PATCH] BLOCK: Make it possible to disable the block layer [try #6]
Make it possible to disable the block layer. Not all embedded devices require
it, some can make do with just JFFS2, NFS, ramfs, etc - none of which require
the block layer to be present.
This patch does the following:
(*) Introduces CONFIG_BLOCK to disable the block layer, buffering and blockdev
support.
(*) Adds dependencies on CONFIG_BLOCK to any configuration item that controls
an item that uses the block layer. This includes:
(*) Block I/O tracing.
(*) Disk partition code.
(*) All filesystems that are block based, eg: Ext3, ReiserFS, ISOFS.
(*) The SCSI layer. As far as I can tell, even SCSI chardevs use the
block layer to do scheduling. Some drivers that use SCSI facilities -
such as USB storage - end up disabled indirectly from this.
(*) Various block-based device drivers, such as IDE and the old CDROM
drivers.
(*) MTD blockdev handling and FTL.
(*) JFFS - which uses set_bdev_super(), something it could avoid doing by
taking a leaf out of JFFS2's book.
(*) Makes most of the contents of linux/blkdev.h, linux/buffer_head.h and
linux/elevator.h contingent on CONFIG_BLOCK being set. sector_div() is,
however, still used in places, and so is still available.
(*) Also made contingent are the contents of linux/mpage.h, linux/genhd.h and
parts of linux/fs.h.
(*) Makes a number of files in fs/ contingent on CONFIG_BLOCK.
(*) Makes mm/bounce.c (bounce buffering) contingent on CONFIG_BLOCK.
(*) set_page_dirty() doesn't call __set_page_dirty_buffers() if CONFIG_BLOCK
is not enabled.
(*) fs/no-block.c is created to hold out-of-line stubs and things that are
required when CONFIG_BLOCK is not set:
(*) Default blockdev file operations (to give error ENODEV on opening).
(*) Makes some /proc changes:
(*) /proc/devices does not list any blockdevs.
(*) /proc/diskstats and /proc/partitions are contingent on CONFIG_BLOCK.
(*) Makes some compat ioctl handling contingent on CONFIG_BLOCK.
(*) If CONFIG_BLOCK is not defined, makes sys_quotactl() return -ENODEV if
given command other than Q_SYNC or if a special device is specified.
(*) In init/do_mounts.c, no reference is made to the blockdev routines if
CONFIG_BLOCK is not defined. This does not prohibit NFS roots or JFFS2.
(*) The bdflush, ioprio_set and ioprio_get syscalls can now be absent (return
error ENOSYS by way of cond_syscall if so).
(*) The seclvl_bd_claim() and seclvl_bd_release() security calls do nothing if
CONFIG_BLOCK is not set, since they can't then happen.
Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2006-09-30 22:45:40 +04:00
# endif
2005-04-17 02:20:36 +04:00
# define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int)
HANDLE_IOCTL ( AUTOFS_IOC_SETTIMEOUT32 , ioc_settimeout )
# ifdef CONFIG_VT
HANDLE_IOCTL ( PIO_FONTX , do_fontx_ioctl )
HANDLE_IOCTL ( GIO_FONTX , do_fontx_ioctl )
HANDLE_IOCTL ( PIO_UNIMAP , do_unimap_ioctl )
HANDLE_IOCTL ( GIO_UNIMAP , do_unimap_ioctl )
HANDLE_IOCTL ( KDFONTOP , do_kdfontop_ioctl )
# endif
/* One SMB ioctl needs translations. */
# define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, compat_uid_t)
HANDLE_IOCTL ( SMB_IOC_GETMOUNTUID_32 , do_smb_getmountuid )
/* block stuff */
[PATCH] BLOCK: Make it possible to disable the block layer [try #6]
Make it possible to disable the block layer. Not all embedded devices require
it, some can make do with just JFFS2, NFS, ramfs, etc - none of which require
the block layer to be present.
This patch does the following:
(*) Introduces CONFIG_BLOCK to disable the block layer, buffering and blockdev
support.
(*) Adds dependencies on CONFIG_BLOCK to any configuration item that controls
an item that uses the block layer. This includes:
(*) Block I/O tracing.
(*) Disk partition code.
(*) All filesystems that are block based, eg: Ext3, ReiserFS, ISOFS.
(*) The SCSI layer. As far as I can tell, even SCSI chardevs use the
block layer to do scheduling. Some drivers that use SCSI facilities -
such as USB storage - end up disabled indirectly from this.
(*) Various block-based device drivers, such as IDE and the old CDROM
drivers.
(*) MTD blockdev handling and FTL.
(*) JFFS - which uses set_bdev_super(), something it could avoid doing by
taking a leaf out of JFFS2's book.
(*) Makes most of the contents of linux/blkdev.h, linux/buffer_head.h and
linux/elevator.h contingent on CONFIG_BLOCK being set. sector_div() is,
however, still used in places, and so is still available.
(*) Also made contingent are the contents of linux/mpage.h, linux/genhd.h and
parts of linux/fs.h.
(*) Makes a number of files in fs/ contingent on CONFIG_BLOCK.
(*) Makes mm/bounce.c (bounce buffering) contingent on CONFIG_BLOCK.
(*) set_page_dirty() doesn't call __set_page_dirty_buffers() if CONFIG_BLOCK
is not enabled.
(*) fs/no-block.c is created to hold out-of-line stubs and things that are
required when CONFIG_BLOCK is not set:
(*) Default blockdev file operations (to give error ENODEV on opening).
(*) Makes some /proc changes:
(*) /proc/devices does not list any blockdevs.
(*) /proc/diskstats and /proc/partitions are contingent on CONFIG_BLOCK.
(*) Makes some compat ioctl handling contingent on CONFIG_BLOCK.
(*) If CONFIG_BLOCK is not defined, makes sys_quotactl() return -ENODEV if
given command other than Q_SYNC or if a special device is specified.
(*) In init/do_mounts.c, no reference is made to the blockdev routines if
CONFIG_BLOCK is not defined. This does not prohibit NFS roots or JFFS2.
(*) The bdflush, ioprio_set and ioprio_get syscalls can now be absent (return
error ENOSYS by way of cond_syscall if so).
(*) The seclvl_bd_claim() and seclvl_bd_release() security calls do nothing if
CONFIG_BLOCK is not set, since they can't then happen.
Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2006-09-30 22:45:40 +04:00
# ifdef CONFIG_BLOCK
2009-04-20 12:23:02 +04:00
/* loop */
IGNORE_IOCTL ( LOOP_CLR_FD )
2005-04-17 02:20:36 +04:00
/* Raw devices */
HANDLE_IOCTL ( RAW_SETBIND , raw_ioctl )
HANDLE_IOCTL ( RAW_GETBIND , raw_ioctl )
[PATCH] BLOCK: Make it possible to disable the block layer [try #6]
Make it possible to disable the block layer. Not all embedded devices require
it, some can make do with just JFFS2, NFS, ramfs, etc - none of which require
the block layer to be present.
This patch does the following:
(*) Introduces CONFIG_BLOCK to disable the block layer, buffering and blockdev
support.
(*) Adds dependencies on CONFIG_BLOCK to any configuration item that controls
an item that uses the block layer. This includes:
(*) Block I/O tracing.
(*) Disk partition code.
(*) All filesystems that are block based, eg: Ext3, ReiserFS, ISOFS.
(*) The SCSI layer. As far as I can tell, even SCSI chardevs use the
block layer to do scheduling. Some drivers that use SCSI facilities -
such as USB storage - end up disabled indirectly from this.
(*) Various block-based device drivers, such as IDE and the old CDROM
drivers.
(*) MTD blockdev handling and FTL.
(*) JFFS - which uses set_bdev_super(), something it could avoid doing by
taking a leaf out of JFFS2's book.
(*) Makes most of the contents of linux/blkdev.h, linux/buffer_head.h and
linux/elevator.h contingent on CONFIG_BLOCK being set. sector_div() is,
however, still used in places, and so is still available.
(*) Also made contingent are the contents of linux/mpage.h, linux/genhd.h and
parts of linux/fs.h.
(*) Makes a number of files in fs/ contingent on CONFIG_BLOCK.
(*) Makes mm/bounce.c (bounce buffering) contingent on CONFIG_BLOCK.
(*) set_page_dirty() doesn't call __set_page_dirty_buffers() if CONFIG_BLOCK
is not enabled.
(*) fs/no-block.c is created to hold out-of-line stubs and things that are
required when CONFIG_BLOCK is not set:
(*) Default blockdev file operations (to give error ENODEV on opening).
(*) Makes some /proc changes:
(*) /proc/devices does not list any blockdevs.
(*) /proc/diskstats and /proc/partitions are contingent on CONFIG_BLOCK.
(*) Makes some compat ioctl handling contingent on CONFIG_BLOCK.
(*) If CONFIG_BLOCK is not defined, makes sys_quotactl() return -ENODEV if
given command other than Q_SYNC or if a special device is specified.
(*) In init/do_mounts.c, no reference is made to the blockdev routines if
CONFIG_BLOCK is not defined. This does not prohibit NFS roots or JFFS2.
(*) The bdflush, ioprio_set and ioprio_get syscalls can now be absent (return
error ENOSYS by way of cond_syscall if so).
(*) The seclvl_bd_claim() and seclvl_bd_release() security calls do nothing if
CONFIG_BLOCK is not set, since they can't then happen.
Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2006-09-30 22:45:40 +04:00
# endif
2005-04-17 02:20:36 +04:00
/* Serial */
HANDLE_IOCTL ( TIOCGSERIAL , serial_struct_ioctl )
HANDLE_IOCTL ( TIOCSSERIAL , serial_struct_ioctl )
2005-10-31 02:01:41 +03:00
# ifdef TIOCGLTC
COMPATIBLE_IOCTL ( TIOCGLTC )
COMPATIBLE_IOCTL ( TIOCSLTC )
# endif
2005-11-09 08:35:07 +03:00
# ifdef TIOCSTART
/*
2009-12-04 23:47:01 +03:00
* For these two we have definitions in ioctls . h and / or termios . h on
2005-11-09 08:35:07 +03:00
* some architectures but no actual implemention . Some applications
* like bash call them if they are defined in the headers , so we provide
* entries here to avoid syslog message spew .
*/
COMPATIBLE_IOCTL ( TIOCSTART )
COMPATIBLE_IOCTL ( TIOCSTOP )
# endif
2005-04-17 02:20:36 +04:00
/* Usbdevfs */
HANDLE_IOCTL ( USBDEVFS_CONTROL32 , do_usbdevfs_control )
HANDLE_IOCTL ( USBDEVFS_BULK32 , do_usbdevfs_bulk )
HANDLE_IOCTL ( USBDEVFS_DISCSIGNAL32 , do_usbdevfs_discsignal )
[PATCH] usb: Patch for USBDEVFS_IOCTL from 32-bit programs
Dell supplied me with the following test:
#include<stdio.h>
#include<errno.h>
#include<sys/ioctl.h>
#include<fcntl.h>
#include<linux/usbdevice_fs.h>
main(int argc,char*argv[])
{
struct usbdevfs_hub_portinfo hubPortInfo = {0};
struct usbdevfs_ioctl command = {0};
command.ifno = 0;
command.ioctl_code = USBDEVFS_HUB_PORTINFO;
command.data = (void*)&hubPortInfo;
int fd, ret;
if(argc != 2) {
fprintf(stderr,"Usage: %s /proc/bus/usb/<BusNo>/<HubID>\n",argv[0]);
fprintf(stderr,"Example: %s /proc/bus/usb/001/001\n",argv[0]);
exit(1);
}
errno = 0;
fd = open(argv[1],O_RDWR);
if(fd < 0) {
perror("open failed:");
exit(errno);
}
errno = 0;
ret = ioctl(fd,USBDEVFS_IOCTL,&command);
printf("IOCTL return status:%d\n",ret);
if(ret<0) {
perror("IOCTL failed:");
close(fd);
exit(3);
} else {
printf("IOCTL passed:Num of ports %d\n",hubPortInfo.nports);
close(fd);
exit(0);
}
return 0;
}
I have verified that it breaks if built in 32 bit mode on x86_64 and that
the patch below fixes it.
Signed-off-by: Pete Zaitcev <zaitcev@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2005-10-18 05:15:54 +04:00
COMPATIBLE_IOCTL ( USBDEVFS_IOCTL32 )
2005-04-17 02:20:36 +04:00
/* i2c */
HANDLE_IOCTL ( I2C_FUNCS , w_long )
HANDLE_IOCTL ( I2C_RDWR , do_i2c_rdwr_ioctl )
HANDLE_IOCTL ( I2C_SMBUS , do_i2c_smbus_ioctl )
2007-05-02 21:27:20 +04:00
/* Not implemented in the native kernel */
2006-01-10 07:52:11 +03:00
HANDLE_IOCTL ( RTC_IRQP_READ32 , rtc_ioctl )
HANDLE_IOCTL ( RTC_IRQP_SET32 , rtc_ioctl )
HANDLE_IOCTL ( RTC_EPOCH_READ32 , rtc_ioctl )
HANDLE_IOCTL ( RTC_EPOCH_SET32 , rtc_ioctl )
2005-04-17 02:20:36 +04:00
2005-11-16 11:52:57 +03:00
/* dvb */
HANDLE_IOCTL ( VIDEO_GET_EVENT , do_video_get_event )
HANDLE_IOCTL ( VIDEO_STILLPICTURE , do_video_stillpicture )
HANDLE_IOCTL ( VIDEO_SET_SPU_PALETTE , do_video_set_spu_palette )
2006-01-12 12:05:26 +03:00
/* parport */
COMPATIBLE_IOCTL ( LPTIME )
COMPATIBLE_IOCTL ( LPCHAR )
COMPATIBLE_IOCTL ( LPABORTOPEN )
COMPATIBLE_IOCTL ( LPCAREFUL )
COMPATIBLE_IOCTL ( LPWAIT )
COMPATIBLE_IOCTL ( LPSETIRQ )
COMPATIBLE_IOCTL ( LPGETSTATUS )
COMPATIBLE_IOCTL ( LPGETSTATUS )
COMPATIBLE_IOCTL ( LPRESET )
/*LPGETSTATS not implemented, but no kernels seem to compile it in anyways*/
COMPATIBLE_IOCTL ( LPGETFLAGS )
HANDLE_IOCTL ( LPSETTIMEOUT , lp_timeout_trans )
2007-05-02 21:27:21 +04:00
/* fat 'r' ioctls. These are handled by fat with ->compat_ioctl,
but we don ' t want warnings on other file systems . So declare
them as compatible here . */
# define VFAT_IOCTL_READDIR_BOTH32 _IOR('r', 1, struct compat_dirent[2])
# define VFAT_IOCTL_READDIR_SHORT32 _IOR('r', 2, struct compat_dirent[2])
IGNORE_IOCTL ( VFAT_IOCTL_READDIR_BOTH32 )
IGNORE_IOCTL ( VFAT_IOCTL_READDIR_SHORT32 )
2007-07-16 10:42:01 +04:00
2007-07-29 11:50:42 +04:00
# ifdef CONFIG_SPARC
/* Sparc framebuffers, handled in sbusfb_compat_ioctl() */
IGNORE_IOCTL ( FBIOGTYPE )
IGNORE_IOCTL ( FBIOSATTR )
IGNORE_IOCTL ( FBIOGATTR )
IGNORE_IOCTL ( FBIOSVIDEO )
IGNORE_IOCTL ( FBIOGVIDEO )
IGNORE_IOCTL ( FBIOSCURPOS )
IGNORE_IOCTL ( FBIOGCURPOS )
IGNORE_IOCTL ( FBIOGCURMAX )
IGNORE_IOCTL ( FBIOPUTCMAP32 )
IGNORE_IOCTL ( FBIOGETCMAP32 )
IGNORE_IOCTL ( FBIOSCURSOR32 )
IGNORE_IOCTL ( FBIOGCURSOR32 )
# endif
2006-01-10 07:52:14 +03:00
} ;
2005-11-16 11:52:57 +03:00
2007-05-08 11:29:21 +04:00
# define IOCTL_HASHSIZE 256
static struct ioctl_trans * ioctl32_hash_table [ IOCTL_HASHSIZE ] ;
static inline unsigned long ioctl32_hash ( unsigned long cmd )
{
return ( ( ( cmd > > 6 ) ^ ( cmd > > 4 ) ^ cmd ) ) % IOCTL_HASHSIZE ;
}
static void compat_ioctl_error ( struct file * filp , unsigned int fd ,
unsigned int cmd , unsigned long arg )
{
char buf [ 10 ] ;
char * fn = " ? " ;
char * path ;
/* find the name of the device. */
path = ( char * ) __get_free_page ( GFP_KERNEL ) ;
if ( path ) {
2008-02-15 06:38:44 +03:00
fn = d_path ( & filp - > f_path , path , PAGE_SIZE ) ;
2007-05-08 11:29:21 +04:00
if ( IS_ERR ( fn ) )
fn = " ? " ;
}
sprintf ( buf , " '%c' " , ( cmd > > _IOC_TYPESHIFT ) & _IOC_TYPEMASK ) ;
if ( ! isprint ( buf [ 1 ] ) )
sprintf ( buf , " %02x " , buf [ 1 ] ) ;
compat_printk ( " ioctl32(%s:%d): Unknown cmd fd(%d) "
" cmd(%08x){t:%s;sz:%u} arg(%08x) on %s \n " ,
current - > comm , current - > pid ,
( int ) fd , ( unsigned int ) cmd , buf ,
( cmd > > _IOC_SIZESHIFT ) & _IOC_SIZEMASK ,
( unsigned int ) arg , fn ) ;
if ( path )
free_page ( ( unsigned long ) path ) ;
}
asmlinkage long compat_sys_ioctl ( unsigned int fd , unsigned int cmd ,
unsigned long arg )
{
struct file * filp ;
int error = - EBADF ;
struct ioctl_trans * t ;
int fput_needed ;
filp = fget_light ( fd , & fput_needed ) ;
if ( ! filp )
goto out ;
/* RED-PEN how should LSM module know it's handling 32bit? */
error = security_file_ioctl ( filp , cmd , arg ) ;
if ( error )
goto out_fput ;
/*
* To allow the compat_ioctl handlers to be self contained
* we need to check the common ioctls here first .
* Just handle them with the standard handlers below .
*/
switch ( cmd ) {
case FIOCLEX :
case FIONCLEX :
case FIONBIO :
case FIOASYNC :
case FIOQSIZE :
break ;
2009-06-19 22:28:07 +04:00
# if defined(CONFIG_IA64) || defined(CONFIG_X86_64)
case FS_IOC_RESVSP_32 :
case FS_IOC_RESVSP64_32 :
error = compat_ioctl_preallocate ( filp , arg ) ;
goto out_fput ;
# else
case FS_IOC_RESVSP :
case FS_IOC_RESVSP64 :
2009-11-12 01:26:34 +03:00
error = ioctl_preallocate ( filp , compat_ptr ( arg ) ) ;
2009-06-19 22:28:07 +04:00
goto out_fput ;
# endif
2007-05-08 11:29:21 +04:00
case FIBMAP :
case FIGETBSZ :
case FIONREAD :
if ( S_ISREG ( filp - > f_path . dentry - > d_inode - > i_mode ) )
break ;
/*FALL THROUGH*/
default :
if ( filp - > f_op & & filp - > f_op - > compat_ioctl ) {
error = filp - > f_op - > compat_ioctl ( filp , cmd , arg ) ;
if ( error ! = - ENOIOCTLCMD )
goto out_fput ;
}
if ( ! filp - > f_op | |
( ! filp - > f_op - > ioctl & & ! filp - > f_op - > unlocked_ioctl ) )
goto do_ioctl ;
break ;
}
for ( t = ioctl32_hash_table [ ioctl32_hash ( cmd ) ] ; t ; t = t - > next ) {
if ( t - > cmd = = cmd )
goto found_handler ;
}
2007-05-10 22:51:11 +04:00
{
2007-05-08 11:29:21 +04:00
static int count ;
if ( + + count < = 50 )
compat_ioctl_error ( filp , fd , cmd , arg ) ;
error = - EINVAL ;
}
goto out_fput ;
found_handler :
if ( t - > handler ) {
lock_kernel ( ) ;
error = t - > handler ( fd , cmd , arg , filp ) ;
unlock_kernel ( ) ;
goto out_fput ;
}
do_ioctl :
2008-02-07 11:13:25 +03:00
error = do_vfs_ioctl ( filp , fd , cmd , arg ) ;
2007-05-08 11:29:21 +04:00
out_fput :
fput_light ( filp , fput_needed ) ;
out :
return error ;
}
static void ioctl32_insert_translation ( struct ioctl_trans * trans )
{
unsigned long hash ;
struct ioctl_trans * t ;
hash = ioctl32_hash ( trans - > cmd ) ;
if ( ! ioctl32_hash_table [ hash ] )
ioctl32_hash_table [ hash ] = trans ;
else {
t = ioctl32_hash_table [ hash ] ;
while ( t - > next )
t = t - > next ;
trans - > next = NULL ;
t - > next = trans ;
}
}
static int __init init_sys32_ioctl ( void )
{
int i ;
for ( i = 0 ; i < ARRAY_SIZE ( ioctl_start ) ; i + + ) {
2007-10-18 14:07:05 +04:00
if ( ioctl_start [ i ] . next ) {
2007-05-08 11:29:21 +04:00
printk ( " ioctl translation %d bad \n " , i ) ;
return - 1 ;
}
ioctl32_insert_translation ( & ioctl_start [ i ] ) ;
}
return 0 ;
}
__initcall ( init_sys32_ioctl ) ;