Blame view

fs/compat_ioctl.c 49.1 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
  /*
   * ioctl32.c: Conversion between 32bit and 64bit 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 32bit and 64bit
   * ioctls.
   */
3fee37c1e   Akos Maroy   fix: using joysti...
12
  #include <linux/joystick.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
14
15
  #include <linux/types.h>
  #include <linux/compat.h>
  #include <linux/kernel.h>
16f7e0fe2   Randy Dunlap   [PATCH] capable/c...
16
  #include <linux/capability.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
18
19
  #include <linux/compiler.h>
  #include <linux/sched.h>
  #include <linux/smp.h>
405f55712   Alexey Dobriyan   headers: smp_lock...
20
  #include <linux/smp_lock.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
23
  #include <linux/ioctl.h>
  #include <linux/if.h>
  #include <linux/if_bridge.h>
bff61975b   NeilBrown   md: move lots of ...
24
  #include <linux/raid/md_u.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
  #include <linux/kd.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
28
29
30
31
  #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>
3e63cbb1e   Ankit Jain   fs: Add new pre-a...
32
  #include <linux/falloc.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
34
  #include <linux/fs.h>
  #include <linux/file.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
36
37
38
  #include <linux/ppp_defs.h>
  #include <linux/if_ppp.h>
  #include <linux/if_pppox.h>
  #include <linux/mtio.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
40
  #include <linux/auto_fs.h>
  #include <linux/auto_fs4.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
42
43
  #include <linux/tty.h>
  #include <linux/vt_kern.h>
  #include <linux/fb.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
45
46
47
  #include <linux/videodev.h>
  #include <linux/netdevice.h>
  #include <linux/raw.h>
  #include <linux/smb_fs.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
49
50
51
52
53
  #include <linux/blkdev.h>
  #include <linux/elevator.h>
  #include <linux/rtc.h>
  #include <linux/pci.h>
  #include <linux/module.h>
  #include <linux/serial.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
  #include <linux/if_tun.h>
  #include <linux/ctype.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
  #include <linux/syscalls.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
58
  #include <linux/i2c.h>
  #include <linux/i2c-dev.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
  #include <linux/atalk.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
60
  #include <linux/gfp.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
63
64
65
66
  #include <net/bluetooth/bluetooth.h>
  #include <net/bluetooth/hci.h>
  #include <net/bluetooth/rfcomm.h>
  
  #include <linux/capi.h>
5024ad4af   Hansjoerg Lipp   [PATCH] i4l: Giga...
67
  #include <linux/gigaset_dev.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68

3c3622dcb   Randy Dunlap   Fix compile issue...
69
  #ifdef CONFIG_BLOCK
1ba0c7dbb   Alexander Beregalov   fs/compat_ioctl: ...
70
  #include <linux/loop.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
  #include <scsi/scsi.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
72
  #include <scsi/scsi_ioctl.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
  #include <scsi/sg.h>
3c3622dcb   Randy Dunlap   Fix compile issue...
74
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
75

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
77
78
79
80
  #include <asm/uaccess.h>
  #include <linux/ethtool.h>
  #include <linux/mii.h>
  #include <linux/if_bonding.h>
  #include <linux/watchdog.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
  #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>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
97
98
99
100
101
102
  
  #include <linux/usb.h>
  #include <linux/usbdevice_fs.h>
  #include <linux/nbd.h>
  #include <linux/random.h>
  #include <linux/filter.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
103
104
  
  #include <linux/hiddev.h>
6e87abd0b   David S. Miller   [DVB]: Add compat...
105
106
107
108
  #include <linux/dvb/audio.h>
  #include <linux/dvb/dmx.h>
  #include <linux/dvb/frontend.h>
  #include <linux/dvb/video.h>
661f627da   Arnd Bergmann   compat_ioctl: sim...
109
  #include <linux/sort.h>
8163904e6   David S. Miller   [SPARC]: Mark SBU...
110
111
112
  #ifdef CONFIG_SPARC
  #include <asm/fbio.h>
  #endif
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
113
114
  static int w_long(unsigned int fd, unsigned int cmd,
  		compat_ulong_t __user *argp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115
116
117
118
  {
  	mm_segment_t old_fs = get_fs();
  	int err;
  	unsigned long val;
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
119

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
120
121
122
  	set_fs (KERNEL_DS);
  	err = sys_ioctl(fd, cmd, (unsigned long)&val);
  	set_fs (old_fs);
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
123
  	if (!err && put_user(val, argp))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
124
125
126
  		return -EFAULT;
  	return err;
  }
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
127
128
129
  
  static int rw_long(unsigned int fd, unsigned int cmd,
  		compat_ulong_t __user *argp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130
131
  {
  	mm_segment_t old_fs = get_fs();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
132
133
  	int err;
  	unsigned long val;
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
134
135
  
  	if(get_user(val, argp))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
136
137
138
139
  		return -EFAULT;
  	set_fs (KERNEL_DS);
  	err = sys_ioctl(fd, cmd, (unsigned long)&val);
  	set_fs (old_fs);
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
140
  	if (!err && put_user(val, argp))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
142
143
  		return -EFAULT;
  	return err;
  }
6e87abd0b   David S. Miller   [DVB]: Add compat...
144
145
146
147
148
149
150
151
  struct compat_video_event {
  	int32_t		type;
  	compat_time_t	timestamp;
  	union {
  	        video_size_t size;
  		unsigned int frame_rate;
  	} u;
  };
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
152
153
  static int do_video_get_event(unsigned int fd, unsigned int cmd,
  		struct compat_video_event __user *up)
6e87abd0b   David S. Miller   [DVB]: Add compat...
154
155
156
157
158
159
160
161
162
163
  {
  	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) {
6e87abd0b   David S. Miller   [DVB]: Add compat...
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
  		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;
  };
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
181
182
  static int do_video_stillpicture(unsigned int fd, unsigned int cmd,
  	struct compat_video_still_picture __user *up)
6e87abd0b   David S. Miller   [DVB]: Add compat...
183
  {
6e87abd0b   David S. Miller   [DVB]: Add compat...
184
185
186
187
  	struct video_still_picture __user *up_native;
  	compat_uptr_t fp;
  	int32_t size;
  	int err;
6e87abd0b   David S. Miller   [DVB]: Add compat...
188
189
190
191
192
193
194
  	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));
7116e994b   Heiko Carstens   [PATCH] compat: f...
195
196
197
198
  	err =  put_user(compat_ptr(fp), &up_native->iFrame);
  	err |= put_user(size, &up_native->size);
  	if (err)
  		return -EFAULT;
6e87abd0b   David S. Miller   [DVB]: Add compat...
199
200
201
202
203
204
205
206
207
208
  
  	err = sys_ioctl(fd, cmd, (unsigned long) up_native);
  
  	return err;
  }
  
  struct compat_video_spu_palette {
  	int length;
  	compat_uptr_t palette;
  };
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
209
210
  static int do_video_set_spu_palette(unsigned int fd, unsigned int cmd,
  		struct compat_video_spu_palette __user *up)
6e87abd0b   David S. Miller   [DVB]: Add compat...
211
  {
6e87abd0b   David S. Miller   [DVB]: Add compat...
212
213
214
  	struct video_spu_palette __user *up_native;
  	compat_uptr_t palp;
  	int length, err;
6e87abd0b   David S. Miller   [DVB]: Add compat...
215
216
217
218
  	err  = get_user(palp, &up->palette);
  	err |= get_user(length, &up->length);
  
  	up_native = compat_alloc_user_space(sizeof(struct video_spu_palette));
7116e994b   Heiko Carstens   [PATCH] compat: f...
219
220
221
222
  	err  = put_user(compat_ptr(palp), &up_native->palette);
  	err |= put_user(length, &up_native->length);
  	if (err)
  		return -EFAULT;
6e87abd0b   David S. Miller   [DVB]: Add compat...
223
224
225
226
227
  
  	err = sys_ioctl(fd, cmd, (unsigned long) up_native);
  
  	return err;
  }
9361401eb   David Howells   [PATCH] BLOCK: Ma...
228
  #ifdef CONFIG_BLOCK
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
  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;
  }
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
280
281
  static int sg_ioctl_trans(unsigned int fd, unsigned int cmd,
  			sg_io_hdr32_t __user *sgio32)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
282
283
  {
  	sg_io_hdr_t __user *sgio;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
284
285
286
287
  	u16 iovec_count;
  	u32 data;
  	void __user *dxferp;
  	int err;
84eb8fb42   FUJITA Tomonori   [SCSI] compat_ioc...
288
289
290
291
292
293
  	int interface_id;
  
  	if (get_user(interface_id, &sgio32->interface_id))
  		return -EFAULT;
  	if (interface_id != 'S')
  		return sys_ioctl(fd, cmd, (unsigned long)sgio32);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
  	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;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
  	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;
  }
2966387b4   Andi Kleen   [PATCH] x86_64: I...
371
372
373
374
375
376
377
378
379
380
  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;
  };
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
381
382
  static int sg_grt_trans(unsigned int fd, unsigned int cmd, struct
  			compat_sg_req_info __user *o)
2966387b4   Andi Kleen   [PATCH] x86_64: I...
383
384
  {
  	int err, i;
6b2b4e5a2   Al Viro   [PATCH] compat_io...
385
  	sg_req_info_t __user *r;
2966387b4   Andi Kleen   [PATCH] x86_64: I...
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
  	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;
  }
9361401eb   David Howells   [PATCH] BLOCK: Ma...
403
  #endif /* CONFIG_BLOCK */
2966387b4   Andi Kleen   [PATCH] x86_64: I...
404

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
405
406
407
408
409
410
411
  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)
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
412
413
  static int ppp_sock_fprog_ioctl_trans(unsigned int fd, unsigned int cmd,
  			struct sock_fprog32 __user *u_fprog32)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
414
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
  	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)
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
450
451
  static int ppp_gidle(unsigned int fd, unsigned int cmd,
  		struct ppp_idle32 __user *idle32)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
452
453
  {
  	struct ppp_idle __user *idle;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
454
455
456
457
  	__kernel_time_t xmit, recv;
  	int err;
  
  	idle = compat_alloc_user_space(sizeof(*idle));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
458
459
460
461
462
463
464
465
466
467
468
469
  
  	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;
  }
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
470
471
  static int ppp_scompress(unsigned int fd, unsigned int cmd,
  	struct ppp_option_data32 __user *odata32)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
472
473
  {
  	struct ppp_option_data __user *odata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
474
475
476
477
  	__u32 data;
  	void __user *datap;
  
  	odata = compat_alloc_user_space(sizeof(*odata));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
478
479
480
481
482
483
484
485
486
487
488
489
490
491
  
  	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);
  }
9361401eb   David Howells   [PATCH] BLOCK: Ma...
492
  #ifdef CONFIG_BLOCK
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
  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)
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
508
  static int mt_ioctl_trans(unsigned int fd, unsigned int cmd, void __user *argp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
  {
  	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;
45bf5cd7b   Andrew Morton   fs/compat_ioctl.c...
524
  	default:	/* MTIOCGET32 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
525
526
527
  		kcmd = MTIOCGET;
  		karg = &get;
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
528
529
530
531
532
533
534
535
  	}
  	set_fs (KERNEL_DS);
  	err = sys_ioctl (fd, kcmd, (unsigned long)karg);
  	set_fs (old_fs);
  	if (err)
  		return err;
  	switch (cmd) {
  	case MTIOCPOS32:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
536
  		upos32 = argp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
537
538
539
  		err = __put_user(pos.mt_blkno, &upos32->mt_blkno);
  		break;
  	case MTIOCGET32:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
540
  		umget32 = argp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
541
542
543
544
545
546
547
548
549
550
551
  		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;
  }
9361401eb   David Howells   [PATCH] BLOCK: Ma...
552
  #endif /* CONFIG_BLOCK */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
553

43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
554
555
  static int do_smb_getmountuid(unsigned int fd, unsigned int cmd,
  			compat_uid_t __user *argp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
556
557
558
559
560
561
562
563
564
565
566
567
  {
  	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)
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
568
  		err = put_user(kuid, argp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
569
570
571
  
  	return err;
  }
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
572
573
  static int ioc_settimeout(unsigned int fd, unsigned int cmd,
  		compat_ulong_t __user *argp)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
574
  {
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
575
  	return rw_long(fd, AUTOFS_IOC_SETTIMEOUT, argp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
576
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
  /* 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)
9361401eb   David Howells   [PATCH] BLOCK: Ma...
595
  #ifdef CONFIG_BLOCK
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
  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;
  }
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
630
631
  static int raw_ioctl(unsigned fd, unsigned cmd,
  		struct raw32_config_request __user *user_req)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
632
633
634
635
636
  {
          int ret;
  
          switch (cmd) {
          case RAW_SETBIND:
45bf5cd7b   Andrew Morton   fs/compat_ioctl.c...
637
  	default: {	/* RAW_GETBIND */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
638
                  struct raw_config_request req;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
639
640
641
642
643
644
645
646
647
648
649
650
651
652
                  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;
          }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
653
654
655
          }
          return ret;
  }
9361401eb   David Howells   [PATCH] BLOCK: Ma...
656
  #endif /* CONFIG_BLOCK */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
  
  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];
  };
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
679
680
  static int serial_struct_ioctl(unsigned fd, unsigned cmd,
  			struct serial_struct32 __user *ss32)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
681
682
683
  {
          typedef struct serial_struct SS;
          typedef struct serial_struct32 SS32;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
684
685
686
687
          int err;
          struct serial_struct ss;
          mm_segment_t oldseg = get_fs();
          __u32 udata;
7116e994b   Heiko Carstens   [PATCH] compat: f...
688
  	unsigned int base;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
689
690
691
692
693
694
  
          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;
7116e994b   Heiko Carstens   [PATCH] compat: f...
695
696
                  if (__get_user(udata, &ss32->iomem_base))
  			return -EFAULT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
697
                  ss.iomem_base = compat_ptr(udata);
7116e994b   Heiko Carstens   [PATCH] compat: f...
698
699
700
                  if (__get_user(ss.iomem_reg_shift, &ss32->iomem_reg_shift) ||
  		    __get_user(ss.port_high, &ss32->port_high))
  			return -EFAULT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
701
702
703
704
705
706
707
708
709
710
                  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;
7116e994b   Heiko Carstens   [PATCH] compat: f...
711
712
713
714
715
716
  		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;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
717
718
719
          }
          return err;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
  /*
   * 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];
  };
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
747
748
  static int do_i2c_rdwr_ioctl(unsigned int fd, unsigned int cmd,
  			struct i2c_rdwr_ioctl_data32    __user *udata)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
749
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
  	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);
  }
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
782
783
  static int do_i2c_smbus_ioctl(unsigned int fd, unsigned int cmd,
  			struct i2c_smbus_ioctl_data32   __user *udata)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
784
785
  {
  	struct i2c_smbus_ioctl_data	__user *tdata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
786
787
788
789
790
791
792
  	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;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
793
794
795
796
797
798
799
800
801
802
803
804
805
  	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);
  }
ec3cad969   Christoph Hellwig   [PATCH] move rtc ...
806
807
808
809
  #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)
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
810
  static int rtc_ioctl(unsigned fd, unsigned cmd, void __user *argp)
ec3cad969   Christoph Hellwig   [PATCH] move rtc ...
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
  {
  	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;
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
828
  		return put_user(val32, (unsigned int __user *)argp);
ec3cad969   Christoph Hellwig   [PATCH] move rtc ...
829
  	case RTC_IRQP_SET32:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
830
  		return sys_ioctl(fd, RTC_IRQP_SET, (unsigned long)argp);
ec3cad969   Christoph Hellwig   [PATCH] move rtc ...
831
  	case RTC_EPOCH_SET32:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
832
  		return sys_ioctl(fd, RTC_EPOCH_SET, (unsigned long)argp);
ec3cad969   Christoph Hellwig   [PATCH] move rtc ...
833
  	}
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
834
835
  
  	return -ENOIOCTLCMD;
ec3cad969   Christoph Hellwig   [PATCH] move rtc ...
836
  }
3e63cbb1e   Ankit Jain   fs: Add new pre-a...
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
  /* 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 */
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
854
855
  static int compat_ioctl_preallocate(struct file *file,
  			struct space_resv_32    __user *p32)
3e63cbb1e   Ankit Jain   fs: Add new pre-a...
856
  {
3e63cbb1e   Ankit Jain   fs: Add new pre-a...
857
858
859
860
861
862
863
864
865
866
867
868
869
870
  	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
661f627da   Arnd Bergmann   compat_ioctl: sim...
871
872
873
874
875
  /*
   * simple reversible transform to make our table more evenly
   * distributed after sorting.
   */
  #define XFORM(i) (((i) ^ ((i) << 27) ^ ((i) << 17)) & 0xffffffff)
6272e2667   Christoph Hellwig   cleanup compat io...
876

661f627da   Arnd Bergmann   compat_ioctl: sim...
877
  #define COMPATIBLE_IOCTL(cmd) XFORM(cmd),
421f02810   Andi Kleen   [PATCH] x86-64: D...
878
879
880
881
882
883
884
885
  /* 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)
e6a6d2efc   Christoph Hellwig   [PATCH] sanitize ...
886

661f627da   Arnd Bergmann   compat_ioctl: sim...
887
  static unsigned int ioctl_pointer[] = {
644fd4f5d   Christoph Hellwig   merge compat_ioct...
888
889
890
891
892
893
894
895
896
897
  /* 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)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
898
899
900
901
902
903
904
905
906
  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)
4cfbafd33   Andreas Schwab   compat_ioctl: add...
907
  COMPATIBLE_IOCTL(TIOCGSID)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
  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)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
929
930
931
  COMPATIBLE_IOCTL(TIOCGPTN)
  COMPATIBLE_IOCTL(TIOCSPTLCK)
  COMPATIBLE_IOCTL(TIOCSERGETLSR)
81257def2   Heiko Carstens   tty: add the new ...
932
933
934
935
936
937
  #ifdef TCGETS2
  COMPATIBLE_IOCTL(TCGETS2)
  COMPATIBLE_IOCTL(TCSETS2)
  COMPATIBLE_IOCTL(TCSETSW2)
  COMPATIBLE_IOCTL(TCSETSF2)
  #endif
644fd4f5d   Christoph Hellwig   merge compat_ioct...
938
939
940
941
942
943
  /* Little f */
  COMPATIBLE_IOCTL(FIOCLEX)
  COMPATIBLE_IOCTL(FIONCLEX)
  COMPATIBLE_IOCTL(FIOASYNC)
  COMPATIBLE_IOCTL(FIONBIO)
  COMPATIBLE_IOCTL(FIONREAD)  /* This is also TIOCINQ */
69130c7cf   Eric Sandeen   compat_ioctl: hoo...
944
  COMPATIBLE_IOCTL(FS_IOC_FIEMAP)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
945
946
947
  /* 0x00 */
  COMPATIBLE_IOCTL(FIBMAP)
  COMPATIBLE_IOCTL(FIGETBSZ)
5cf8cf414   Christoph Hellwig   Fix FREEZE/THAW c...
948
949
950
  /* 'X' - originally XFS but some now in the VFS */
  COMPATIBLE_IOCTL(FIFREEZE)
  COMPATIBLE_IOCTL(FITHAW)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
951
952
  COMPATIBLE_IOCTL(KDGETKEYCODE)
  COMPATIBLE_IOCTL(KDSETKEYCODE)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
953
  COMPATIBLE_IOCTL(KDGKBTYPE)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
954
  COMPATIBLE_IOCTL(KDGETMODE)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
955
  COMPATIBLE_IOCTL(KDGKBMODE)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
956
957
958
959
960
961
962
963
964
  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)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
965
  COMPATIBLE_IOCTL(KDGETLED)
3c3622dcb   Randy Dunlap   Fix compile issue...
966
  #ifdef CONFIG_BLOCK
644fd4f5d   Christoph Hellwig   merge compat_ioct...
967
968
969
970
971
972
973
974
975
  /* 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)
3c3622dcb   Randy Dunlap   Fix compile issue...
976
  #endif
3f0017112   Atsushi Nemoto   compat_ioctl: Sup...
977
978
979
  /* Big V (don't complain on serial console) */
  IGNORE_IOCTL(VT_OPENQRY)
  IGNORE_IOCTL(VT_GETMODE)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
  /* 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)
3c3622dcb   Randy Dunlap   Fix compile issue...
1007
  #ifdef CONFIG_BLOCK
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1008
1009
  /* loop */
  IGNORE_IOCTL(LOOP_CLR_FD)
f79f11852   Arnd Bergmann   compat_ioctl: ign...
1010
1011
  /* md calls this on random blockdevs */
  IGNORE_IOCTL(RAID_VERSION)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
1012
1013
1014
1015
  /* SG stuff */
  COMPATIBLE_IOCTL(SG_SET_TIMEOUT)
  COMPATIBLE_IOCTL(SG_GET_TIMEOUT)
  COMPATIBLE_IOCTL(SG_EMULATED_HOST)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
  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)
3c3622dcb   Randy Dunlap   Fix compile issue...
1035
  #endif
644fd4f5d   Christoph Hellwig   merge compat_ioct...
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
  /* 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)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
  /* 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)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
  /* 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 */
644fd4f5d   Christoph Hellwig   merge compat_ioct...
1248
1249
1250
1251
1252
  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)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
1253
1254
1255
1256
1257
1258
  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)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
  /* 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)
40be492fe   Marcel Holtmann   [Bluetooth] Expor...
1284
  COMPATIBLE_IOCTL(HCIGETAUTHINFO)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
  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)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
1340
  /* NBD */
644fd4f5d   Christoph Hellwig   merge compat_ioct...
1341
1342
1343
1344
  COMPATIBLE_IOCTL(NBD_DO_IT)
  COMPATIBLE_IOCTL(NBD_CLEAR_SOCK)
  COMPATIBLE_IOCTL(NBD_CLEAR_QUE)
  COMPATIBLE_IOCTL(NBD_PRINT_DEBUG)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
1345
1346
1347
1348
1349
1350
1351
1352
  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)
644fd4f5d   Christoph Hellwig   merge compat_ioct...
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
  /* 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)
3fee37c1e   Akos Maroy   fix: using joysti...
1437
1438
1439
1440
1441
  /* joystick */
  COMPATIBLE_IOCTL(JSIOCGVERSION)
  COMPATIBLE_IOCTL(JSIOCGAXES)
  COMPATIBLE_IOCTL(JSIOCGBUTTONS)
  COMPATIBLE_IOCTL(JSIOCGNAME(0))
9c0cbd54c   Christoph Hellwig   [PATCH] TIOC* com...
1442
1443
1444
1445
  #ifdef TIOCGLTC
  COMPATIBLE_IOCTL(TIOCGLTC)
  COMPATIBLE_IOCTL(TIOCSLTC)
  #endif
7a81e3168   Christoph Hellwig   [PATCH] re-add TI...
1446
1447
  #ifdef TIOCSTART
  /*
6070d81eb   Adam Buchbinder   tree-wide: fix mi...
1448
   * For these two we have definitions in ioctls.h and/or termios.h on
7a81e3168   Christoph Hellwig   [PATCH] re-add TI...
1449
1450
1451
1452
1453
1454
1455
   * 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
c6b44d10f   Andi Kleen   [PATCH] Implement...
1456

2724b6db6   Andi Kleen   [PATCH] x86-64: S...
1457
1458
1459
1460
1461
1462
1463
1464
  /* 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)
98701dc19   Geert Uytterhoeven   compat32: ignore ...
1465

8163904e6   David S. Miller   [SPARC]: Mark SBU...
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
  #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
e6a6d2efc   Christoph Hellwig   [PATCH] sanitize ...
1481
  };
6e87abd0b   David S. Miller   [DVB]: Add compat...
1482

5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
  /*
   * Convert common ioctl arguments based on their command number
   *
   * Please do not add any code in here. Instead, implement
   * a compat_ioctl operation in the place that handleѕ the
   * ioctl for the native case.
   */
  static long do_ioctl_trans(int fd, unsigned int cmd,
  		 unsigned long arg, struct file *file)
  {
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1493
  	void __user *argp = compat_ptr(arg);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1494
1495
  	switch (cmd) {
  	case PPPIOCGIDLE32:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1496
  		return ppp_gidle(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1497
  	case PPPIOCSCOMPRESS32:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1498
  		return ppp_scompress(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1499
1500
  	case PPPIOCSPASS32:
  	case PPPIOCSACTIVE32:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1501
  		return ppp_sock_fprog_ioctl_trans(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1502
1503
  #ifdef CONFIG_BLOCK
  	case SG_IO:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1504
  		return sg_ioctl_trans(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1505
  	case SG_GET_REQUEST_TABLE:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1506
  		return sg_grt_trans(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1507
1508
  	case MTIOCGET32:
  	case MTIOCPOS32:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1509
  		return mt_ioctl_trans(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1510
1511
1512
  	/* Raw devices */
  	case RAW_SETBIND:
  	case RAW_GETBIND:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1513
  		return raw_ioctl(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1514
1515
1516
  #endif
  #define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int)
  	case AUTOFS_IOC_SETTIMEOUT32:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1517
  		return ioc_settimeout(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1518
1519
1520
  	/* One SMB ioctl needs translations. */
  #define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, compat_uid_t)
  	case SMB_IOC_GETMOUNTUID_32:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1521
  		return do_smb_getmountuid(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1522
1523
1524
  	/* Serial */
  	case TIOCGSERIAL:
  	case TIOCSSERIAL:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1525
  		return serial_struct_ioctl(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1526
1527
  	/* i2c */
  	case I2C_FUNCS:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1528
  		return w_long(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1529
  	case I2C_RDWR:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1530
  		return do_i2c_rdwr_ioctl(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1531
  	case I2C_SMBUS:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1532
  		return do_i2c_smbus_ioctl(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1533
1534
1535
1536
1537
  	/* Not implemented in the native kernel */
  	case RTC_IRQP_READ32:
  	case RTC_IRQP_SET32:
  	case RTC_EPOCH_READ32:
  	case RTC_EPOCH_SET32:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1538
  		return rtc_ioctl(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1539
1540
1541
  
  	/* dvb */
  	case VIDEO_GET_EVENT:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1542
  		return do_video_get_event(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1543
  	case VIDEO_STILLPICTURE:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1544
  		return do_video_stillpicture(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1545
  	case VIDEO_SET_SPU_PALETTE:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1546
  		return do_video_set_spu_palette(fd, cmd, argp);
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1547
  	}
789f0f891   Arnd Bergmann   compat_ioctl: sim...
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
  
  	/*
  	 * These take an integer instead of a pointer as 'arg',
  	 * so we must not do a compat_ptr() translation.
  	 */
  	switch (cmd) {
  	/* Big T */
  	case TCSBRKP:
  	case TIOCMIWAIT:
  	case TIOCSCTTY:
  	/* RAID */
  	case HOT_REMOVE_DISK:
  	case HOT_ADD_DISK:
  	case SET_DISK_FAULTY:
  	case SET_BITMAP_FILE:
  	/* Big K */
  	case KDSIGACCEPT:
  	case KIOCSOUND:
  	case KDMKTONE:
  	case KDSETMODE:
  	case KDSKBMODE:
  	case KDSKBMETA:
  	case KDSKBLED:
  	case KDSETLED:
789f0f891   Arnd Bergmann   compat_ioctl: sim...
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
  	/* AUTOFS */
  	case AUTOFS_IOC_READY:
  	case AUTOFS_IOC_FAIL:
  	/* NBD */
  	case NBD_SET_SOCK:
  	case NBD_SET_BLKSIZE:
  	case NBD_SET_SIZE:
  	case NBD_SET_SIZE_BLOCKS:
  		return do_vfs_ioctl(file, fd, cmd, arg);
  	}
5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1582
1583
  	return -ENOIOCTLCMD;
  }
6272e2667   Christoph Hellwig   cleanup compat io...
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
  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) {
cf28b4863   Jan Blunck   d_path: Make d_pa...
1594
  		fn = d_path(&filp->f_path, path, PAGE_SIZE);
6272e2667   Christoph Hellwig   cleanup compat io...
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
  		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
  ",
  			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);
  }
661f627da   Arnd Bergmann   compat_ioctl: sim...
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
  static int compat_ioctl_check_table(unsigned int xcmd)
  {
  	int i;
  	const int max = ARRAY_SIZE(ioctl_pointer) - 1;
  
  	BUILD_BUG_ON(max >= (1 << 16));
  
  	/* guess initial offset into table, assuming a
  	   normalized distribution */
  	i = ((xcmd >> 16) * max) >> 16;
  
  	/* do linear search up first, until greater or equal */
  	while (ioctl_pointer[i] < xcmd && i < max)
  		i++;
  
  	/* then do linear search down */
  	while (ioctl_pointer[i] > xcmd && i > 0)
  		i--;
  
  	return ioctl_pointer[i] == xcmd;
  }
6272e2667   Christoph Hellwig   cleanup compat io...
1634
1635
1636
1637
1638
  asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,
  				unsigned long arg)
  {
  	struct file *filp;
  	int error = -EBADF;
6272e2667   Christoph Hellwig   cleanup compat io...
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
  	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;
3e63cbb1e   Ankit Jain   fs: Add new pre-a...
1662
1663
1664
  #if defined(CONFIG_IA64) || defined(CONFIG_X86_64)
  	case FS_IOC_RESVSP_32:
  	case FS_IOC_RESVSP64_32:
43c6e7b97   Arnd Bergmann   compat_ioctl: pas...
1665
  		error = compat_ioctl_preallocate(filp, compat_ptr(arg));
3e63cbb1e   Ankit Jain   fs: Add new pre-a...
1666
1667
1668
1669
  		goto out_fput;
  #else
  	case FS_IOC_RESVSP:
  	case FS_IOC_RESVSP64:
7779d7bed   Heiko Carstens   fs: add missing c...
1670
  		error = ioctl_preallocate(filp, compat_ptr(arg));
3e63cbb1e   Ankit Jain   fs: Add new pre-a...
1671
1672
  		goto out_fput;
  #endif
6272e2667   Christoph Hellwig   cleanup compat io...
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
  	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;
  	}
661f627da   Arnd Bergmann   compat_ioctl: sim...
1692
1693
  	if (compat_ioctl_check_table(XFORM(cmd)))
  		goto found_handler;
6272e2667   Christoph Hellwig   cleanup compat io...
1694

5a07ea0b9   Arnd Bergmann   compat_ioctl: inl...
1695
1696
  	error = do_ioctl_trans(fd, cmd, arg, filp);
  	if (error == -ENOIOCTLCMD) {
6272e2667   Christoph Hellwig   cleanup compat io...
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
  		static int count;
  
  		if (++count <= 50)
  			compat_ioctl_error(filp, fd, cmd, arg);
  		error = -EINVAL;
  	}
  
  	goto out_fput;
  
   found_handler:
789f0f891   Arnd Bergmann   compat_ioctl: sim...
1707
  	arg = (unsigned long)compat_ptr(arg);
6272e2667   Christoph Hellwig   cleanup compat io...
1708
   do_ioctl:
deb21db77   Erez Zadok   VFS: swap do_ioct...
1709
  	error = do_vfs_ioctl(filp, fd, cmd, arg);
6272e2667   Christoph Hellwig   cleanup compat io...
1710
1711
1712
1713
1714
   out_fput:
  	fput_light(filp, fput_needed);
   out:
  	return error;
  }
661f627da   Arnd Bergmann   compat_ioctl: sim...
1715
  static int __init init_sys32_ioctl_cmp(const void *p, const void *q)
6272e2667   Christoph Hellwig   cleanup compat io...
1716
  {
661f627da   Arnd Bergmann   compat_ioctl: sim...
1717
1718
1719
1720
1721
1722
1723
1724
  	unsigned int a, b;
  	a = *(unsigned int *)p;
  	b = *(unsigned int *)q;
  	if (a > b)
  		return 1;
  	if (a < b)
  		return -1;
  	return 0;
6272e2667   Christoph Hellwig   cleanup compat io...
1725
1726
1727
1728
  }
  
  static int __init init_sys32_ioctl(void)
  {
661f627da   Arnd Bergmann   compat_ioctl: sim...
1729
1730
  	sort(ioctl_pointer, ARRAY_SIZE(ioctl_pointer), sizeof(*ioctl_pointer),
  		init_sys32_ioctl_cmp, NULL);
6272e2667   Christoph Hellwig   cleanup compat io...
1731
1732
1733
  	return 0;
  }
  __initcall(init_sys32_ioctl);